blob: b79805fd0c71d8e4f8877c6580dd63d74cd0bae3 [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001#include <stdio.h>
2#include <stdlib.h>
3#include <errno.h>
4
5#include <sys/types.h>
6#include <signal.h>
7
Kenny Roota64adba2012-04-05 15:23:20 -07008static struct {
9 unsigned int number;
10 char *name;
11} signals[] = {
12#define _SIG(name) {SIG##name, #name}
13 /* Single Unix Specification signals */
14 _SIG(ABRT),
15 _SIG(ALRM),
16 _SIG(FPE),
17 _SIG(HUP),
18 _SIG(ILL),
19 _SIG(INT),
20 _SIG(KILL),
21 _SIG(PIPE),
22 _SIG(QUIT),
23 _SIG(SEGV),
24 _SIG(TERM),
25 _SIG(USR1),
26 _SIG(USR2),
27 _SIG(CHLD),
28 _SIG(CONT),
29 _SIG(STOP),
30 _SIG(TSTP),
31 _SIG(TTIN),
32 _SIG(TTOU),
33 _SIG(BUS),
34 _SIG(POLL),
35 _SIG(PROF),
36 _SIG(SYS),
37 _SIG(TRAP),
38 _SIG(URG),
39 _SIG(VTALRM),
40 _SIG(XCPU),
41 _SIG(XFSZ),
42 /* non-SUS signals */
43 _SIG(IO),
44 _SIG(PWR),
45 _SIG(STKFLT),
46 _SIG(WINCH),
47#undef _SIG
48};
49
50/* To indicate a matching signal was not found */
51static const unsigned int SENTINEL = (unsigned int) -1;
52
53void list_signals()
54{
55 unsigned int sorted_signals[_NSIG];
56 unsigned int i;
57 unsigned int num;
58
59 memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
60
61 // Sort the signals
62 for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
63 sorted_signals[signals[i].number] = i;
64 }
65
66 num = 0;
67 for (i = 1; i < _NSIG; i++) {
68 unsigned int index = sorted_signals[i];
69 if (index == SENTINEL) {
70 continue;
71 }
72
73 fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
74
75 if ((num++ % 4) == 3) {
76 fprintf(stderr, "\n");
77 }
78 }
79
80 if ((num % 4) == 3) {
81 fprintf(stderr, "\n");
82 }
83}
84
85unsigned int name_to_signal(const char* name)
86{
87 unsigned int i;
88
89 for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
90 if (!strcasecmp(name, signals[i].name)) {
91 return signals[i].number;
92 }
93 }
94
95 return SENTINEL;
96}
97
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080098int kill_main(int argc, char **argv)
99{
Kenny Roota64adba2012-04-05 15:23:20 -0700100 unsigned int sig = SIGTERM;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800101 int result = 0;
Kenny Roota64adba2012-04-05 15:23:20 -0700102
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800103 argc--;
104 argv++;
105
Kenny Roota64adba2012-04-05 15:23:20 -0700106 if (argc >= 1 && argv[0][0] == '-') {
107 char *endptr;
108 size_t arg_len = strlen(argv[0]);
109 if (arg_len < 2) {
110 fprintf(stderr, "invalid argument: -\n");
111 return -1;
112 }
113
114 char* arg = argv[0] + 1;
115 if (arg_len == 2 && *arg == 'l') {
116 list_signals();
117 return 0;
118 }
119
120 sig = strtol(arg, &endptr, 10);
121 if (*endptr != '\0') {
122 sig = name_to_signal(arg);
123 if (sig == SENTINEL) {
124 fprintf(stderr, "invalid signal name: %s\n", arg);
125 return -1;
126 }
127 }
128
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800129 argc--;
130 argv++;
131 }
132
133 while(argc > 0){
134 int pid = atoi(argv[0]);
135 int err = kill(pid, sig);
136 if (err < 0) {
137 result = err;
138 fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
139 }
Kenny Roota64adba2012-04-05 15:23:20 -0700140
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800141 argc--;
142 argv++;
143 }
Kenny Roota64adba2012-04-05 15:23:20 -0700144
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800145 return result;
146}