From 253568ed6557621f24337b775e54a03c7b4300e1 Mon Sep 17 00:00:00 2001 From: herbert Date: Fri, 25 Feb 2005 21:15:30 +1100 Subject: Catch set -e exits within built-in commands. --- src/eval.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/eval.c') 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); } -- cgit 1.4.1