From 8943d56a46cacaff8ebcd8b514e6dd416be8abe5 Mon Sep 17 00:00:00 2001 From: Jake Hillion Date: Thu, 19 May 2022 18:01:58 +0100 Subject: [PATCH] forwarded necessary fds in spawners --- src/lib.rs | 4 ++++ src/spawner/mod.rs | 14 ++++++++++++++ src/specification.rs | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 5162885..47d03f3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -199,4 +199,8 @@ impl SocketPair { // SAFETY: valid new fd as dup(2) returned successfully Ok(unsafe { File::from_raw_fd(dup_fd) }) } + + fn write_ref(&self) -> &File { + &self.write + } } diff --git a/src/spawner/mod.rs b/src/spawner/mod.rs index 3c81942..26517a7 100644 --- a/src/spawner/mod.rs +++ b/src/spawner/mod.rs @@ -101,6 +101,7 @@ impl<'a> Spawner<'a> { let mut builder = VoidBuilder::new(); self.mount_entrypoint(&mut builder, self.binary)?; self.forward_mounts(&mut builder, &entrypoint.environment, &entrypoint.args); + self.forward_files(&mut builder, &entrypoint.args); let pipe = self.pipes.get_mut(s).unwrap().take_read()?; builder.keep_fd(&pipe); @@ -127,6 +128,7 @@ impl<'a> Spawner<'a> { let mut builder = VoidBuilder::new(); self.mount_entrypoint(&mut builder, self.binary)?; self.forward_mounts(&mut builder, &entrypoint.environment, &entrypoint.args); + self.forward_files(&mut builder, &entrypoint.args); let socket = self.sockets.get_mut(s).unwrap().take_read()?; builder.keep_fd(&socket); @@ -311,6 +313,18 @@ impl<'a> Spawner<'a> { } } + fn forward_files<'b>( + &self, + builder: &mut VoidBuilder, + arguments: impl IntoIterator, + ) { + for arg in arguments { + if let Arg::FileSocket(socket) = arg { + builder.keep_fd(self.sockets.get(socket.get_name()).unwrap().write_ref()); + } + } + } + fn prepare_env<'b>( &self, builder: &mut VoidBuilder, diff --git a/src/specification.rs b/src/specification.rs index 5bd936b..8006e46 100644 --- a/src/specification.rs +++ b/src/specification.rs @@ -99,6 +99,15 @@ pub enum FileSocket { Tx(String), } +impl FileSocket { + pub fn get_name(&self) -> &str { + match self { + FileSocket::Rx(n) => n, + FileSocket::Tx(n) => n, + } + } +} + #[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Debug)] pub enum Environment { Filesystem {