diff --git a/library/std/src/os/yggdrasil/mod.rs b/library/std/src/os/yggdrasil/mod.rs index abc188407f9..f506d401c8a 100644 --- a/library/std/src/os/yggdrasil/mod.rs +++ b/library/std/src/os/yggdrasil/mod.rs @@ -1,6 +1,7 @@ #![stable(feature = "os", since = "1.0.0")] pub(crate) mod io; +pub mod process; #[unstable(feature = "yggdrasil_raw_fd", issue = "none")] pub mod fd { diff --git a/library/std/src/os/yggdrasil/process.rs b/library/std/src/os/yggdrasil/process.rs new file mode 100644 index 00000000000..b69d884c0aa --- /dev/null +++ b/library/std/src/os/yggdrasil/process.rs @@ -0,0 +1,28 @@ +#![stable(feature = "os", since = "1.0.0")] + +use crate::process::Command; +use crate::sealed::Sealed; +use crate::sys_common::AsInnerMut; +use yggdrasil_rt::io::RawFd; + +#[unstable(feature = "yggdrasil_os", issue = "none")] +pub trait CommandExt: Sealed { + #[unstable(feature = "yggdrasil_os", issue = "none")] + fn process_group(&mut self, pgroup: u32) -> &mut Command; + + #[unstable(feature = "yggdrasil_os", issue = "none")] + unsafe fn gain_terminal>(&mut self, fd: F) -> &mut Command; +} + +#[unstable(feature = "yggdrasil_os", issue = "none")] +impl CommandExt for Command { + fn process_group(&mut self, pgroup: u32) -> &mut Command { + self.as_inner_mut().pgroup = Some(pgroup); + self + } + + unsafe fn gain_terminal>(&mut self, fd: F) -> &mut Command { + self.as_inner_mut().gain_terminal = Some(fd.into()); + self + } +} diff --git a/library/std/src/sys/yggdrasil/process.rs b/library/std/src/sys/yggdrasil/process.rs index c5ef4d2b84f..349ec989060 100644 --- a/library/std/src/sys/yggdrasil/process.rs +++ b/library/std/src/sys/yggdrasil/process.rs @@ -159,6 +159,8 @@ pub struct Command { program: String, args: Vec, env: CommandEnv, + pub(crate) pgroup: Option, + pub(crate) gain_terminal: Option, stdin: Stdio, stdout: Stdio, @@ -175,6 +177,8 @@ impl Command { program, args: vec![], env: Default::default(), + pgroup: None, + gain_terminal: None, stdin: Stdio::Inherit, stdout: Stdio::Inherit, stderr: Stdio::Inherit, @@ -286,6 +290,14 @@ impl Command { }); } + if let Some(pgroup) = self.pgroup { + optional.push(SpawnOption::SetProcessGroup(pgroup)); + } + + if let Some(fd) = self.gain_terminal { + optional.push(SpawnOption::GainTerminal(fd)); + } + let program = self.program.as_str(); let arguments = &Vec::from_iter( crate::iter::once(self.program.as_str())