diff options
Diffstat (limited to 'crates/runner/src')
-rw-r--r-- | crates/runner/src/jobserver.rs | 11 | ||||
-rw-r--r-- | crates/runner/src/lib.rs | 35 | ||||
-rw-r--r-- | crates/runner/src/util/unix.rs | 10 |
3 files changed, 33 insertions, 23 deletions
diff --git a/crates/runner/src/jobserver.rs b/crates/runner/src/jobserver.rs index 3b6c856..d4c670c 100644 --- a/crates/runner/src/jobserver.rs +++ b/crates/runner/src/jobserver.rs @@ -1,4 +1,7 @@ -use std::{os::unix::prelude::RawFd, slice}; +use std::{ + os::{fd::BorrowedFd, unix::prelude::RawFd}, + slice, +}; use nix::{errno::Errno, fcntl::OFlag, poll, unistd}; @@ -27,10 +30,14 @@ impl Jobserver { Ok(Jobserver { tokens, r, w }) } + fn read_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.r) } + } + pub fn wait(&mut self) -> u8 { loop { poll::poll( - &mut [poll::PollFd::new(self.r, poll::PollFlags::POLLIN)], + &mut [poll::PollFd::new(&self.read_fd(), poll::PollFlags::POLLIN)], -1, ) .expect("poll()"); diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index cfaf658..308b54c 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -95,6 +95,10 @@ fn handle_socket(ctx: &mut RunnerContext) -> bool { true } +fn borrow_socket_fd(socket: &UnixSeqpacketConn) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(socket.as_raw_fd()) } +} + fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, options: &Options) -> ! { ns::mount_proc(); ns::setup_userns(Uid::from_raw(0), Gid::from_raw(0), uid, gid); @@ -117,35 +121,36 @@ fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, option signals.add(signal::Signal::SIGCHLD); signal::pthread_sigmask(signal::SigmaskHow::SIG_BLOCK, Some(&signals), None) .expect("pthread_sigmask()"); - let mut sfd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC) + let mut signal_fd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC) .expect("Failed to create signal file descriptor"); - let mut pollfds = [ - poll::PollFd::new(sfd.as_raw_fd(), poll::PollFlags::POLLIN), - poll::PollFd::new(ctx.socket.as_raw_fd(), poll::PollFlags::POLLIN), - ]; - loop { + let socket_fd = borrow_socket_fd(&ctx.socket); + let mut pollfds = [ + poll::PollFd::new(&signal_fd, poll::PollFlags::POLLIN), + poll::PollFd::new(&socket_fd, poll::PollFlags::POLLIN), + ]; poll::poll(&mut pollfds, -1).expect("poll()"); - let events = pollfds[0] + let signal_events = pollfds[0] + .revents() + .expect("Unknown events in poll() return"); + let socket_events = pollfds[1] .revents() .expect("Unknown events in poll() return"); - if events.contains(poll::PollFlags::POLLIN) { - let _signal = sfd.read_signal().expect("read_signal()").unwrap(); + + if signal_events.contains(poll::PollFlags::POLLIN) { + let _signal = signal_fd.read_signal().expect("read_signal()").unwrap(); handle_sigchld(&mut ctx).expect("Task process exited abnormally"); - } else if events.intersects(!poll::PollFlags::POLLIN) { + } else if signal_events.intersects(!poll::PollFlags::POLLIN) { panic!("Unexpected error status for signal file descriptor"); } - let events = pollfds[1] - .revents() - .expect("Unknown events in poll() return"); - if events.contains(poll::PollFlags::POLLIN) { + if socket_events.contains(poll::PollFlags::POLLIN) { if !handle_socket(&mut ctx) { break; } - } else if events.intersects(!poll::PollFlags::POLLIN) { + } else if socket_events.intersects(!poll::PollFlags::POLLIN) { panic!("Unexpected error status for socket file descriptor"); } } diff --git a/crates/runner/src/util/unix.rs b/crates/runner/src/util/unix.rs index 710138c..c3e9ddb 100644 --- a/crates/runner/src/util/unix.rs +++ b/crates/runner/src/util/unix.rs @@ -11,9 +11,8 @@ use common::error::*; use super::fs; pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> { - let flags = unsafe { - OFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?) - }; + let flags = + OFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?); let new_flags = if blocking { flags & !OFlag::O_NONBLOCK @@ -29,9 +28,8 @@ pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> { } pub fn set_cloexec(fd: RawFd, cloexec: bool) -> Result<()> { - let flags = unsafe { - FdFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?) - }; + let flags = + FdFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?); let new_flags = if cloexec { flags | FdFlag::FD_CLOEXEC |