aboutsummaryrefslogtreecommitdiffstats
path: root/src/sys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys.rs')
-rw-r--r--src/sys.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/sys.rs b/src/sys.rs
index 0d897bc..36d87c1 100644
--- a/src/sys.rs
+++ b/src/sys.rs
@@ -76,6 +76,32 @@ pub fn session_leader(
}
}
+pub fn set_process_group_child(
+ pg: Option<u32>,
+) -> impl FnMut() -> std::io::Result<()> {
+ move || {
+ nix::unistd::setpgid(
+ nix::unistd::Pid::from_raw(0),
+ pg.map_or(nix::unistd::Pid::from_raw(0), |pid| {
+ nix::unistd::Pid::from_raw(pid.try_into().unwrap())
+ }),
+ )?;
+ Ok(())
+ }
+}
+
+pub fn set_process_group_parent(
+ pid: u32,
+ pg: Option<u32>,
+) -> nix::Result<()> {
+ nix::unistd::setpgid(
+ nix::unistd::Pid::from_raw(pid.try_into().unwrap()),
+ pg.map_or(nix::unistd::Pid::from_raw(0), |pid| {
+ nix::unistd::Pid::from_raw(pid.try_into().unwrap())
+ }),
+ )
+}
+
fn set_controlling_terminal(fd: std::os::unix::io::RawFd) -> nix::Result<()> {
// Safety: std::fs::File is required to contain a valid file descriptor
unsafe { set_controlling_terminal_unsafe(fd, std::ptr::null()) }