hush: fix kill builtin without jobs support
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 9 Jan 2017 04:47:57 +0000 (05:47 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 9 Jan 2017 04:47:57 +0000 (05:47 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c

index 01c334a466909dbca57163a785e4d6e69d59880d..247ad7aabb77a20aa88fa84c55b89878af7cbfdf 100644 (file)
@@ -9443,7 +9443,7 @@ static struct pipe *parse_jobspec(const char *str)
                        return pi;
                }
        }
-       bb_error_msg("%d: no such job", jobnum);
+       bb_error_msg("%u: no such job", jobnum);
        return NULL;
 }
 
@@ -9691,9 +9691,9 @@ static int FAST_FUNC builtin_kill(char **argv)
 {
        int ret = 0;
 
-       argv = skip_dash_dash(argv);
-       if (argv[0] && strcmp(argv[0], "-l") != 0) {
-               int i = 0;
+# if ENABLE_HUSH_JOB
+       if (argv[1] && strcmp(argv[1], "-l") != 0) {
+               int i = 1;
 
                do {
                        struct pipe *pi;
@@ -9735,12 +9735,9 @@ static int FAST_FUNC builtin_kill(char **argv)
                                n = 1;
                        dst = alloca(n * sizeof(int)*4);
                        argv[i] = dst;
-#if ENABLE_HUSH_JOB
                        if (G_interactive_fd)
                                dst += sprintf(dst, " -%u", (int)pi->pgrp);
-                       else
-#endif
-                       for (j = 0; j < n; j++) {
+                       else for (j = 0; j < n; j++) {
                                struct command *cmd = &pi->cmds[j];
                                /* Skip exited members of the job */
                                if (cmd->pid == 0)
@@ -9755,13 +9752,12 @@ static int FAST_FUNC builtin_kill(char **argv)
                        *dst = '\0';
                } while (argv[++i]);
        }
+# endif
 
-       if (argv[0] || ret == 0) {
-               argv--;
-               argv[0] = (char*)"kill"; /* why? think about "kill -- PID" */
-               /* kill_main also handles "killall" etc, so it does look at argv[0]! */
+       if (argv[1] || ret == 0) {
                ret = run_applet_main(argv, kill_main);
        }
+       /* else: ret = 1, "kill %bad_jobspec" case */
        return ret;
 }
 #endif