aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/fallback.rs5
-rw-r--r--src/platform/linux.rs19
-rw-r--r--src/platform/macos.rs20
3 files changed, 44 insertions, 0 deletions
diff --git a/src/platform/fallback.rs b/src/platform/fallback.rs
index 825aaccd..a8f9d8ce 100644
--- a/src/platform/fallback.rs
+++ b/src/platform/fallback.rs
@@ -8,6 +8,11 @@ pub fn foreground_job(_child_pid: u32) -> Option<ForegroundJob> {
}
/// Unsupported platform stub.
+pub fn foreground_group_leader_job(_process_group_id: u32) -> Option<ForegroundJob> {
+ None
+}
+
+/// Unsupported platform stub.
pub fn foreground_process_group_id(_child_pid: u32) -> Option<u32> {
None
}
diff --git a/src/platform/linux.rs b/src/platform/linux.rs
index 73a4f0a5..00f4b906 100644
--- a/src/platform/linux.rs
+++ b/src/platform/linux.rs
@@ -54,6 +54,25 @@ pub fn foreground_job(child_pid: u32) -> Option<ForegroundJob> {
})
}
+pub fn foreground_group_leader_job(process_group_id: u32) -> Option<ForegroundJob> {
+ let (pgrp, name) = process_pgrp_and_comm(process_group_id)?;
+ if pgrp as u32 != process_group_id {
+ return None;
+ }
+
+ let argv = process_argv(process_group_id);
+ Some(ForegroundJob {
+ process_group_id,
+ processes: vec![ForegroundProcess {
+ pid: process_group_id,
+ name,
+ argv0: None,
+ cmdline: argv.as_ref().map(|parts| parts.join(" ")),
+ argv,
+ }],
+ })
+}
+
pub fn foreground_process_group_id(child_pid: u32) -> Option<u32> {
// /proc/<pid>/stat format: "pid (comm) state ppid pgrp session tty_nr tpgid ..."
// The (comm) field can contain spaces and parens, so we find the last ')' first.
diff --git a/src/platform/macos.rs b/src/platform/macos.rs
index bfce664a..354a6b3c 100644
--- a/src/platform/macos.rs
+++ b/src/platform/macos.rs
@@ -52,6 +52,26 @@ pub fn foreground_job(child_pid: u32) -> Option<ForegroundJob> {
})
}
+pub fn foreground_group_leader_job(process_group_id: u32) -> Option<ForegroundJob> {
+ let info = process_bsdinfo(process_group_id)?;
+ if info.pbi_pgid != process_group_id {
+ return None;
+ }
+
+ let name = comm_from_bsdinfo(&info)?;
+ let argv = process_argv(process_group_id);
+ Some(ForegroundJob {
+ process_group_id,
+ processes: vec![ForegroundProcess {
+ pid: process_group_id,
+ name,
+ argv0: process_argv0_name(process_group_id),
+ cmdline: argv.as_ref().map(|parts| parts.join(" ")),
+ argv,
+ }],
+ })
+}
+
fn process_group_pids(process_group_id: u32) -> Vec<u32> {
let mut capacity = 16usize;