aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-09-27 14:19:16 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-09-27 14:19:16 +0000
commita77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e (patch)
tree3ad369f8468a397c6731ccd5c1631e1bc33612d6
parentbe905d550c96da8c75d697842ba4169a62d05190 (diff)
downloadbusybox-w32-a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e.tar.gz
busybox-w32-a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e.tar.bz2
busybox-w32-a77947f5bb9ef38b0f1fc6a2a5b500fa6ade601e.zip
kill: fix bugs (kill -l output was horrible), fix style, constify data
-rw-r--r--include/libbb.h4
-rw-r--r--libbb/u_signal_names.c13
-rw-r--r--procps/kill.c111
3 files changed, 64 insertions, 64 deletions
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);
357 357
358int bb_make_directory (char *path, long mode, int flags); 358int bb_make_directory (char *path, long mode, int flags);
359 359
360int get_signum(char *name); 360int get_signum(const char *name);
361char *get_signame(int number); 361const char *get_signame(int number);
362 362
363char *bb_simplify_path(const char *path); 363char *bb_simplify_path(const char *path);
364 364
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 @@
9 9
10#include "libbb.h" 10#include "libbb.h"
11 11
12static struct signal_name { 12static const struct signal_name {
13 char *name; 13 char name[5];
14 int number; 14 int number;
15} signals[] = { 15} signals[] = {
16 // SUSv3 says kill must support these, and specifies the numerical values, 16 // SUSv3 says kill must support these, and specifies the numerical values,
@@ -26,7 +26,7 @@ static struct signal_name {
26 26
27// Convert signal name to number. 27// Convert signal name to number.
28 28
29int get_signum(char *name) 29int get_signum(const char *name)
30{ 30{
31 int i; 31 int i;
32 32
@@ -42,18 +42,17 @@ int get_signum(char *name)
42 42
43// Convert signal number to name 43// Convert signal number to name
44 44
45char *get_signame(int number) 45const char *get_signame(int number)
46{ 46{
47 int i; 47 int i;
48 static char buf[8]; 48 static char buf[8];
49 49
50 itoa_to_buf(number, buf, 8);
51 for (i=0; i < sizeof(signals) / sizeof(struct signal_name); i++) { 50 for (i=0; i < sizeof(signals) / sizeof(struct signal_name); i++) {
52 if (number == signals[i].number) { 51 if (number == signals[i].number) {
53 sprintf("SIG%s", signals[i].name); 52 return signals[i].name;
54 break;
55 } 53 }
56 } 54 }
57 55
56 itoa_to_buf(number, buf, 8);
58 return buf; 57 return buf;
59} 58}
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 @@
12 12
13int kill_main(int argc, char **argv) 13int kill_main(int argc, char **argv)
14{ 14{
15 int killall, signo = SIGTERM, errors = 0, quiet=0; 15 char *arg;
16 int killall, signo = SIGTERM, errors = 0, quiet = 0;
16 17
17 killall = (ENABLE_KILLALL && bb_applet_name[4]=='a') ? 1 : 0; 18 killall = (ENABLE_KILLALL && bb_applet_name[4]=='a') ? 1 : 0;
18 19
19 /* Parse any options */ 20 /* Parse any options */
20 if (argc < 2) 21 argc--;
22 arg = *++argv;
23 if (argc<1)
21 bb_show_usage(); 24 bb_show_usage();
22 25
23 if(argv[1][0] != '-'){ 26 if (arg[0]!='-') {
24 argv++;
25 argc--;
26 goto do_it_now; 27 goto do_it_now;
27 } 28 }
28 29
29 /* The -l option, which prints out signal names. */ 30 /* The -l option, which prints out signal names. */
30 if(argv[1][1]=='l' && argv[1][2]=='\0'){ 31 if (arg[1]=='l' && arg[2]=='\0') {
31 if(argc==2) { 32 const char *name;
33 if (argc==1) {
32 /* Print the whole signal list */ 34 /* Print the whole signal list */
33 int col = 0; 35 int col = 0;
34 36 for (signo = 1; signo<32; signo++) {
35 for(signo = 0;;) { 37 name = get_signame(signo);
36 char *name = get_signame(++signo); 38 if (isdigit(name[0])) continue;
37 if (isdigit(*name)) break; 39 if (col > 66) {
38 40 puts("");
39 if (col > 60) {
40 printf("\n");
41 col = 0; 41 col = 0;
42 } 42 }
43 col += printf("%2d) %-16s", signo, name); 43 col += printf("%2d) %-6s", signo, name);
44 } 44 }
45 printf("\n"); 45 puts("");
46 } else { 46 } else { /* -l <sig list> */
47 for(argv++; *argv; argv++) { 47 while ((arg = *++argv)!=NULL) {
48 char *name; 48 if (isdigit(arg[0])) {
49 49 signo = atoi(arg);
50 if (isdigit(**argv)) name = get_signame(atoi(*argv)); 50 name = get_signame(signo);
51 else { 51 } else {
52 int temp = get_signum(*argv); 52 signo = get_signum(arg);
53 if (temp<0) 53 if (signo<0)
54 bb_error_msg_and_die("unknown signal %s", *argv); 54 bb_error_msg_and_die("unknown signal '%s'", arg);
55 name = get_signame(temp); 55 name = get_signame(signo);
56 } 56 }
57 puts(name); 57 printf("%2d) %s\n", signo, name);
58 } 58 }
59 } 59 }
60 /* If they specified -l, were all done */ 60 /* If they specified -l, we are all done */
61 return EXIT_SUCCESS; 61 return EXIT_SUCCESS;
62 } 62 }
63 63
64 /* The -q quiet option */ 64 /* The -q quiet option */
65 if(killall && argv[1][1]=='q' && argv[1][2]=='\0'){ 65 if (killall && arg[1]=='q' && arg[2]=='\0') {
66 quiet++; 66 quiet = 1;
67 argv++; 67 arg = *++argv;
68 argc--; 68 argc--;
69 if(argc<2 || argv[1][0] != '-'){ 69 if (argc<1) bb_show_usage();
70 goto do_it_now; 70 if (arg[0]!='-') goto do_it_now;
71 }
72 } 71 }
73 72
74 if(0>(signo = get_signum(argv[1]+1))) 73 /* -SIG */
75 bb_error_msg_and_die( "bad signal name '%s'", argv[1]+1); 74 signo = get_signum(&arg[1]);
76 argv+=2; 75 if (signo<0)
77 argc-=2; 76 bb_error_msg_and_die("bad signal name '%s'", &arg[1]);
77 arg = *++argv;
78 argc--;
78 79
79do_it_now: 80do_it_now:
80 81
81 /* Pid or name required */ 82 /* Pid or name required */
82 if (argc <= 0) 83 if (argc<1)
83 bb_show_usage(); 84 bb_show_usage();
84 85
85 if (!killall) { 86 if (!killall) {
86 /* Looks like they want to do a kill. Do that */ 87 /* Looks like they want to do a kill. Do that */
87 while (--argc >= 0) { 88 while (arg) {
88 int pid; 89 int pid;
89 90
90 if (!isdigit(**argv) && **argv != '-') 91 if (!isdigit(arg[0]) && arg[0]!='-')
91 bb_error_msg_and_die( "Bad PID '%s'", *argv); 92 bb_error_msg_and_die("bad pid '%s'", arg);
92 pid = strtol(*argv, NULL, 0); 93 pid = strtol(arg, NULL, 0);
93 if (kill(pid, signo) != 0) { 94 if (kill(pid, signo)!=0) {
94 bb_perror_msg( "Could not kill pid '%d'", pid); 95 bb_perror_msg("cannot kill pid %d", pid);
95 errors++; 96 errors++;
96 } 97 }
97 argv++; 98 arg = *++argv;
98 } 99 }
99 100
100 } else { 101 } else {
101 pid_t myPid=getpid(); 102 pid_t myPid = getpid();
102 103
103 /* Looks like they want to do a killall. Do that */ 104 /* Looks like they want to do a killall. Do that */
104 while (--argc >= 0) { 105 while (arg) {
105 long* pidList; 106 long* pidList;
106 107
107 pidList = find_pid_by_name(*argv); 108 pidList = find_pid_by_name(arg);
108 if (!pidList || *pidList<=0) { 109 if (!pidList || *pidList<=0) {
109 errors++; 110 errors++;
110 if (quiet==0) 111 if (quiet==0)
111 bb_error_msg( "%s: no process killed", *argv); 112 bb_error_msg("%s: no process killed", arg);
112 } else { 113 } else {
113 long *pl; 114 long *pl;
114 115
115 for(pl = pidList; *pl !=0 ; pl++) { 116 for (pl = pidList; *pl!=0 ; pl++) {
116 if (*pl==myPid) 117 if (*pl==myPid)
117 continue; 118 continue;
118 if (kill(*pl, signo) != 0) { 119 if (kill(*pl, signo)!=0) {
119 errors++; 120 errors++;
120 if (quiet==0) 121 if (!quiet)
121 bb_perror_msg( "Could not kill pid '%ld'", *pl); 122 bb_perror_msg("cannot kill pid %ld", *pl);
122 } 123 }
123 } 124 }
124 } 125 }
125 free(pidList); 126 free(pidList);
126 argv++; 127 arg = *++argv;
127 } 128 }
128 } 129 }
129 130