kill[all[5]]: code shrink

function                                             old     new   delta
kill_main                                            992     947     -45

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2013-12-16 17:45:44 +01:00
parent 3ac1e0d753
commit 4b26f82c78

View File

@ -60,7 +60,7 @@
* This is needed to avoid collision with kill -9 ... syntax * This is needed to avoid collision with kill -9 ... syntax
*/ */
int kill_main(int argc, char **argv) int kill_main(int argc UNUSED_PARAM, char **argv)
{ {
char *arg; char *arg;
pid_t pid; pid_t pid;
@ -79,10 +79,9 @@ int kill_main(int argc, char **argv)
#endif #endif
/* Parse any options */ /* Parse any options */
argc--;
arg = *++argv; arg = *++argv;
if (argc < 1 || arg[0] != '-') { if (!arg || arg[0] != '-') {
goto do_it_now; goto do_it_now;
} }
@ -91,13 +90,14 @@ int kill_main(int argc, char **argv)
* echo "Died of SIG`kill -l $?`" * echo "Died of SIG`kill -l $?`"
* We try to mimic what kill from coreutils-6.8 does */ * We try to mimic what kill from coreutils-6.8 does */
if (arg[1] == 'l' && arg[2] == '\0') { if (arg[1] == 'l' && arg[2] == '\0') {
if (argc == 1) { arg = *++argv;
if (!arg) {
/* Print the whole signal list */ /* Print the whole signal list */
print_signames(); print_signames();
return 0; return 0;
} }
/* -l <sig list> */ /* -l <sig list> */
while ((arg = *++argv)) { do {
if (isdigit(arg[0])) { if (isdigit(arg[0])) {
signo = bb_strtou(arg, NULL, 10); signo = bb_strtou(arg, NULL, 10);
if (errno) { if (errno) {
@ -118,8 +118,8 @@ int kill_main(int argc, char **argv)
} }
printf("%d\n", signo); printf("%d\n", signo);
} }
} arg = *++argv;
/* If they specified -l, we are all done */ } while (arg);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -127,8 +127,7 @@ int kill_main(int argc, char **argv)
if (killall && arg[1] == 'q' && arg[2] == '\0') { if (killall && arg[1] == 'q' && arg[2] == '\0') {
quiet = 1; quiet = 1;
arg = *++argv; arg = *++argv;
argc--; if (!arg)
if (argc < 1)
bb_show_usage(); bb_show_usage();
if (arg[0] != '-') if (arg[0] != '-')
goto do_it_now; goto do_it_now;
@ -140,8 +139,7 @@ int kill_main(int argc, char **argv)
if (killall5 && arg[0] == 'o') if (killall5 && arg[0] == 'o')
goto do_it_now; goto do_it_now;
if (argc > 1 && arg[0] == 's' && arg[1] == '\0') { /* -s SIG? */ if (argv[1] && arg[0] == 's' && arg[1] == '\0') { /* -s SIG? */
argc--;
arg = *++argv; arg = *++argv;
} /* else it must be -SIG */ } /* else it must be -SIG */
signo = get_signum(arg); signo = get_signum(arg);
@ -150,7 +148,6 @@ int kill_main(int argc, char **argv)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
arg = *++argv; arg = *++argv;
argc--;
do_it_now: do_it_now:
pid = getpid(); pid = getpid();
@ -168,7 +165,7 @@ int kill_main(int argc, char **argv)
kill(-1, SIGSTOP); kill(-1, SIGSTOP);
/* Signal all processes except those in our session */ /* Signal all processes except those in our session */
while ((p = procps_scan(p, PSSCAN_PID|PSSCAN_SID)) != NULL) { while ((p = procps_scan(p, PSSCAN_PID|PSSCAN_SID)) != NULL) {
int i; char **args;
if (p->sid == (unsigned)sid if (p->sid == (unsigned)sid
|| p->sid == 0 /* compat: kernel thread, don't signal it */ || p->sid == 0 /* compat: kernel thread, don't signal it */
@ -180,18 +177,19 @@ int kill_main(int argc, char **argv)
/* All remaining args must be -o PID options. /* All remaining args must be -o PID options.
* Check p->pid against them. */ * Check p->pid against them. */
for (i = 0; i < argc; i++) { args = argv;
while (*args) {
pid_t omit; pid_t omit;
arg = argv[i]; arg = *args++;
if (arg[0] != '-' || arg[1] != 'o') { if (arg[0] != '-' || arg[1] != 'o') {
bb_error_msg("bad option '%s'", arg); bb_error_msg("bad option '%s'", arg);
ret = 1; ret = 1;
goto resume; goto resume;
} }
arg += 2; arg += 2;
if (!arg[0] && argv[++i]) if (!arg[0] && *args)
arg = argv[i]; arg = *args++;
omit = bb_strtoi(arg, NULL, 10); omit = bb_strtoi(arg, NULL, 10);
if (errno) { if (errno) {
bb_error_msg("invalid number '%s'", arg); bb_error_msg("invalid number '%s'", arg);
@ -213,14 +211,14 @@ int kill_main(int argc, char **argv)
} }
/* Pid or name is required for kill/killall */ /* Pid or name is required for kill/killall */
if (argc < 1) { if (!arg) {
bb_error_msg("you need to specify whom to kill"); bb_error_msg("you need to specify whom to kill");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (killall) { if (killall) {
/* Looks like they want to do a killall. Do that */ /* Looks like they want to do a killall. Do that */
while (arg) { do {
pid_t* pidList; pid_t* pidList;
pidList = find_pid_by_name(arg); pidList = find_pid_by_name(arg);
@ -243,7 +241,7 @@ int kill_main(int argc, char **argv)
} }
free(pidList); free(pidList);
arg = *++argv; arg = *++argv;
} } while (arg);
return errors; return errors;
} }