From 240642399b352f8eb0129b95a8d0a4df1cd6c62c Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Wed, 16 Mar 2011 12:02:04 -0400 Subject: [PATCH] Save the controlling tty process group before suspending so we can restore it when we resume. Fixes job control problems on Linux caused by the previous attemp to fix resuming a shell when I/O logging not enabled. --- src/exec.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/exec.c b/src/exec.c index 2cda3c9e8..510ce1134 100644 --- a/src/exec.c +++ b/src/exec.c @@ -444,9 +444,21 @@ handle_signals(int fd, pid_t child, int log_io, struct command_status *cstat) /* If not logging I/O and child has exited we are done. */ if (!log_io) { if (WIFSTOPPED(status)) { - /* Child may not have privs to suspend us itself. */ + /* + * Save the controlling terminal's process group + * so we can restore it after we resume. + */ + pid_t saved_pgrp = (pid_t)-1; + int fd = open(_PATH_TTY, O_RDWR|O_NOCTTY, 0); + if (fd != -1) + saved_pgrp = tcgetpgrp(fd); if (kill(getpid(), WSTOPSIG(status)) != 0) warning("kill(%d, %d)", getpid(), WSTOPSIG(status)); + if (fd != -1) { + if (saved_pgrp != (pid_t)-1) + (void)tcsetpgrp(fd, saved_pgrp); + close(fd); + } } else { /* Child has exited, we are done. */ cstat->type = CMD_WSTATUS; @@ -462,24 +474,10 @@ handle_signals(int fd, pid_t child, int log_io, struct command_status *cstat) schedule_signal(signo); } else { /* Nothing listening on sv[0], send directly. */ - if (signo == SIGALRM) { + if (signo == SIGALRM) terminate_child(child, FALSE); - } else { - if (signo == SIGCONT) { - /* - * Before continuing the child, make it the foreground - * pgrp if possible. Fixes resuming a shell. - */ - int fd = open(_PATH_TTY, O_RDWR|O_NOCTTY, 0); - if (fd != -1) { - if (tcgetpgrp(fd) == getpgrp()) - (void)tcsetpgrp(fd, child); - close(fd); - } - } - if (kill(child, signo) != 0) - warning("kill(%d, %d)", child, signo); - } + else if (kill(child, signo) != 0) + warning("kill(%d, %d)", child, signo); } } } -- 2.40.0