summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-22 22:07:40 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-22 22:07:40 +0200
commitd24ee66bfe323aba7be53aa518da2f51dd90c18f (patch)
treecfc97e775b414b80017088472bb10b21b56ba020
parentcb797b138e96688d7a9ebd77158bd95cad0a5cd3 (diff)
downloadrebel-d24ee66bfe323aba7be53aa518da2f51dd90c18f.tar
rebel-d24ee66bfe323aba7be53aa518da2f51dd90c18f.zip
container: create enum type for submission channel
-rw-r--r--src/runner/container/mod.rs44
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