Skip to content
Snippets Groups Projects
Verified Commit 0ed605d4 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Update daemon to improve reliability

parent 5d52989e
No related branches found
No related tags found
No related merge requests found
......@@ -14,7 +14,7 @@ fn syscall_error(error: syscall::Error) -> io::Error {
io::Error::from_raw_os_error(error.errno)
}
pub fn handle(event_file: &mut File, master_fd: RawFd, process: &mut Child) -> io::Result<ExitStatus> {
pub fn handle(event_file: &mut File, master_fd: RawFd, timeout_fd: RawFd, process: &mut Child) -> io::Result<ExitStatus> {
let handle_event = |event_id: RawFd| -> io::Result<bool> {
if event_id == master_fd {
let mut packet = [0; 4096];
......@@ -30,6 +30,14 @@ pub fn handle(event_file: &mut File, master_fd: RawFd, process: &mut Child) -> i
Pio::<u8>::new(0xe9).write(packet[i]);
}
}
} else if event_id == timeout_fd {
let mut timespec = syscall::TimeSpec::default();
syscall::read(timeout_fd as usize, &mut timespec).map_err(syscall_error)?;
timespec.tv_sec += 1;
syscall::write(timeout_fd as usize, &mut timespec).map_err(syscall_error)?;
Ok(true)
} else {
Err(io::Error::new(
io::ErrorKind::InvalidData,
......@@ -38,14 +46,8 @@ pub fn handle(event_file: &mut File, master_fd: RawFd, process: &mut Child) -> i
}
};
if handle_event(master_fd)? {
if handle_event(master_fd)? && handle_event(timeout_fd)? {
'events: loop {
let mut sys_event = syscall::Event::default();
event_file.read(&mut sys_event)?;
if ! handle_event(sys_event.id as RawFd)? {
break 'events;
}
match process.try_wait() {
Ok(status_opt) => match status_opt {
Some(status) => return Ok(status),
......@@ -56,6 +58,12 @@ pub fn handle(event_file: &mut File, master_fd: RawFd, process: &mut Child) -> i
_ => return Err(err),
}
}
let mut sys_event = syscall::Event::default();
event_file.read(&mut sys_event)?;
if ! handle_event(sys_event.id as RawFd)? {
break 'events;
}
}
}
......@@ -89,6 +97,9 @@ fn inner() -> io::Result<()> {
let (columns, lines) = (DEFAULT_COLS, DEFAULT_LINES);
let (master_fd, pty) = getpty(columns, lines)?;
let timeout_fd = syscall::open("time:4", syscall::O_CLOEXEC | syscall::O_RDWR | syscall::O_NONBLOCK)
.map_err(syscall_error)? as RawFd;
let mut event_file = OpenOptions::new()
.read(true)
.write(true)
......@@ -100,6 +111,12 @@ fn inner() -> io::Result<()> {
data: 0
})?;
event_file.write(&syscall::Event {
id: timeout_fd as usize,
flags: syscall::flag::EVENT_READ,
data: 0
})?;
let slave_stdin = OpenOptions::new().read(true).open(&pty)?;
let slave_stdout = OpenOptions::new().write(true).open(&pty)?;
let slave_stderr = OpenOptions::new().write(true).open(&pty)?;
......@@ -121,7 +138,7 @@ fn inner() -> io::Result<()> {
}
let mut process = command.spawn()?;
let status = handle(&mut event_file, master_fd, &mut process)?;
let status = handle(&mut event_file, master_fd, timeout_fd, &mut process)?;
if status.success() {
Ok(())
} else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment