From 2fc9506bc7214b301dfde6ef4f0c07af196f33b9 Mon Sep 17 00:00:00 2001 From: Ian Manske Date: Fri, 14 Jul 2023 18:15:48 +0000 Subject: [PATCH] Fix SIGTTIN handling (#9681) # Description Due to a typo? in the [reference](https://www.gnu.org/software/libc/manual/html_node/Initializing-the-Shell.html) used to implement SIGTTIN handling, nushell will crash when being sent to the background from within another shell. For example, currently in bash: ```bash $ nu -n & [1] 176058 $ ERROR: failed to SIGTTIN ourselves [1]+ Exit 1 nu -n $ ``` Now fixed: ```bash $ nu -n & [1] 178788 $ jobs [1]+ Stopped nu -n $ ``` For further reference, this is how [fish](https://github.com/fish-shell/fish-shell/blob/493cbeb84c9146341790ef563434d47f3b4e0fa5/src/reader.cpp#L2571) does it. # User-Facing Changes Bug fix only -- users should now be able to send nushell to the background. --- src/terminal.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/terminal.rs b/src/terminal.rs index 6d20299fbb..f8d3c777e8 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -59,12 +59,11 @@ fn take_control(interactive: bool) { } } - let mut success = false; for _ in 0..4096 { match unistd::tcgetpgrp(nix::libc::STDIN_FILENO) { Ok(owner_pgid) if owner_pgid == shell_pgid => { - success = true; - break; + // success + return; } Ok(owner_pgid) if owner_pgid == Pid::from_raw(0) => { // Zero basically means something like "not owned" and we can just take it @@ -80,7 +79,7 @@ fn take_control(interactive: bool) { } _ => { // fish also has other heuristics than "too many attempts" for the orphan check, but they're optional - if signal::killpg(Pid::from_raw(-shell_pgid.as_raw()), Signal::SIGTTIN).is_err() { + if signal::killpg(shell_pgid, Signal::SIGTTIN).is_err() { if !interactive { // that's fine return; @@ -91,7 +90,8 @@ fn take_control(interactive: bool) { } } } - if !success && interactive { + + if interactive { eprintln!("ERROR: failed take control of the terminal, we might be orphaned"); std::process::exit(1); }