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);

Reply via email to