diff options
author | Denis Vlasenko | 2006-09-27 14:19:16 +0000 |
---|---|---|
committer | Denis Vlasenko | 2006-09-27 14:19:16 +0000 |
commit | a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e (patch) | |
tree | 3ad369f8468a397c6731ccd5c1631e1bc33612d6 /procps/kill.c | |
parent | be905d550c96da8c75d697842ba4169a62d05190 (diff) | |
download | busybox-a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e.zip busybox-a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e.tar.gz |
kill: fix bugs (kill -l output was horrible), fix style, constify data
Diffstat (limited to 'procps/kill.c')
-rw-r--r-- | procps/kill.c | 111 |
1 files changed, 56 insertions, 55 deletions
diff --git a/procps/kill.c b/procps/kill.c index b7a2985..654467a 100644 --- a/procps/kill.c +++ b/procps/kill.c @@ -12,118 +12,119 @@ int kill_main(int argc, char **argv) { - int killall, signo = SIGTERM, errors = 0, quiet=0; + char *arg; + int killall, signo = SIGTERM, errors = 0, quiet = 0; killall = (ENABLE_KILLALL && bb_applet_name[4]=='a') ? 1 : 0; /* Parse any options */ - if (argc < 2) + argc--; + arg = *++argv; + if (argc<1) bb_show_usage(); - if(argv[1][0] != '-'){ - argv++; - argc--; + if (arg[0]!='-') { goto do_it_now; } /* The -l option, which prints out signal names. */ - if(argv[1][1]=='l' && argv[1][2]=='\0'){ - if(argc==2) { + if (arg[1]=='l' && arg[2]=='\0') { + const char *name; + if (argc==1) { /* Print the whole signal list */ int col = 0; - - for(signo = 0;;) { - char *name = get_signame(++signo); - if (isdigit(*name)) break; - - if (col > 60) { - printf("\n"); + for (signo = 1; signo<32; signo++) { + name = get_signame(signo); + if (isdigit(name[0])) continue; + if (col > 66) { + puts(""); col = 0; } - col += printf("%2d) %-16s", signo, name); + col += printf("%2d) %-6s", signo, name); } - printf("\n"); - } else { - for(argv++; *argv; argv++) { - char *name; - - if (isdigit(**argv)) name = get_signame(atoi(*argv)); - else { - int temp = get_signum(*argv); - if (temp<0) - bb_error_msg_and_die("unknown signal %s", *argv); - name = get_signame(temp); + puts(""); + } else { /* -l <sig list> */ + while ((arg = *++argv)!=NULL) { + if (isdigit(arg[0])) { + signo = atoi(arg); + name = get_signame(signo); + } else { + signo = get_signum(arg); + if (signo<0) + bb_error_msg_and_die("unknown signal '%s'", arg); + name = get_signame(signo); } - puts(name); + printf("%2d) %s\n", signo, name); } } - /* If they specified -l, were all done */ + /* If they specified -l, we are all done */ return EXIT_SUCCESS; } /* The -q quiet option */ - if(killall && argv[1][1]=='q' && argv[1][2]=='\0'){ - quiet++; - argv++; + if (killall && arg[1]=='q' && arg[2]=='\0') { + quiet = 1; + arg = *++argv; argc--; - if(argc<2 || argv[1][0] != '-'){ - goto do_it_now; - } + if (argc<1) bb_show_usage(); + if (arg[0]!='-') goto do_it_now; } - if(0>(signo = get_signum(argv[1]+1))) - bb_error_msg_and_die( "bad signal name '%s'", argv[1]+1); - argv+=2; - argc-=2; + /* -SIG */ + signo = get_signum(&arg[1]); + if (signo<0) + bb_error_msg_and_die("bad signal name '%s'", &arg[1]); + arg = *++argv; + argc--; do_it_now: /* Pid or name required */ - if (argc <= 0) + if (argc<1) bb_show_usage(); if (!killall) { /* Looks like they want to do a kill. Do that */ - while (--argc >= 0) { + while (arg) { int pid; - if (!isdigit(**argv) && **argv != '-') - bb_error_msg_and_die( "Bad PID '%s'", *argv); - pid = strtol(*argv, NULL, 0); - if (kill(pid, signo) != 0) { - bb_perror_msg( "Could not kill pid '%d'", pid); + if (!isdigit(arg[0]) && arg[0]!='-') + bb_error_msg_and_die("bad pid '%s'", arg); + pid = strtol(arg, NULL, 0); + if (kill(pid, signo)!=0) { + bb_perror_msg("cannot kill pid %d", pid); errors++; } - argv++; + arg = *++argv; } } else { - pid_t myPid=getpid(); + pid_t myPid = getpid(); /* Looks like they want to do a killall. Do that */ - while (--argc >= 0) { + while (arg) { long* pidList; - pidList = find_pid_by_name(*argv); + pidList = find_pid_by_name(arg); if (!pidList || *pidList<=0) { errors++; if (quiet==0) - bb_error_msg( "%s: no process killed", *argv); + bb_error_msg("%s: no process killed", arg); } else { long *pl; - for(pl = pidList; *pl !=0 ; pl++) { + for (pl = pidList; *pl!=0 ; pl++) { if (*pl==myPid) continue; - if (kill(*pl, signo) != 0) { + if (kill(*pl, signo)!=0) { errors++; - if (quiet==0) - bb_perror_msg( "Could not kill pid '%ld'", *pl); + if (!quiet) + bb_perror_msg("cannot kill pid %ld", *pl); } } } free(pidList); - argv++; + arg = *++argv; } } |