summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2002-12-04 13:57:48 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2002-12-04 13:57:48 +0000
commit28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9 (patch)
tree114fbfdf69dc40dd86a029573f22b86ead2dfe81 /Src/exec.c
parent252da01c87086db05083be7e66804e28fcf50c89 (diff)
downloadzsh-28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9.tar.gz
zsh-28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9.zip
17979: Add ERR_RETURN option.
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/Src/exec.c b/Src/exec.c
index ca7b2061f..76ca437f4 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -924,13 +924,23 @@ sublist_done:
dotrap(SIGZERR);
donetrap = 1;
}
- if (lastval && isset(ERREXIT)) {
- if (sigtrapped[SIGEXIT])
- dotrap(SIGEXIT);
- if (mypid != getpid())
- _exit(lastval);
- else
- exit(lastval);
+ if (lastval) {
+ int errreturn = isset(ERRRETURN) &&
+ (isset(INTERACTIVE) || locallevel || sourcelevel);
+ int errexit = isset(ERREXIT) ||
+ (isset(ERRRETURN) && !errreturn);
+ if (errexit) {
+ if (sigtrapped[SIGEXIT])
+ dotrap(SIGEXIT);
+ if (mypid != getpid())
+ _exit(lastval);
+ else
+ exit(lastval);
+ }
+ if (errreturn) {
+ retflag = 1;
+ breaks = loops;
+ }
}
}
if (ltype & Z_END)