diff options
author | cracauer <cracauer@FreeBSD.org> | 1999-04-01 13:27:36 +0000 |
---|---|---|
committer | cracauer <cracauer@FreeBSD.org> | 1999-04-01 13:27:36 +0000 |
commit | 5610584759a8f26e412dab049cd02e3a33a2d256 (patch) | |
tree | 8e1d1ff2895d740ebfae1a16cedd73afd5ed5078 | |
parent | fa9cc0ebfb3821fac3240755fae227fa654a37f7 (diff) | |
download | FreeBSD-src-5610584759a8f26e412dab049cd02e3a33a2d256.zip FreeBSD-src-5610584759a8f26e412dab049cd02e3a33a2d256.tar.gz |
The immediate execution of traps I introduced in September 1998 (to
make /etc/rc interruptible in cases when programs hang with blocked
signals) isn't standard enough.
It is now switched off by default and a new switch -T enables it.
You should update /etc/rc to the version I'm about to commit in a few
minutes to keep it interruptible.
-rw-r--r-- | bin/sh/eval.c | 5 | ||||
-rw-r--r-- | bin/sh/options.h | 6 | ||||
-rw-r--r-- | bin/sh/sh.1 | 14 | ||||
-rw-r--r-- | bin/sh/trap.c | 5 |
4 files changed, 23 insertions, 7 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c index 427b2bc..8b4fb62f 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -39,7 +39,7 @@ static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; #endif static const char rcsid[] = - "$Id$"; + "$Id: eval.c,v 1.15 1998/05/18 06:43:34 charnier Exp $"; #endif /* not lint */ #include <signal.h> @@ -706,7 +706,8 @@ evalcommand(cmd, flags, backcmd) /* Fork off a child process if necessary. */ if (cmd->ncmd.backgnd - || (cmdentry.cmdtype == CMDNORMAL && (flags & EV_EXIT) == 0) + || (cmdentry.cmdtype == CMDNORMAL + && ((flags & EV_EXIT) == 0 || Tflag)) || ((flags & EV_BACKCMD) != 0 && (cmdentry.cmdtype != CMDBUILTIN || cmdentry.u.index == DOTCMD diff --git a/bin/sh/options.h b/bin/sh/options.h index 28b9819..907cab2 100644 --- a/bin/sh/options.h +++ b/bin/sh/options.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)options.h 8.2 (Berkeley) 5/4/95 - * $Id$ + * $Id: options.h,v 1.7 1997/02/22 13:58:40 peter Exp $ */ struct shparam { @@ -64,8 +64,9 @@ struct shparam { #define bflag optlist[13].val #define uflag optlist[14].val #define privileged optlist[15].val +#define Tflag optlist[16].val -#define NOPTS 16 +#define NOPTS 17 struct optent { const char *name; @@ -91,6 +92,7 @@ struct optent optlist[NOPTS] = { { "notify", 'b', 0 }, { "nounset", 'u', 0 }, { "privileged", 'p', 0 }, + { "trapsasync", 'T', 0 }, }; #else extern struct optent optlist[NOPTS]; diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 61b8aff..d55b9df 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 -.\" $Id: sh.1,v 1.23 1998/12/18 03:51:18 jkoshy Exp $ +.\" $Id: sh.1,v 1.24 1999/03/31 21:02:01 brian Exp $ .\" .Dd May 5, 1995 .Dt SH 1 @@ -202,12 +202,24 @@ after and ignores the contents of the .Ev ENV variable. + .It Fl s Li stdin Read commands from standard input (set automatically if no file arguments are present). This option has no effect when set after the shell has already started running (i.e. with .Xr set 1 Ns ). +.It Fl T Li asynctraps +When waiting for a child, execute traps immediately. If this option is +not set, traps are executed after the child exits, as specified in +.St -p1003.2 +This nonstandard option is useful to put guarding shells around childs +that block signals. The surrounding shell may kill the child or it may +just return control to the tty and leave the child alone, like this: +.Bd -literal -offset indent +sh -T -c "trap 'exit 1' 2 ; some-blocking-program" +.Ed +.Pp .It Fl u Li nounset Write a message to standard error when attempting to expand a variable that is not set, and if the diff --git a/bin/sh/trap.c b/bin/sh/trap.c index fd359fc..429253c 100644 --- a/bin/sh/trap.c +++ b/bin/sh/trap.c @@ -39,7 +39,7 @@ static char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95"; #endif static const char rcsid[] = - "$Id: trap.c,v 1.16 1998/09/10 14:51:06 cracauer Exp $"; + "$Id: trap.c,v 1.17 1998/09/10 22:09:11 cracauer Exp $"; #endif /* not lint */ #include <signal.h> @@ -367,7 +367,8 @@ onsig(signo) * If a trap is set, not ignored and not the null command, we need * to make sure traps are executed even when a child blocks signals. */ - if (trap[signo] != NULL && + if (Tflag && + trap[signo] != NULL && ! trap[signo][0] == '\0' && ! (trap[signo][0] == ':' && trap[signo][1] == '\0')) breakwaitcmd = 1; |