diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-12 21:31:32 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-12 21:31:32 +0200 |
commit | 6c149f4d9afaed9edb75c88b784ad900c1f40700 (patch) | |
tree | 1cf5c3800fa0e87fb8f30cee951eaa65a54378a6 | |
parent | e139ae307e4fd9eb3b86a6fc2e97b4e212925199 (diff) | |
download | busybox-6c149f4d9afaed9edb75c88b784ad900c1f40700.tar.gz |
ash: implement "exec -a ARGV0 CMD ARGV1..."
function old new delta
execcmd 71 112 +41
shellexec 221 224 +3
evalcommand 1158 1161 +3
localcmd 364 366 +2
unaliascmd 163 154 -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/1 up/down: 49/-9) Total: 40 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/shell/ash.c b/shell/ash.c index 044f166be..e170bec2a 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -3345,11 +3345,9 @@ unaliascmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) { int i; - while ((i = nextopt("a")) != '\0') { - if (i == 'a') { - rmaliases(); - return 0; - } + while (nextopt("a") != '\0') { + rmaliases(); + return 0; } for (i = 0; *argptr; argptr++) { if (unalias(*argptr)) { @@ -9354,7 +9352,14 @@ truecmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) static int FAST_FUNC execcmd(int argc UNUSED_PARAM, char **argv) { - if (argv[1]) { + optionarg = NULL; + while (nextopt("a:") != '\0') + /* nextopt() sets optionarg to "-a ARGV0" */; + + argv = argptr; + if (argv[0]) { + char *prog; + iflag = 0; /* exit on error */ mflag = 0; optschanged(); @@ -9370,7 +9375,10 @@ execcmd(int argc UNUSED_PARAM, char **argv) /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */ /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */ - shellexec(argv[1], argv + 1, pathval(), 0); + prog = argv[0]; + if (optionarg) + argv[0] = optionarg; + shellexec(prog, argv, pathval(), 0); /* NOTREACHED */ } return 0; |