Module Name:    src
Committed By:   bouyer
Date:           Sun Nov 15 17:41:26 UTC 2015

Modified Files:
        src/bin/sh [netbsd-6]: jobs.c trap.c trap.h

Log Message:
Pull up following revision(s) (requested by christos in ticket #1323):
        bin/sh/jobs.c: revision 1.74
        bin/sh/jobs.c: revision 1.75
        bin/sh/trap.c: revision 1.36
        bin/sh/trap.c: revision 1.37
        bin/sh/trap.h: revision 1.21
        bin/sh/trap.h: revision 1.22
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
report the signal that wait was interrupted by, which is not always SIGINT
anymore.


To generate a diff of this commit:
cvs rdiff -u -r1.69.4.1 -r1.69.4.2 src/bin/sh/jobs.c
cvs rdiff -u -r1.35 -r1.35.4.1 src/bin/sh/trap.c
cvs rdiff -u -r1.19 -r1.19.4.1 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.69.4.1 src/bin/sh/jobs.c:1.69.4.2
--- src/bin/sh/jobs.c:1.69.4.1	Sun Dec  7 15:58:27 2014
+++ src/bin/sh/jobs.c	Sun Nov 15 17:41:26 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: jobs.c,v 1.69.4.1 2014/12/07 15:58:27 martin Exp $	*/
+/*	$NetBSD: jobs.c,v 1.69.4.2 2015/11/15 17:41:26 bouyer 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.69.4.1 2014/12/07 15:58:27 martin Exp $");
+__RCSID("$NetBSD: jobs.c,v 1.69.4.2 2015/11/15 17:41:26 bouyer Exp $");
 #endif
 #endif /* not lint */
 
@@ -619,7 +619,7 @@ waitcmd(int argc, char **argv)
 				continue;
 			}
 			if (dowait(WBLOCK, NULL) == -1)
-			       return 128 + SIGINT;
+			       return 128 + lastsig();
 			jp = jobtab;
 		}
 	}
@@ -634,7 +634,7 @@ waitcmd(int argc, char **argv)
 		/* loop until process terminated or stopped */
 		while (job->state == JOBRUNNING) {
 			if (dowait(WBLOCK|WNOFREE, job) == -1)
-			       return 128 + SIGINT;
+			       return 128 + lastsig();
 		}
 		status = job->ps[job->nprocs ? job->nprocs - 1 : 0].status;
 		if (WIFEXITED(status))
@@ -1042,13 +1042,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.35.4.1
--- src/bin/sh/trap.c:1.35	Sat Jun 18 21:18:46 2011
+++ src/bin/sh/trap.c	Sun Nov 15 17:41:26 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $	*/
+/*	$NetBSD: trap.c,v 1.35.4.1 2015/11/15 17:41:26 bouyer 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.35.4.1 2015/11/15 17:41:26 bouyer 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 *);
 
@@ -421,7 +421,16 @@ done:
 	pendingsigs = 0;
 }
 
+int
+lastsig(void)
+{
+	int i;
 
+	for (i = NSIG; i > 0; i--)
+		if (gotsig[i - 1])
+			return i;
+	return SIGINT;	/* XXX */
+}
 
 /*
  * Controls whether the shell is interactive or not.

Index: src/bin/sh/trap.h
diff -u src/bin/sh/trap.h:1.19 src/bin/sh/trap.h:1.19.4.1
--- src/bin/sh/trap.h:1.19	Sat Jun 18 21:18:46 2011
+++ src/bin/sh/trap.h	Sun Nov 15 17:41:26 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.h,v 1.19 2011/06/18 21:18:46 christos Exp $	*/
+/*	$NetBSD: trap.h,v 1.19.4.1 2015/11/15 17:41:26 bouyer 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);
@@ -43,3 +43,4 @@ void onsig(int);
 void dotrap(void);
 void setinteractive(int);
 void exitshell(int) __attribute__((__noreturn__));
+int lastsig(void);

Reply via email to