diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 20:19:58 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-26 20:42:55 +0200 |
commit | e2c11da16f401b47feb627571f394a23c9889dbf (patch) | |
tree | eb5613e04e0af0a6773de527ca4eee82953001bc /crates/runner/src/lib.rs | |
parent | 90ba8f28646545b09eed08b120f27cc5f8afd329 (diff) | |
download | rebel-e2c11da16f401b47feb627571f394a23c9889dbf.tar rebel-e2c11da16f401b47feb627571f394a23c9889dbf.zip |
runner: wait for signals using poll()
Diffstat (limited to 'crates/runner/src/lib.rs')
-rw-r--r-- | crates/runner/src/lib.rs | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index 97d8815..51e0e17 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -16,6 +16,7 @@ use std::{ use capctl::prctl; use nix::{ errno::Errno, + poll, sched::CloneFlags, sys::{signal, signalfd::SignalFd, stat, wait}, unistd::{self, Gid, Pid, Uid}, @@ -110,19 +111,31 @@ fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, option .expect("fork()") .0; - loop { - let _signal = sfd.read_signal().expect("read_signal()").unwrap(); - - loop { - let status = match wait::waitpid(Pid::from_raw(-1), Some(wait::WaitPidFlag::WNOHANG)) { - Ok(wait::WaitStatus::StillAlive) | Err(Errno::ECHILD) => break, - res => res.expect("waitpid()"), - }; - let pid = status.pid().unwrap(); + let mut pollfds = [poll::PollFd::new(sfd.as_raw_fd(), poll::PollFlags::POLLIN)]; - if pid == msg_handler { - return; + loop { + poll::poll(&mut pollfds, -1).expect("poll()"); + + let events = pollfds[0] + .revents() + .expect("Unknown events in poll() return"); + if events.contains(poll::PollFlags::POLLIN) { + let _signal = sfd.read_signal().expect("read_signal()").unwrap(); + + loop { + let status = + match wait::waitpid(Pid::from_raw(-1), Some(wait::WaitPidFlag::WNOHANG)) { + Ok(wait::WaitStatus::StillAlive) | Err(Errno::ECHILD) => break, + res => res.expect("waitpid()"), + }; + let pid = status.pid().unwrap(); + + if pid == msg_handler { + return; + } } + } else if events.intersects(!poll::PollFlags::POLLIN) { + panic!("Unexpected error status for signal file descriptor"); } } } |