diff options
author | herbert <herbert@gondor.apana.org.au> | 2005-02-25 21:15:30 +1100 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2005-09-26 18:33:03 +1000 |
commit | 253568ed6557621f24337b775e54a03c7b4300e1 (patch) | |
tree | 12c81e98684bfbe993c970b2b5e5615a39618b61 /src/eval.c | |
parent | Changed boolean rootshell into shlvl counter. (diff) | |
download | dash-253568ed6557621f24337b775e54a03c7b4300e1.tar.gz dash-253568ed6557621f24337b775e54a03c7b4300e1.zip |
Catch set -e exits within built-in commands.
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/eval.c b/src/eval.c index d1bf317..f7f0aeb 100644 --- a/src/eval.c +++ b/src/eval.c @@ -73,6 +73,7 @@ __RCSID("$NetBSD: eval.c,v 1.71 2003/01/23 03:33:16 rafal Exp $"); #include "error.h" #include "show.h" #include "mystring.h" +#include "main.h" #ifndef SMALL #include "myhistedit.h" #endif @@ -322,8 +323,10 @@ setstatus: out: if (pendingsigs) dotrap(); - if (flags & EV_EXIT || checkexit & exitstatus) + if (flags & EV_EXIT) exraise(EXEXIT); + if (checkexit & exitstatus) + exraise(EXEVAL); } @@ -708,12 +711,14 @@ evalcommand(union node *cmd, int flags) int spclbltin; int execcmd; int status; + int oldlvl; char **nargv; /* First expand the arguments. */ TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); setstackmark(&smark); back_exitstatus = 0; + oldlvl = shlvl; cmdentry.cmdtype = CMDBUILTIN; cmdentry.u.cmd = &bltin; @@ -880,7 +885,8 @@ bail: status = j + 128; exitstatus = status; - if (i == EXINT || spclbltin > 0) { + if (i == EXINT || (i != EXEVAL && spclbltin > 0) || + oldlvl != shlvl) { raise: longjmp(handler->loc, 1); } |