From acb3681ee251599af194c8555344edc65750ef14 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 22 Feb 2021 22:47:20 -0500 Subject: remove a bit more duplication --- src/command.rs | 11 ++++++++--- src/command/async_process.rs | 9 ++------- src/command/std.rs | 9 ++------- src/command/tokio.rs | 9 ++------- 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/command.rs b/src/command.rs index ca4a67b..0b53626 100644 --- a/src/command.rs +++ b/src/command.rs @@ -34,7 +34,8 @@ where let pts_fd = pts.as_raw_fd(); self.std_fds(stdin, stdout, stderr); - self.pre_exec_impl(move || { + + let pre_exec = move || { nix::unistd::setsid().map_err(|e| e.as_errno().unwrap())?; set_controlling_terminal(pts_fd) .map_err(|e| e.as_errno().unwrap())?; @@ -56,7 +57,11 @@ where nix::unistd::close(stderr).map_err(|e| e.as_errno().unwrap())?; Ok(()) - }); + }; + // safe because setsid() and close() are async-signal-safe functions + // and ioctl() is a raw syscall (which is inherently + // async-signal-safe). + unsafe { self.pre_exec_impl(pre_exec) }; let child = self.spawn_impl().map_err(Error::Spawn)?; @@ -103,7 +108,7 @@ pub trait CommandImpl { stdout: ::std::os::unix::io::RawFd, stderr: ::std::os::unix::io::RawFd, ); - fn pre_exec_impl(&mut self, f: F) + unsafe fn pre_exec_impl(&mut self, f: F) where F: FnMut() -> ::std::io::Result<()> + Send + Sync + 'static; fn spawn_impl(&mut self) -> ::std::io::Result; diff --git a/src/command/async_process.rs b/src/command/async_process.rs index 0b5ceda..4c453e6 100644 --- a/src/command/async_process.rs +++ b/src/command/async_process.rs @@ -19,16 +19,11 @@ impl super::CommandImpl for async_process::Command { .stderr(unsafe { std::process::Stdio::from_raw_fd(stderr) }); } - fn pre_exec_impl(&mut self, f: F) + unsafe fn pre_exec_impl(&mut self, f: F) where F: FnMut() -> ::std::io::Result<()> + Send + Sync + 'static, { - // safe because setsid() and close() are async-signal-safe functions - // and ioctl() is a raw syscall (which is inherently - // async-signal-safe). - unsafe { - self.pre_exec(f); - } + self.pre_exec(f); } fn spawn_impl(&mut self) -> ::std::io::Result { diff --git a/src/command/std.rs b/src/command/std.rs index b331fc0..3287834 100644 --- a/src/command/std.rs +++ b/src/command/std.rs @@ -19,16 +19,11 @@ impl super::CommandImpl for std::process::Command { .stderr(unsafe { std::process::Stdio::from_raw_fd(stderr) }); } - fn pre_exec_impl(&mut self, f: F) + unsafe fn pre_exec_impl(&mut self, f: F) where F: FnMut() -> ::std::io::Result<()> + Send + Sync + 'static, { - // safe because setsid() and close() are async-signal-safe functions - // and ioctl() is a raw syscall (which is inherently - // async-signal-safe). - unsafe { - self.pre_exec(f); - } + self.pre_exec(f); } fn spawn_impl(&mut self) -> ::std::io::Result { diff --git a/src/command/tokio.rs b/src/command/tokio.rs index 338bc08..60dfb56 100644 --- a/src/command/tokio.rs +++ b/src/command/tokio.rs @@ -18,16 +18,11 @@ impl super::CommandImpl for tokio::process::Command { .stderr(unsafe { std::process::Stdio::from_raw_fd(stderr) }); } - fn pre_exec_impl(&mut self, f: F) + unsafe fn pre_exec_impl(&mut self, f: F) where F: FnMut() -> ::std::io::Result<()> + Send + Sync + 'static, { - // safe because setsid() and close() are async-signal-safe functions - // and ioctl() is a raw syscall (which is inherently - // async-signal-safe). - unsafe { - self.pre_exec(f); - } + self.pre_exec(f); } fn spawn_impl(&mut self) -> ::std::io::Result { -- cgit v1.2.3