diff options
| author | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2003-07-26 07:41:56 +0000 |
|---|---|---|
| committer | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2003-07-26 07:41:56 +0000 |
| commit | d61ff36b5f7412cea1ca7a03da53cf71ce52f465 (patch) | |
| tree | a7c306e39d321a451093c5a6c114c7fa7bcfb7f1 /procps | |
| parent | 8be58e54c3916ec9624f487aef0ddc830430289e (diff) | |
| download | busybox-w32-d61ff36b5f7412cea1ca7a03da53cf71ce52f465.tar.gz busybox-w32-d61ff36b5f7412cea1ca7a03da53cf71ce52f465.tar.bz2 busybox-w32-d61ff36b5f7412cea1ca7a03da53cf71ce52f465.zip | |
Rework kill / killall so it behaves itself, even when subjected
to abuse.
-Erik
git-svn-id: svn://busybox.net/trunk/busybox@7107 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'procps')
| -rw-r--r-- | procps/kill.c | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/procps/kill.c b/procps/kill.c index 717d8c69e..f11623e01 100644 --- a/procps/kill.c +++ b/procps/kill.c | |||
| @@ -35,10 +35,9 @@ | |||
| 35 | static const int KILL = 0; | 35 | static const int KILL = 0; |
| 36 | static const int KILLALL = 1; | 36 | static const int KILLALL = 1; |
| 37 | 37 | ||
| 38 | |||
| 39 | extern int kill_main(int argc, char **argv) | 38 | extern int kill_main(int argc, char **argv) |
| 40 | { | 39 | { |
| 41 | int whichApp, sig = SIGTERM, quiet; | 40 | int whichApp, signo = SIGTERM, quiet = 0; |
| 42 | const char *name; | 41 | const char *name; |
| 43 | int errors = 0; | 42 | int errors = 0; |
| 44 | 43 | ||
| @@ -49,58 +48,59 @@ extern int kill_main(int argc, char **argv) | |||
| 49 | whichApp = KILL; | 48 | whichApp = KILL; |
| 50 | #endif | 49 | #endif |
| 51 | 50 | ||
| 52 | quiet=0; | ||
| 53 | argc--; | ||
| 54 | argv++; | ||
| 55 | /* Parse any options */ | 51 | /* Parse any options */ |
| 56 | if (argc < 1) | 52 | if (argc < 2) |
| 57 | bb_show_usage(); | 53 | bb_show_usage(); |
| 58 | 54 | ||
| 59 | while (argc > 0 && **argv == '-') { | 55 | if(argv[1][0] != '-'){ |
| 60 | while (*++(*argv)) { | 56 | argv++; |
| 61 | switch (**argv) { | 57 | argc--; |
| 62 | #ifdef CONFIG_KILLALL | 58 | goto do_it_now; |
| 63 | case 'q': | 59 | } |
| 64 | quiet++; | 60 | |
| 65 | break; | 61 | /* The -l option, which prints out signal names. */ |
| 66 | #endif | 62 | if(argv[1][1]=='l' && argv[1][2]=='\0'){ |
| 67 | case 'l': | 63 | if(argc==2) { |
| 68 | if(argc>1) { | 64 | /* Print the whole signal list */ |
| 69 | for(argv++; *argv; argv++) { | 65 | int col = 0; |
| 70 | name = u_signal_names(*argv, &sig, -1); | 66 | for(signo=1; signo < NSIG; signo++) { |
| 71 | if(name!=NULL) | 67 | name = u_signal_names(0, &signo, 1); |
| 72 | printf("%s\n", name); | 68 | if(name==NULL) /* unnamed */ |
| 73 | } | 69 | continue; |
| 74 | } else { | 70 | col += printf("%2d) %-16s", signo, name); |
| 75 | int col = 0; | 71 | if (col > 60) { |
| 76 | for(sig=1; sig < NSIG; sig++) { | 72 | printf("\n"); |
| 77 | name = u_signal_names(0, &sig, 1); | 73 | col = 0; |
| 78 | if(name==NULL) /* unnamed */ | 74 | } |
| 79 | continue; | 75 | } |
| 80 | col += printf("%2d) %-16s", sig, name); | 76 | printf("\n"); |
| 81 | if (col > 60) { | 77 | |
| 82 | printf("\n"); | 78 | } else { |
| 83 | col = 0; | 79 | for(argv++; *argv; argv++) { |
| 84 | } | 80 | name = u_signal_names(*argv, &signo, -1); |
| 85 | } | 81 | if(name!=NULL) |
| 86 | printf("\n"); | 82 | printf("%s\n", name); |
| 87 | } | ||
| 88 | return EXIT_SUCCESS; | ||
| 89 | case '-': | ||
| 90 | bb_show_usage(); | ||
| 91 | default: | ||
| 92 | name = u_signal_names(*argv, &sig, 0); | ||
| 93 | if(name==NULL) | ||
| 94 | bb_error_msg_and_die( "bad signal name: %s", *argv); | ||
| 95 | argc--; | ||
| 96 | argv++; | ||
| 97 | goto do_it_now; | ||
| 98 | } | 83 | } |
| 99 | argc--; | ||
| 100 | argv++; | ||
| 101 | } | 84 | } |
| 85 | /* If they specified -l, were all done */ | ||
| 86 | return EXIT_SUCCESS; | ||
| 102 | } | 87 | } |
| 103 | 88 | ||
| 89 | /* The -q quiet option */ | ||
| 90 | if(argv[1][1]=='q' && argv[1][2]=='\0'){ | ||
| 91 | quiet++; | ||
| 92 | argv++; | ||
| 93 | argc--; | ||
| 94 | if(argv[1][0] != '-'){ | ||
| 95 | goto do_it_now; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | if(!u_signal_names(argv[1]+1, &signo, 0)) | ||
| 100 | bb_error_msg_and_die( "bad signal name '%s'", argv[1]+1); | ||
| 101 | argv+=2; | ||
| 102 | argc-=2; | ||
| 103 | |||
| 104 | do_it_now: | 104 | do_it_now: |
| 105 | 105 | ||
| 106 | if (whichApp == KILL) { | 106 | if (whichApp == KILL) { |
| @@ -109,9 +109,9 @@ do_it_now: | |||
| 109 | int pid; | 109 | int pid; |
| 110 | 110 | ||
| 111 | if (!isdigit(**argv)) | 111 | if (!isdigit(**argv)) |
| 112 | bb_perror_msg_and_die( "Bad PID"); | 112 | bb_error_msg_and_die( "Bad PID '%s'", *argv); |
| 113 | pid = strtol(*argv, NULL, 0); | 113 | pid = strtol(*argv, NULL, 0); |
| 114 | if (kill(pid, sig) != 0) { | 114 | if (kill(pid, signo) != 0) { |
| 115 | bb_perror_msg( "Could not kill pid '%d'", pid); | 115 | bb_perror_msg( "Could not kill pid '%d'", pid); |
| 116 | errors++; | 116 | errors++; |
| 117 | } | 117 | } |
| @@ -127,22 +127,22 @@ do_it_now: | |||
| 127 | long* pidList; | 127 | long* pidList; |
| 128 | 128 | ||
| 129 | pidList = find_pid_by_name(*argv); | 129 | pidList = find_pid_by_name(*argv); |
| 130 | if (*pidList <= 0) { | 130 | if (!pidList || *pidList<=0) { |
| 131 | errors++; | 131 | errors++; |
| 132 | if (quiet==0) | 132 | if (quiet==0) |
| 133 | bb_error_msg( "%s: no process killed", *argv); | 133 | bb_error_msg( "%s: no process killed", *argv); |
| 134 | } else { | 134 | } else { |
| 135 | long *pl; | 135 | long *pl; |
| 136 | 136 | ||
| 137 | for(pl = pidList; *pl !=0 ; pl++) { | 137 | for(pl = pidList; *pl !=0 ; pl++) { |
| 138 | if (*pl==myPid) | 138 | if (*pl==myPid) |
| 139 | continue; | 139 | continue; |
| 140 | if (kill(*pl, sig) != 0) { | 140 | if (kill(*pl, signo) != 0) { |
| 141 | errors++; | 141 | errors++; |
| 142 | if (quiet==0) | 142 | if (quiet==0) |
| 143 | bb_perror_msg( "Could not kill pid '%ld'", *pl); | 143 | bb_perror_msg( "Could not kill pid '%ld'", *pl); |
| 144 | } | ||
| 145 | } | 144 | } |
| 145 | } | ||
| 146 | } | 146 | } |
| 147 | free(pidList); | 147 | free(pidList); |
| 148 | argv++; | 148 | argv++; |
