diff options
Diffstat (limited to 'src/command.rs')
-rw-r--r-- | src/command.rs | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/command.rs b/src/command.rs index c50af30..cd1c8a3 100644 --- a/src/command.rs +++ b/src/command.rs @@ -103,25 +103,26 @@ impl Command { &mut self, pty: &crate::Pty, ) -> crate::Result<async_process::Child> { - let (stdin, stdout, stderr, mut pre_exec) = - crate::sys::setup_subprocess(pty.pts())?; + let pts = pty.pts(); + let (stdin, stdout, stderr) = crate::sys::setup_subprocess(pts)?; self.inner.stdin(self.stdin.take().unwrap_or(stdin)); self.inner.stdout(self.stdout.take().unwrap_or(stdout)); self.inner.stderr(self.stderr.take().unwrap_or(stderr)); + let mut session_leader = crate::sys::session_leader(pts); // Safety: setsid() is an async-signal-safe function and ioctl() is a // raw syscall (which is inherently async-signal-safe). if let Some(mut custom) = self.pre_exec.take() { unsafe { self.inner.pre_exec(move || { - pre_exec()?; + session_leader()?; custom()?; Ok(()) }) }; } else { - unsafe { self.inner.pre_exec(pre_exec) }; + unsafe { self.inner.pre_exec(session_leader) }; } Ok(self.inner.spawn()?) |