summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/hush.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 9b87e28..80a3992 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1831,7 +1831,10 @@ static void restore_G_args(save_arg_t *sv, char **argv)
* SIGHUP (interactive):
* send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit
//HUP: we don't need to do this, kernel does this for us
-//HUP: ("orphaned process group" handling according to POSIX)
+//HUP: ("orphaned process group" handling according to POSIX).
+//HUP: We still have a SIGHUP handler, just to have tty pgrp restored
+//HUP: (otherwise e.g. Midnight Commander backgrounds when hush
+//HUP: started from it gets killed by SIGHUP).
* SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore
* Note that ^Z is handled not by trapping SIGTSTP, but by seeing
* that all pipe members are stopped. Try this in bash:
@@ -1933,7 +1936,7 @@ enum {
SPECIAL_INTERACTIVE_SIGS = 0
| (1 << SIGTERM)
| (1 << SIGINT)
-//HUP | (1 << SIGHUP)
+ | (1 << SIGHUP)
,
SPECIAL_JOBSTOP_SIGS = 0
#if ENABLE_HUSH_JOB
@@ -2179,7 +2182,7 @@ static int check_and_run_traps(void)
last_sig = sig;
break;
#if ENABLE_HUSH_JOB
-//HUP case SIGHUP: {
+ case SIGHUP: {
//HUP//TODO: why are we doing this? ash and dash don't do this,
//HUP//they have no handler for SIGHUP at all,
//HUP//they rely on kernel to send SIGHUP+SIGCONT to orphaned process groups
@@ -2194,8 +2197,8 @@ static int check_and_run_traps(void)
//HUP if (kill(- job->pgrp, SIGHUP) == 0)
//HUP kill(- job->pgrp, SIGCONT);
//HUP }
-//HUP sigexit(SIGHUP);
-//HUP }
+ sigexit(SIGHUP);
+ }
#endif
#if ENABLE_HUSH_FAST
case SIGCHLD: