aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2023-02-13 10:01:35 +0000
committerRon Yorston <rmy@pobox.com>2023-02-13 10:01:35 +0000
commit4e5fb4341fddc2b99e815f27ac577d85a57994c2 (patch)
treec9e2eae6d2752d7e7f907ad39e3797b0fd5c3e02 /shell
parent0f2feac4b7e518e838b80d7b8ceac8f9699ae997 (diff)
parent93ae7464e6e460f25b73e4ffefd2d9a6499eae30 (diff)
downloadbusybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.tar.gz
busybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.tar.bz2
busybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.zip
Merge branch 'busybox' into merge
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c3
-rw-r--r--shell/hush.c51
2 files changed, 37 insertions, 17 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 87190c453..94eb49d79 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -11769,7 +11769,8 @@ preadfd(void)
11769 again: 11769 again:
11770 /* For shell, LI_INTERRUPTIBLE is set: 11770 /* For shell, LI_INTERRUPTIBLE is set:
11771 * read_line_input will abort on either 11771 * read_line_input will abort on either
11772 * getting EINTR in poll(), or if it sees bb_got_signal != 0 11772 * getting EINTR in poll() and bb_got_signal became != 0,
11773 * or if it sees bb_got_signal != 0
11773 * (IOW: if signal arrives before poll() is reached). 11774 * (IOW: if signal arrives before poll() is reached).
11774 * Interactive testcases: 11775 * Interactive testcases:
11775 * (while kill -INT $$; do sleep 1; done) & 11776 * (while kill -INT $$; do sleep 1; done) &
diff --git a/shell/hush.c b/shell/hush.c
index d111f0cc5..e6be70078 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1829,7 +1829,13 @@ static void restore_G_args(save_arg_t *sv, char **argv)
1829 * SIGQUIT: ignore 1829 * SIGQUIT: ignore
1830 * SIGTERM (interactive): ignore 1830 * SIGTERM (interactive): ignore
1831 * SIGHUP (interactive): 1831 * SIGHUP (interactive):
1832 * send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit 1832 * Send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit.
1833 * Kernel would do this for us ("orphaned process group" handling
1834 * according to POSIX) if we are a session leader and thus our death
1835 * frees the controlling tty, but to be bash-compatible, we also do it
1836 * for every interactive shell's death by SIGHUP.
1837 * (Also, we need to restore tty pgrp, otherwise e.g. Midnight Commander
1838 * backgrounds when hush started from it gets killed by SIGHUP).
1833 * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore 1839 * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore
1834 * Note that ^Z is handled not by trapping SIGTSTP, but by seeing 1840 * Note that ^Z is handled not by trapping SIGTSTP, but by seeing
1835 * that all pipe members are stopped. Try this in bash: 1841 * that all pipe members are stopped. Try this in bash:
@@ -1946,7 +1952,12 @@ static void record_pending_signo(int sig)
1946{ 1952{
1947 sigaddset(&G.pending_set, sig); 1953 sigaddset(&G.pending_set, sig);
1948#if ENABLE_FEATURE_EDITING 1954#if ENABLE_FEATURE_EDITING
1949 bb_got_signal = sig; /* for read_line_input: "we got a signal" */ 1955 if (sig != SIGCHLD
1956 || (G_traps && G_traps[SIGCHLD] && G_traps[SIGCHLD][0])
1957 /* ^^^ if SIGCHLD, interrupt line reading only if it has a trap */
1958 ) {
1959 bb_got_signal = sig; /* for read_line_input: "we got a signal" */
1960 }
1950#endif 1961#endif
1951#if ENABLE_HUSH_FAST 1962#if ENABLE_HUSH_FAST
1952 if (sig == SIGCHLD) { 1963 if (sig == SIGCHLD) {
@@ -2173,20 +2184,27 @@ static int check_and_run_traps(void)
2173 break; 2184 break;
2174#if ENABLE_HUSH_JOB 2185#if ENABLE_HUSH_JOB
2175 case SIGHUP: { 2186 case SIGHUP: {
2176//TODO: why are we doing this? ash and dash don't do this, 2187 /* if (G_interactive_fd) - no need to check, the handler
2177//they have no handler for SIGHUP at all, 2188 * is only installed if we *are* interactive */
2178//they rely on kernel to send SIGHUP+SIGCONT to orphaned process groups 2189 {
2179 struct pipe *job; 2190 /* bash compat: "Before exiting, an interactive
2180 debug_printf_exec("%s: sig:%d default SIGHUP handler\n", __func__, sig); 2191 * shell resends the SIGHUP to all jobs, running
2181 /* bash is observed to signal whole process groups, 2192 * or stopped. Stopped jobs are sent SIGCONT
2182 * not individual processes */ 2193 * to ensure that they receive the SIGHUP."
2183 for (job = G.job_list; job; job = job->next) { 2194 */
2184 if (job->pgrp <= 0) 2195 struct pipe *job;
2185 continue; 2196 debug_printf_exec("%s: sig:%d default SIGHUP handler\n", __func__, sig);
2186 debug_printf_exec("HUPing pgrp %d\n", job->pgrp); 2197 /* bash is observed to signal whole process groups,
2187 if (kill(- job->pgrp, SIGHUP) == 0) 2198 * not individual processes */
2188 kill(- job->pgrp, SIGCONT); 2199 for (job = G.job_list; job; job = job->next) {
2200 if (job->pgrp <= 0)
2201 continue;
2202 debug_printf_exec("HUPing pgrp %d\n", job->pgrp);
2203 if (kill(- job->pgrp, SIGHUP) == 0)
2204 kill(- job->pgrp, SIGCONT);
2205 }
2189 } 2206 }
2207 /* this restores tty pgrp, then kills us with SIGHUP */
2190 sigexit(SIGHUP); 2208 sigexit(SIGHUP);
2191 } 2209 }
2192#endif 2210#endif
@@ -2669,7 +2687,8 @@ static int get_user_input(struct in_str *i)
2669 } else { 2687 } else {
2670 /* For shell, LI_INTERRUPTIBLE is set: 2688 /* For shell, LI_INTERRUPTIBLE is set:
2671 * read_line_input will abort on either 2689 * read_line_input will abort on either
2672 * getting EINTR in poll(), or if it sees bb_got_signal != 0 2690 * getting EINTR in poll() and bb_got_signal became != 0,
2691 * or if it sees bb_got_signal != 0
2673 * (IOW: if signal arrives before poll() is reached). 2692 * (IOW: if signal arrives before poll() is reached).
2674 * Interactive testcases: 2693 * Interactive testcases:
2675 * (while kill -INT $$; do sleep 1; done) & 2694 * (while kill -INT $$; do sleep 1; done) &