summary refs log tree commit diff
path: root/src/eval.c
diff options
context:
space:
mode:
authorherbert <herbert@gondor.apana.org.au>2005-02-25 21:15:30 +1100
committerHerbert Xu <herbert@gondor.apana.org.au>2005-09-26 18:33:03 +1000
commit253568ed6557621f24337b775e54a03c7b4300e1 (patch)
tree12c81e98684bfbe993c970b2b5e5615a39618b61 /src/eval.c
parentChanged boolean rootshell into shlvl counter. (diff)
downloaddash-253568ed6557621f24337b775e54a03c7b4300e1.tar.gz
dash-253568ed6557621f24337b775e54a03c7b4300e1.zip
Catch set -e exits within built-in commands.
Diffstat (limited to '')
-rw-r--r--src/eval.c10
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);
 			}