aboutsummaryrefslogtreecommitdiff
path: root/src/tokio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tokio.rs')
-rw-r--r--src/tokio.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/tokio.rs b/src/tokio.rs
new file mode 100644
index 0000000..78979bf
--- /dev/null
+++ b/src/tokio.rs
@@ -0,0 +1,42 @@
+use std::os::unix::prelude::RawFd;
+
+use tokio::process::Command;
+use tokio_crate as tokio;
+
+use crate::{map_fds, preserve_fds, validate_child_fds, FdMapping, FdMappingCollision};
+
+/// Extension to add file descriptor mappings to a [`Command`].
+pub trait CommandFdAsyncExt {
+ /// Adds the given set of file descriptors to the command.
+ ///
+ /// Warning: Calling this more than once on the same command, or attempting to run the same
+ /// command more than once after calling this, may result in unexpected behaviour.
+ fn fd_mappings(&mut self, mappings: Vec<FdMapping>) -> Result<&mut Self, FdMappingCollision>;
+
+ /// Adds the given set of file descriptors to be passed on to the child process when the command
+ /// is run.
+ fn preserved_fds(&mut self, fds: Vec<RawFd>) -> &mut Self;
+}
+
+impl CommandFdAsyncExt for Command {
+ fn fd_mappings(
+ &mut self,
+ mut mappings: Vec<FdMapping>,
+ ) -> Result<&mut Self, FdMappingCollision> {
+ let child_fds = validate_child_fds(&mappings)?;
+
+ unsafe {
+ self.pre_exec(move || map_fds(&mut mappings, &child_fds));
+ }
+
+ Ok(self)
+ }
+
+ fn preserved_fds(&mut self, fds: Vec<RawFd>) -> &mut Self {
+ unsafe {
+ self.pre_exec(move || preserve_fds(&fds));
+ }
+
+ self
+ }
+}