Module Name: src
Committed By: riz
Date: Wed Nov 4 17:58:38 UTC 2015
Modified Files:
src/bin/sh [netbsd-7]: jobs.c trap.c trap.h
Log Message:
Pull up following revision(s) (requested by christos in ticket #964):
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.73 -r1.73.2.1 src/bin/sh/jobs.c
cvs rdiff -u -r1.35 -r1.35.22.1 src/bin/sh/trap.c
cvs rdiff -u -r1.20 -r1.20.12.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.73 src/bin/sh/jobs.c:1.73.2.1
--- src/bin/sh/jobs.c:1.73 Fri Apr 11 01:49:45 2014
+++ src/bin/sh/jobs.c Wed Nov 4 17:58:38 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: jobs.c,v 1.73 2014/04/11 01:49:45 christos Exp $ */
+/* $NetBSD: jobs.c,v 1.73.2.1 2015/11/04 17:58:38 riz 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.73.2.1 2015/11/04 17:58:38 riz Exp $");
#endif
#endif /* not lint */
@@ -632,7 +632,7 @@ waitcmd(int argc, char **argv)
continue;
}
if (dowait(WBLOCK, NULL) == -1)
- return 128 + SIGINT;
+ return 128 + lastsig();
jp = jobtab;
}
}
@@ -647,7 +647,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))
@@ -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.35.22.1
--- src/bin/sh/trap.c:1.35 Sat Jun 18 21:18:46 2011
+++ src/bin/sh/trap.c Wed Nov 4 17:58:38 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.22.1 2015/11/04 17:58:38 riz 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.22.1 2015/11/04 17:58:38 riz 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.20 src/bin/sh/trap.h:1.20.12.1
--- src/bin/sh/trap.h:1.20 Thu Mar 15 02:02:20 2012
+++ src/bin/sh/trap.h Wed Nov 4 17:58:38 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.h,v 1.20 2012/03/15 02:02:20 joerg Exp $ */
+/* $NetBSD: trap.h,v 1.20.12.1 2015/11/04 17:58:38 riz 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) __dead;
+int lastsig(void);