diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-22 22:07:40 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-22 22:07:40 +0200 |
commit | d24ee66bfe323aba7be53aa518da2f51dd90c18f (patch) | |
tree | cfc97e775b414b80017088472bb10b21b56ba020 | |
parent | cb797b138e96688d7a9ebd77158bd95cad0a5cd3 (diff) | |
download | rebel-d24ee66bfe323aba7be53aa518da2f51dd90c18f.tar rebel-d24ee66bfe323aba7be53aa518da2f51dd90c18f.zip |
container: create enum type for submission channel
-rw-r--r-- | src/runner/container/mod.rs | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/src/runner/container/mod.rs b/src/runner/container/mod.rs index 7a9e388..f27fe00 100644 --- a/src/runner/container/mod.rs +++ b/src/runner/container/mod.rs @@ -20,9 +20,11 @@ use crate::{ }; #[derive(Debug, Deserialize, Serialize)] -struct Request(runner::Task, ipc::IpcSender<Result<runner::TaskOutput>>); +enum Message { + Request(runner::Task, ipc::IpcSender<Result<runner::TaskOutput>>), +} -fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Request>) -> ! { +fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Message>) -> ! { ns::mount_proc(); ns::setup_userns(Uid::from_raw(0), Gid::from_raw(0), uid, gid); @@ -32,21 +34,25 @@ fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Request>) -> ! { unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigIgn) }.unwrap(); - while let Ok(request) = channel.recv() { - match unsafe { unistd::fork() }.expect("fork()") { - unistd::ForkResult::Parent { .. } => {} - unistd::ForkResult::Child => { - drop(channel); - unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigDfl) } - .unwrap(); - - let Request(task, reply_sender) = request; - - prctl::set_name(&task.label).expect("prctl(PR_SET_NAME)"); - - let result = task::handle(task); - reply_sender.send(result).expect("IPC send() failed"); - process::exit(0); + while let Ok(msg) = channel.recv() { + match msg { + Message::Request(task, reply_sender) => { + match unsafe { unistd::fork() }.expect("fork()") { + unistd::ForkResult::Parent { .. } => {} + unistd::ForkResult::Child => { + drop(channel); + unsafe { + signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigDfl) + } + .unwrap(); + + prctl::set_name(&task.label).expect("prctl(PR_SET_NAME)"); + + let result = task::handle(task); + reply_sender.send(result).expect("IPC send() failed"); + process::exit(0); + } + } } } } @@ -55,7 +61,7 @@ fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Request>) -> ! { } pub struct ContainerRunner { - channel: ipc::IpcSender<Request>, + channel: ipc::IpcSender<Message>, } impl ContainerRunner { @@ -88,7 +94,7 @@ impl super::Runner for ContainerRunner { let (reply_tx, reply_rx) = ipc::channel().expect("IPC channel creation failed"); self.channel - .send(Request(task.clone(), reply_tx)) + .send(Message::Request(task.clone(), reply_tx)) .expect("ContainerRunner task submission failed"); reply_rx |