svn commit: r247206 - in head: bin/sh tools/regression/bin/sh/builtins
Jilles Tjoelker
jilles at FreeBSD.org
Sat Feb 23 22:50:59 UTC 2013
Author: jilles
Date: Sat Feb 23 22:50:57 2013
New Revision: 247206
URL: http://svnweb.freebsd.org/changeset/base/247206
Log:
sh: If a SIGINT or SIGQUIT interrupts "wait", return status 128+sig.
Added:
head/tools/regression/bin/sh/builtins/wait4.0 (contents, props changed)
head/tools/regression/bin/sh/builtins/wait5.0 (contents, props changed)
Modified:
head/bin/sh/eval.c
head/bin/sh/jobs.c
head/bin/sh/main.c
head/bin/sh/trap.c
head/bin/sh/trap.h
Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c Sat Feb 23 22:48:12 2013 (r247205)
+++ head/bin/sh/eval.c Sat Feb 23 22:50:57 2013 (r247206)
@@ -301,7 +301,7 @@ evaltree(union node *n, int flags)
} while (n != NULL);
out:
popstackmark(&smark);
- if (pendingsigs)
+ if (pendingsig)
dotrap();
if (eflag && exitstatus != 0 && do_etest)
exitshell(exitstatus);
Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c Sat Feb 23 22:48:12 2013 (r247205)
+++ head/bin/sh/jobs.c Sat Feb 23 22:50:57 2013 (r247206)
@@ -521,7 +521,7 @@ waitcmd(int argc, char **argv)
} while (dowait(DOWAIT_BLOCK | DOWAIT_SIG, (struct job *)NULL) != -1);
in_waitcmd--;
- return 0;
+ return pendingsig + 128;
}
Modified: head/bin/sh/main.c
==============================================================================
--- head/bin/sh/main.c Sat Feb 23 22:48:12 2013 (r247205)
+++ head/bin/sh/main.c Sat Feb 23 22:50:57 2013 (r247206)
@@ -196,7 +196,7 @@ cmdloop(int top)
TRACE(("cmdloop(%d) called\n", top));
setstackmark(&smark);
for (;;) {
- if (pendingsigs)
+ if (pendingsig)
dotrap();
inter = 0;
if (iflag && top) {
Modified: head/bin/sh/trap.c
==============================================================================
--- head/bin/sh/trap.c Sat Feb 23 22:48:12 2013 (r247205)
+++ head/bin/sh/trap.c Sat Feb 23 22:50:57 2013 (r247206)
@@ -73,7 +73,7 @@ __FBSDID("$FreeBSD$");
MKINIT char sigmode[NSIG]; /* current value of signal */
-int pendingsigs; /* indicates some signal received */
+volatile sig_atomic_t pendingsig; /* indicates some signal received */
int in_dotrap; /* do we execute in a trap handler? */
static char *volatile trap[NSIG]; /* trap handler commands */
static volatile sig_atomic_t gotsig[NSIG];
@@ -388,22 +388,25 @@ onsig(int signo)
return;
}
- if (signo != SIGCHLD || !ignore_sigchld)
- gotsig[signo] = 1;
- pendingsigs++;
-
/* If we are currently in a wait builtin, prepare to break it */
- if ((signo == SIGINT || signo == SIGQUIT) && in_waitcmd != 0)
- breakwaitcmd = 1;
- /*
- * If a trap is set, not ignored and not the null command, we need
- * to make sure traps are executed even when a child blocks signals.
- */
- if (Tflag &&
- trap[signo] != NULL &&
- ! (trap[signo][0] == '\0') &&
- ! (trap[signo][0] == ':' && trap[signo][1] == '\0'))
+ if ((signo == SIGINT || signo == SIGQUIT) && in_waitcmd != 0) {
breakwaitcmd = 1;
+ pendingsig = signo;
+ }
+
+ if (trap[signo] != NULL && trap[signo][0] != '\0' &&
+ (signo != SIGCHLD || !ignore_sigchld)) {
+ gotsig[signo] = 1;
+ pendingsig = signo;
+
+ /*
+ * If a trap is set, not ignored and not the null command, we
+ * need to make sure traps are executed even when a child
+ * blocks signals.
+ */
+ if (Tflag && !(trap[signo][0] == ':' && trap[signo][1] == '\0'))
+ breakwaitcmd = 1;
+ }
#ifndef NO_HISTORY
if (signo == SIGWINCH)
@@ -424,7 +427,7 @@ dotrap(void)
in_dotrap++;
for (;;) {
- pendingsigs = 0;
+ pendingsig = 0;
for (i = 1; i < NSIG; i++) {
if (gotsig[i]) {
gotsig[i] = 0;
Modified: head/bin/sh/trap.h
==============================================================================
--- head/bin/sh/trap.h Sat Feb 23 22:48:12 2013 (r247205)
+++ head/bin/sh/trap.h Sat Feb 23 22:50:57 2013 (r247206)
@@ -33,7 +33,7 @@
* $FreeBSD$
*/
-extern int pendingsigs;
+extern volatile sig_atomic_t pendingsig;
extern int in_dotrap;
extern volatile sig_atomic_t gotwinch;
Added: head/tools/regression/bin/sh/builtins/wait4.0
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/wait4.0 Sat Feb 23 22:50:57 2013 (r247206)
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+T=`mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX`
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+trapped=
+trap trapped=1 QUIT
+{ kill -QUIT $$; sleep 1; exit 4; } >fifo1 &
+wait $! <fifo1
+r=$?
+[ "$r" -gt 128 ] && [ -n "$trapped" ]
Added: head/tools/regression/bin/sh/builtins/wait5.0
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/wait5.0 Sat Feb 23 22:50:57 2013 (r247206)
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+T=`mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX`
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+trapped=
+trap trapped=1 QUIT
+{ kill -QUIT $$; sleep 1; exit 4; } >fifo1 &
+wait <fifo1
+r=$?
+[ "$r" -gt 128 ] && [ -n "$trapped" ]
More information about the svn-src-head
mailing list