1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4
5 #include <sys/types.h>
6 #include <signal.h>
7
8 static 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 #ifdef SIGSTKFLT
46 _SIG(STKFLT),
47 #endif
48 _SIG(WINCH),
49 #undef _SIG
50 };
51
52 /* To indicate a matching signal was not found */
53 static const unsigned int SENTINEL = (unsigned int) -1;
54
list_signals()55 void list_signals()
56 {
57 unsigned int sorted_signals[_NSIG];
58 unsigned int i;
59 unsigned int num;
60
61 memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
62
63 // Sort the signals
64 for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
65 sorted_signals[signals[i].number] = i;
66 }
67
68 num = 0;
69 for (i = 1; i < _NSIG; i++) {
70 unsigned int index = sorted_signals[i];
71 if (index == SENTINEL) {
72 continue;
73 }
74
75 fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
76
77 if ((num++ % 4) == 3) {
78 fprintf(stderr, "\n");
79 }
80 }
81
82 if ((num % 4) == 3) {
83 fprintf(stderr, "\n");
84 }
85 }
86
name_to_signal(const char * name)87 unsigned int name_to_signal(const char* name)
88 {
89 unsigned int i;
90
91 for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
92 if (!strcasecmp(name, signals[i].name)) {
93 return signals[i].number;
94 }
95 }
96
97 return SENTINEL;
98 }
99
kill_main(int argc,char ** argv)100 int kill_main(int argc, char **argv)
101 {
102 unsigned int sig = SIGTERM;
103 int result = 0;
104
105 argc--;
106 argv++;
107
108 if (argc >= 1 && argv[0][0] == '-') {
109 char *endptr;
110 size_t arg_len = strlen(argv[0]);
111 if (arg_len < 2) {
112 fprintf(stderr, "invalid argument: -\n");
113 return -1;
114 }
115
116 char* arg = argv[0] + 1;
117 if (arg_len == 2 && *arg == 'l') {
118 list_signals();
119 return 0;
120 }
121
122 sig = strtol(arg, &endptr, 10);
123 if (*endptr != '\0') {
124 sig = name_to_signal(arg);
125 if (sig == SENTINEL) {
126 fprintf(stderr, "invalid signal name: %s\n", arg);
127 return -1;
128 }
129 }
130
131 argc--;
132 argv++;
133 }
134
135 while(argc > 0){
136 int pid = atoi(argv[0]);
137 int err = kill(pid, sig);
138 if (err < 0) {
139 result = err;
140 fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
141 }
142
143 argc--;
144 argv++;
145 }
146
147 return result;
148 }
149