ash: implement "exec -a ARGV0 CMD ARGV1..."
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Apr 2017 19:31:32 +0000 (21:31 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Apr 2017 19:31:32 +0000 (21:31 +0200)
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>
shell/ash.c

index 044f166be3a4bd3d7d3cdf8653151adc713e74a8..e170bec2ac29a2338d4ad59a44e4b6c149460fe3 100644 (file)
@@ -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;