summaryrefslogtreecommitdiffstats
path: root/crates/runner/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/runner/src')
-rw-r--r--crates/runner/src/jobserver.rs11
-rw-r--r--crates/runner/src/lib.rs35
-rw-r--r--crates/runner/src/util/unix.rs10
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