Preserve Session Terminal TTY through causal launch
This commit is contained in:
parent
2af8a4f09f
commit
39307f4281
1 changed files with 87 additions and 8 deletions
|
|
@ -48,7 +48,7 @@ fn run_session_exec(arguments: &[OsString]) -> io::Result<()> {
|
|||
})
|
||||
.ok_or_else(|| io::Error::other("session exec requires -- and a nonempty argv"))?;
|
||||
let _ = separator;
|
||||
rustix::process::setsid()?;
|
||||
establish_process_group_leader()?;
|
||||
let target = argv[1..]
|
||||
.iter()
|
||||
.cloned()
|
||||
|
|
@ -56,6 +56,26 @@ fn run_session_exec(arguments: &[OsString]) -> io::Result<()> {
|
|||
Err(exec_target(target))
|
||||
}
|
||||
|
||||
fn establish_process_group_leader() -> io::Result<()> {
|
||||
let pid = rustix::process::getpid();
|
||||
if rustix::process::getpgrp() != pid {
|
||||
rustix::process::setsid()?;
|
||||
}
|
||||
require_process_group_leader(pid, rustix::process::getpgrp())
|
||||
}
|
||||
|
||||
fn require_process_group_leader(
|
||||
pid: rustix::process::Pid,
|
||||
process_group: rustix::process::Pid,
|
||||
) -> io::Result<()> {
|
||||
if pid != process_group {
|
||||
return Err(io::Error::other(
|
||||
"session exec is not its process-group leader",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn report_session_identity(arguments: &[OsString]) -> io::Result<()> {
|
||||
match arguments {
|
||||
[pid] => report_process_identity(parse_positive_pid(pid)?),
|
||||
|
|
@ -179,6 +199,14 @@ mod tests {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn process_group_leader_validation_is_fail_closed() {
|
||||
let leader = rustix::process::Pid::from_raw(41).unwrap();
|
||||
let other_group = rustix::process::Pid::from_raw(42).unwrap();
|
||||
require_process_group_leader(leader, leader).unwrap();
|
||||
assert!(require_process_group_leader(leader, other_group).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn group_presence_is_independent_of_a_designated_leader() {
|
||||
let (_, _, group) = read_process_identity(std::process::id()).unwrap().unwrap();
|
||||
|
|
|
|||
Loading…
Reference in a new issue