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