00f10f91f364160a8a34bcc71fabb81280d71c95
[oweals/busybox.git] / procps / kill.c
1 #include "internal.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <signal.h>
6
7 const char kill_usage[] = "kill [-signal] process-id [process-id ...]\n";
8
9 struct signal_name {
10     const char *name;
11     int number;
12 };
13
14 const struct signal_name signames[] = {
15     {"HUP", SIGHUP},
16     {"INT", SIGINT},
17     {"QUIT", SIGQUIT},
18     {"ILL", SIGILL},
19     {"TRAP", SIGTRAP},
20     {"ABRT", SIGABRT},
21 #ifndef __alpha__
22     {"IOT", SIGIOT},
23 #endif
24 #if defined(sparc) || defined(__alpha__)
25     {"EMT", SIGEMT},
26 #else
27     {"BUS", SIGBUS},
28 #endif
29     {"FPE", SIGFPE},
30     {"KILL", SIGKILL},
31 #if defined(sparc) || defined(__alpha__)
32     {"BUS", SIGBUS},
33 #else
34     {"USR1", SIGUSR1},
35 #endif
36     {"SEGV", SIGSEGV},
37 #if defined(sparc) || defined(__alpha__)
38     {"SYS", SIGSYS},
39 #else
40     {"USR2", SIGUSR2},
41 #endif
42     {"PIPE", SIGPIPE},
43     {"ALRM", SIGALRM},
44     {"TERM", SIGTERM},
45 #if defined(sparc) || defined(__alpha__)
46     {"URG", SIGURG},
47     {"STOP", SIGSTOP},
48     {"TSTP", SIGTSTP},
49     {"CONT", SIGCONT},
50     {"CHLD", SIGCHLD},
51     {"TTIN", SIGTTIN},
52     {"TTOU", SIGTTOU},
53     {"IO", SIGIO},
54 # ifndef __alpha__
55     {"POLL", SIGIO},
56 # endif
57     {"XCPU", SIGXCPU},
58     {"XFSZ", SIGXFSZ},
59     {"VTALRM", SIGVTALRM},
60     {"PROF", SIGPROF},
61     {"WINCH", SIGWINCH},
62 # ifdef __alpha__
63     {"INFO", SIGINFO},
64 # else
65     {"LOST", SIGLOST},
66 # endif
67     {"USR1", SIGUSR1},
68     {"USR2", SIGUSR2},
69 #else
70     {"STKFLT", SIGSTKFLT},
71     {"CHLD", SIGCHLD},
72     {"CONT", SIGCONT},
73     {"STOP", SIGSTOP},
74     {"TSTP", SIGTSTP},
75     {"TTIN", SIGTTIN},
76     {"TTOU", SIGTTOU},
77     {"URG", SIGURG},
78     {"XCPU", SIGXCPU},
79     {"XFSZ", SIGXFSZ},
80     {"VTALRM", SIGVTALRM},
81     {"PROF", SIGPROF},
82     {"WINCH", SIGWINCH},
83     {"IO", SIGIO},
84     {"POLL", SIGPOLL},
85     {"PWR", SIGPWR},
86     {"UNUSED", SIGUNUSED},
87 #endif
88     {0, 0}
89 };
90
91 extern int kill_main (int argc, char **argv)
92 {
93     int had_error = 0;
94     int sig = SIGTERM;
95
96
97
98     if (argv[1][0] == '-') {
99         if (argv[1][1] >= '0' && argv[1][1] <= '9') {
100             sig = atoi (&argv[1][1]);
101             if (sig < 0 || sig >= NSIG)
102                 goto end;
103         } else {
104             const struct signal_name *s = signames;
105             for (;;) {
106                 if (strcmp (s->name, &argv[1][1]) == 0) {
107                     sig = s->number;
108                     break;
109                 }
110                 s++;
111                 if (s->name == 0)
112                     goto end;
113             }
114         }
115         argv++;
116         argc--;
117
118     }
119     while (argc > 1) {
120         int pid;
121         if (argv[1][0] < '0' || argv[1][0] > '9')
122             goto end;
123         pid = atoi (argv[1]);
124         if (kill (pid, sig) != 0) {
125             had_error = 1;
126             perror (argv[1]);
127         }
128         argv++;
129         argc--;
130     }
131     if (had_error) {
132 end:
133         usage (kill_usage);
134     }
135     exit (TRUE);
136 }