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