kill: fix bugs (kill -l output was horrible), fix style, constify data
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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; | |
| } | |
| @@ -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; |
| } | |
| } | |