diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/error.c | 2 | ||||
-rw-r--r-- | src/eval.c | 6 | ||||
-rw-r--r-- | src/main.c | 2 |
4 files changed, 7 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 76cbeb4..e5479a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ 2010-11-28 Herbert Xu <herbert@gondor.apana.org.au> * Fixed trap/return regression due to SKIPEVAL removal. + * Allow the originator of EXERROR to set the exit status. 2010-10-18 Herbert Xu <herbert@gondor.apana.org.au> diff --git a/src/error.c b/src/error.c index e304d3d..f1a358d 100644 --- a/src/error.c +++ b/src/error.c @@ -163,6 +163,8 @@ sh_error(const char *msg, ...) { va_list ap; + exitstatus = 2; + va_start(ap, msg); exverror(EXERROR, msg, ap); /* NOTREACHED */ diff --git a/src/eval.c b/src/eval.c index ea4afc6..013a8dd 100644 --- a/src/eval.c +++ b/src/eval.c @@ -823,11 +823,13 @@ evalcommand(union node *cmd, int flags) } if (status) { +bail: + exitstatus = status; + /* We have a redirection error. */ if (spclbltin > 0) exraise(EXERROR); -bail: - exitstatus = status; + goto out; } diff --git a/src/main.c b/src/main.c index 2bff956..1735c67 100644 --- a/src/main.c +++ b/src/main.c @@ -113,8 +113,6 @@ main(int argc, char **argv) reset(); e = exception; - if (e == EXERROR) - exitstatus = 2; s = state; if (e == EXEXIT || s == 0 || iflag == 0 || shlvl) |