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.rs29
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 {