From: Denis Vlasenko Date: Wed, 27 Sep 2006 14:19:16 +0000 (-0000) Subject: kill: fix bugs (kill -l output was horrible), fix style, constify data X-Git-Tag: 1_4_0~600 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e;p=oweals%2Fbusybox.git kill: fix bugs (kill -l output was horrible), fix style, constify data --- diff --git a/include/libbb.h b/include/libbb.h index 2a5b38144..05927f1de 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -357,8 +357,8 @@ char *dirname (char *path); int bb_make_directory (char *path, long mode, int flags); -int get_signum(char *name); -char *get_signame(int number); +int get_signum(const char *name); +const char *get_signame(int number); char *bb_simplify_path(const char *path); diff --git a/libbb/u_signal_names.c b/libbb/u_signal_names.c index b9afc6ff1..3f8c04c35 100644 --- a/libbb/u_signal_names.c +++ b/libbb/u_signal_names.c @@ -9,8 +9,8 @@ #include "libbb.h" -static struct signal_name { - char *name; +static const struct signal_name { + char name[5]; int number; } signals[] = { // SUSv3 says kill must support these, and specifies the numerical values, @@ -26,7 +26,7 @@ static struct signal_name { // Convert signal name to number. -int get_signum(char *name) +int get_signum(const char *name) { int i; @@ -42,18 +42,17 @@ int get_signum(char *name) // Convert signal number to name -char *get_signame(int number) +const char *get_signame(int number) { int i; static char buf[8]; - itoa_to_buf(number, buf, 8); for (i=0; i < sizeof(signals) / sizeof(struct signal_name); i++) { if (number == signals[i].number) { - sprintf("SIG%s", signals[i].name); - break; + return signals[i].name; } } + itoa_to_buf(number, buf, 8); return buf; } diff --git a/procps/kill.c b/procps/kill.c index b7a2985c8..654467ac1 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 */ + 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; } }