diff options
Diffstat (limited to 'crates/runner/src/lib.rs')
-rw-r--r-- | crates/runner/src/lib.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index 8066c58..636c112 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -11,7 +11,7 @@ use std::{ fs::File, net, os::unix::{net::UnixStream, prelude::*}, - slice, + process, slice, }; use capctl::prctl; @@ -55,7 +55,7 @@ fn handle_sigchld(ctx: &mut RunnerContext) -> Result<()> { } fn handle_request(ctx: &mut RunnerContext, request_socket: UnixStream) { - let run = |()| { + let run = || { ctx.socket.steal(); let task: Task = @@ -68,7 +68,7 @@ fn handle_request(ctx: &mut RunnerContext, request_socket: UnixStream) { drop(request_socket); }; - let pid = unsafe { clone::spawn(None, (), run) }.expect("fork()").0; + let pid = unsafe { clone::spawn(None, run) }.expect("fork()"); assert!(ctx.tasks.insert(pid)); } @@ -91,7 +91,7 @@ fn handle_socket(ctx: &mut RunnerContext) -> bool { true } -fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, options: &Options) { +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); @@ -144,6 +144,8 @@ fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, option panic!("Unexpected error status for socket file descriptor"); } } + + process::exit(0); } pub struct Runner { @@ -165,18 +167,17 @@ impl Runner { let (local, remote) = UnixSeqpacketConn::pair().expect("socketpair()"); - let (local, _remote) = clone::spawn( - Some(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWNS | CloneFlags::CLONE_NEWPID), - (local, remote), - |(local, remote)| { - drop(local); - runner(uid, gid, remote, lockfile, options); - }, + match clone::clone( + CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWNS | CloneFlags::CLONE_NEWPID, ) .expect("clone()") - .1; - - Ok(Runner { socket: local }) + { + unistd::ForkResult::Parent { .. } => Ok(Runner { socket: local }), + unistd::ForkResult::Child => { + drop(local); + runner(uid, gid, remote, lockfile, options); + } + } } pub fn spawn(&self, task: &Task) -> UnixStream { |