Module Name: src
Committed By: christos
Date: Sat Aug 22 09:55:23 UTC 2015
Modified Files:
src/bin/sh: jobs.c trap.c trap.h
Log Message:
Process pending signals while waiting for a job:
$ cat << EOF > hup.sh
#!/bin/sh
trap 'echo SIGHUP; exit 1' 1
sleep 10000 &
wait
EOF
$ chmod +x ./hup.sh
$ ./hup.sh &
$ kill -HUP %1
To generate a diff of this commit:
cvs rdiff -u -r1.73 -r1.74 src/bin/sh/jobs.c
cvs rdiff -u -r1.35 -r1.36 src/bin/sh/trap.c
cvs rdiff -u -r1.20 -r1.21 src/bin/sh/trap.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/bin/sh/jobs.c
diff -u src/bin/sh/jobs.c:1.73 src/bin/sh/jobs.c:1.74
--- src/bin/sh/jobs.c:1.73 Thu Apr 10 21:49:45 2014
+++ src/bin/sh/jobs.c Sat Aug 22 05:55:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: jobs.c,v 1.73 2014/04/11 01:49:45 christos Exp $ */
+/* $NetBSD: jobs.c,v 1.74 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)jobs.c 8.5 (Berkeley) 5/4/95";
#else
-__RCSID("$NetBSD: jobs.c,v 1.73 2014/04/11 01:49:45 christos Exp $");
+__RCSID("$NetBSD: jobs.c,v 1.74 2015/08/22 09:55:23 christos Exp $");
#endif
#endif /* not lint */
@@ -1058,13 +1058,12 @@ dowait(int flags, struct job *job)
struct job *thisjob;
int done;
int stopped;
- extern volatile char gotsig[];
TRACE(("dowait(%x) called\n", flags));
do {
pid = waitproc(flags & WBLOCK, job, &status);
TRACE(("wait returns pid %d, status %d\n", pid, status));
- } while (pid == -1 && errno == EINTR && gotsig[SIGINT - 1] == 0);
+ } while (pid == -1 && errno == EINTR && pendingsigs == 0);
if (pid <= 0)
return pid;
INTOFF;
Index: src/bin/sh/trap.c
diff -u src/bin/sh/trap.c:1.35 src/bin/sh/trap.c:1.36
--- src/bin/sh/trap.c:1.35 Sat Jun 18 17:18:46 2011
+++ src/bin/sh/trap.c Sat Aug 22 05:55:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $ */
+/* $NetBSD: trap.c,v 1.36 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95";
#else
-__RCSID("$NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $");
+__RCSID("$NetBSD: trap.c,v 1.36 2015/08/22 09:55:23 christos Exp $");
#endif
#endif /* not lint */
@@ -77,8 +77,8 @@ __RCSID("$NetBSD: trap.c,v 1.35 2011/06/
char *trap[NSIG+1]; /* trap handler commands */
MKINIT char sigmode[NSIG]; /* current value of signal */
-volatile char gotsig[NSIG]; /* indicates specified signal received */
-int pendingsigs; /* indicates some signal received */
+static volatile char gotsig[NSIG];/* indicates specified signal received */
+volatile int pendingsigs; /* indicates some signal received */
static int getsigaction(int, sig_t *);
Index: src/bin/sh/trap.h
diff -u src/bin/sh/trap.h:1.20 src/bin/sh/trap.h:1.21
--- src/bin/sh/trap.h:1.20 Wed Mar 14 22:02:20 2012
+++ src/bin/sh/trap.h Sat Aug 22 05:55:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.h,v 1.20 2012/03/15 02:02:20 joerg Exp $ */
+/* $NetBSD: trap.h,v 1.21 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -34,7 +34,7 @@
* @(#)trap.h 8.3 (Berkeley) 6/5/95
*/
-extern int pendingsigs;
+extern volatile int pendingsigs;
void clear_traps(int);
sig_t setsignal(int, int);