#![allow(dead_code)]
use std::io::Read;
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use base::RawDescriptor;
use base::Result;
use devices::serial_device::SerialParameters;
use devices::serial_device::SerialType;
use devices::BusDevice;
use devices::Serial;
use jail::FakeMinijailStub as Minijail;
use sync::Mutex;
use crate::DeviceRegistrationError;
pub enum SerialInput {
#[doc(hidden)]
Local(Arc<Mutex<Serial>>),
}
impl SerialInput {
pub fn new_local(serial: Arc<Mutex<Serial>>) -> SerialInput {
SerialInput::Local(serial)
}
pub fn queue_input_bytes(&self, bytes: &[u8]) -> Result<()> {
match self {
SerialInput::Local(device) => device.lock().queue_input_bytes(bytes),
}
}
}
pub fn add_serial_device(
com: Serial,
serial_params: &SerialParameters,
serial_jail: Option<Minijail>,
_preserved_descriptors: Vec<RawDescriptor>,
) -> std::result::Result<Arc<Mutex<dyn BusDevice>>, DeviceRegistrationError> {
assert!(serial_jail.is_none());
let com = Arc::new(Mutex::new(com));
if !serial_params.stdin {
if let SerialType::SystemSerialType = serial_params.type_ {
let mut in_pipe_result = com
.lock()
.system_params
.in_stream
.as_ref()
.unwrap()
.try_clone();
let com = com.clone();
thread::spawn(move || {
let serial_input = SerialInput::new_local(com);
let in_pipe = in_pipe_result.as_mut().unwrap();
let mut buffer: [u8; 255] = [0; 255];
loop {
let bytes = in_pipe.read(&mut buffer).unwrap_or(0);
if bytes > 0 {
serial_input.queue_input_bytes(&buffer[0..bytes]).unwrap();
}
thread::sleep(Duration::from_millis(20));
}
});
}
}
Ok(com)
}