From e2c11da16f401b47feb627571f394a23c9889dbf Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 26 Oct 2021 20:19:58 +0200 Subject: runner: wait for signals using poll() --- crates/runner/src/lib.rs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'crates/runner') 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"); } } } -- cgit v1.2.3