diff options
Diffstat (limited to 'crates/runner/src/lib.rs')
-rw-r--r-- | crates/runner/src/lib.rs | 35 |
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"); } } |