diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-25 17:24:25 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-25 17:24:25 +0200 |
commit | 061a09091f21f8e2d3ac61cb1a5f8c919ddce26e (patch) | |
tree | 855cbdc5b7a1b404b623f7a86ee2c7ea97e5a00e | |
parent | b7adf7ac32e65906932935daf3d7a02d94818e09 (diff) | |
download | busybox-w32-061a09091f21f8e2d3ac61cb1a5f8c919ddce26e.tar.gz busybox-w32-061a09091f21f8e2d3ac61cb1a5f8c919ddce26e.tar.bz2 busybox-w32-061a09091f21f8e2d3ac61cb1a5f8c919ddce26e.zip |
ash: [BUILTIN] Use EXEXIT in place of EXEXEC
Upstream commit:
Date: Sun, 28 Nov 2010 20:44:37 +0800
[BUILTIN] Use EXEXIT in place of EXEXEC
The intended semantics of EXEXEC are identical to EXEXIT, so
simplify by using EXEXIT directly.
Functional change: in edge cases (exec within a trap handler),
this causes the exit status from exec not to be clobbered.
For example, without this patch:
$ sh -c 'trap "exec nonexistent" EXIT'; echo $?
exec: 1: nonexistent: not found
0
And with it:
$ sh -c 'trap "exec nonexistent" EXIT'; echo $?
exec: 1: nonexistent: not found
127
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c index 9798a9675..29d1d57ca 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -302,7 +302,6 @@ struct globals_misc { | |||
302 | #define EXINT 0 /* SIGINT received */ | 302 | #define EXINT 0 /* SIGINT received */ |
303 | #define EXERROR 1 /* a generic error */ | 303 | #define EXERROR 1 /* a generic error */ |
304 | #define EXSHELLPROC 2 /* execute a shell procedure */ | 304 | #define EXSHELLPROC 2 /* execute a shell procedure */ |
305 | #define EXEXEC 3 /* command execution failed */ | ||
306 | #define EXEXIT 4 /* exit the shell */ | 305 | #define EXEXIT 4 /* exit the shell */ |
307 | #define EXSIG 5 /* trapped signal in wait(1) */ | 306 | #define EXSIG 5 /* trapped signal in wait(1) */ |
308 | 307 | ||
@@ -7618,7 +7617,7 @@ shellexec(char **argv, const char *path, int idx) | |||
7618 | exitstatus = exerrno; | 7617 | exitstatus = exerrno; |
7619 | TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n", | 7618 | TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n", |
7620 | argv[0], e, suppress_int)); | 7619 | argv[0], e, suppress_int)); |
7621 | ash_msg_and_raise(EXEXEC, "%s: %s", argv[0], errmsg(e, "not found")); | 7620 | ash_msg_and_raise(EXEXIT, "%s: %s", argv[0], errmsg(e, "not found")); |
7622 | /* NOTREACHED */ | 7621 | /* NOTREACHED */ |
7623 | } | 7622 | } |
7624 | 7623 | ||
@@ -9635,7 +9634,7 @@ evalcommand(union node *cmd, int flags) | |||
9635 | if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) { | 9634 | if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) { |
9636 | int exit_status; | 9635 | int exit_status; |
9637 | int i = exception_type; | 9636 | int i = exception_type; |
9638 | if (i == EXEXIT || i == EXEXEC) | 9637 | if (i == EXEXIT) |
9639 | goto raise; | 9638 | goto raise; |
9640 | exit_status = 2; | 9639 | exit_status = 2; |
9641 | if (i == EXINT) | 9640 | if (i == EXINT) |