summaryrefslogtreecommitdiffstats
path: root/crates/runner
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 20:19:58 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-26 20:42:55 +0200
commite2c11da16f401b47feb627571f394a23c9889dbf (patch)
treeeb5613e04e0af0a6773de527ca4eee82953001bc /crates/runner
parent90ba8f28646545b09eed08b120f27cc5f8afd329 (diff)
downloadrebel-e2c11da16f401b47feb627571f394a23c9889dbf.tar
rebel-e2c11da16f401b47feb627571f394a23c9889dbf.zip
runner: wait for signals using poll()
Diffstat (limited to 'crates/runner')
-rw-r--r--crates/runner/src/lib.rs35
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");
}
}
}