diff --git a/src/main.rs b/src/main.rs index 4385a2e..8735090 100644 --- a/src/main.rs +++ b/src/main.rs @@ -115,7 +115,7 @@ fn main() -> ExitCode { } else if let Some(cmd) = args.command { exec_input(cmd, None, false, None) } else { - shed_interactive() + shed_interactive(args) } { eprintln!("shed: {e}"); }; @@ -160,9 +160,9 @@ fn run_script>(path: P, args: Vec) -> ShResult<()> { exec_input(input, None, false, Some(path_raw)) } -fn shed_interactive() -> ShResult<()> { +fn shed_interactive(args: ShedArgs) -> ShResult<()> { let _raw_mode = raw_mode(); // sets raw mode, restores termios on drop - sig_setup(); + sig_setup(args.login_shell); if let Err(e) = source_rc() { e.print_error(); diff --git a/src/signal.rs b/src/signal.rs index b468c6e..abd5ab1 100644 --- a/src/signal.rs +++ b/src/signal.rs @@ -108,7 +108,7 @@ pub fn enable_reaping() { REAPING_ENABLED.store(true, Ordering::SeqCst); } -pub fn sig_setup() { +pub fn sig_setup(is_login: bool) { let flags = SaFlags::empty(); let action = SigAction::new(SigHandler::Handler(handle_signal), flags, SigSet::empty()); @@ -147,6 +147,12 @@ pub fn sig_setup() { sigaction(Signal::SIGPWR, &action).unwrap(); sigaction(Signal::SIGSYS, &action).unwrap(); } + + + if is_login { + setpgid(0, 0); + take_term().ok(); + } } /// Reset all signal dispositions to SIG_DFL.