forwarded necessary fds in spawners #39

Merged
JakeHillion merged 1 commits from forward-fds into main 2022-05-19 21:58:53 +01:00
3 changed files with 27 additions and 0 deletions
Showing only changes of commit 8943d56a46 - Show all commits

View File

@ -199,4 +199,8 @@ impl SocketPair {
// SAFETY: valid new fd as dup(2) returned successfully // SAFETY: valid new fd as dup(2) returned successfully
Ok(unsafe { File::from_raw_fd(dup_fd) }) Ok(unsafe { File::from_raw_fd(dup_fd) })
} }
fn write_ref(&self) -> &File {
&self.write
}
} }

View File

@ -101,6 +101,7 @@ impl<'a> Spawner<'a> {
let mut builder = VoidBuilder::new(); let mut builder = VoidBuilder::new();
self.mount_entrypoint(&mut builder, self.binary)?; self.mount_entrypoint(&mut builder, self.binary)?;
self.forward_mounts(&mut builder, &entrypoint.environment, &entrypoint.args); 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()?; let pipe = self.pipes.get_mut(s).unwrap().take_read()?;
builder.keep_fd(&pipe); builder.keep_fd(&pipe);
@ -127,6 +128,7 @@ impl<'a> Spawner<'a> {
let mut builder = VoidBuilder::new(); let mut builder = VoidBuilder::new();
self.mount_entrypoint(&mut builder, self.binary)?; self.mount_entrypoint(&mut builder, self.binary)?;
self.forward_mounts(&mut builder, &entrypoint.environment, &entrypoint.args); 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()?; let socket = self.sockets.get_mut(s).unwrap().take_read()?;
builder.keep_fd(&socket); builder.keep_fd(&socket);
@ -311,6 +313,18 @@ impl<'a> Spawner<'a> {
} }
} }
fn forward_files<'b>(
&self,
builder: &mut VoidBuilder,
arguments: impl IntoIterator<Item = &'b Arg>,
) {
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>( fn prepare_env<'b>(
&self, &self,
builder: &mut VoidBuilder, builder: &mut VoidBuilder,

View File

@ -99,6 +99,15 @@ pub enum FileSocket {
Tx(String), 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)] #[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Debug)]
pub enum Environment { pub enum Environment {
Filesystem { Filesystem {