aboutsummaryrefslogtreecommitdiffstats
path: root/src/command.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command.rs')
-rw-r--r--src/command.rs9
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()?)