summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/runner/src/lib.rs')
-rw-r--r--crates/runner/src/lib.rs35
1 files changed, 20 insertions, 15 deletions
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");
}
}