1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#define FOR_kill
44#define FORCE_FLAGS
45#include "toys.h"
46
47GLOBALS(
48 char *s;
49 struct arg_list *o;
50)
51
52
53
54#define FOR_killall5
55#include "generated/flags.h"
56
57void kill_main(void)
58{
59 int signum;
60 char *tmp, **args = toys.optargs;
61 pid_t pid;
62
63
64 if (FLAG(l)) {
65 if (*args) {
66 int signum = sig_to_num(*args);
67 char *s = 0;
68
69 if (signum>=0) s = num_to_sig(signum&127);
70 if (isdigit(**args)) puts(s ? s : "UNKNOWN");
71 else printf("%d\n", signum);
72 } else list_signals();
73
74 return;
75 }
76
77
78
79 if (!TT.s && *args && **args=='-') TT.s = *(args++)+1;
80 if (TT.s) {
81 char *arg;
82 int i = strtol(TT.s, &arg, 10);
83
84 if (!*arg) arg = num_to_sig(i);
85 else arg = TT.s;
86
87 if (!arg || -1 == (signum = sig_to_num(arg)))
88 error_exit("Unknown signal '%s'", arg);
89 } else signum = SIGTERM;
90
91
92 if (CFG_KILLALL5 && toys.which->name[4]=='a') {
93 DIR *dp;
94 struct dirent *entry;
95 int pid, sid;
96 long *olist = 0, ocount = 0;
97
98
99 if (FLAG(o)) {
100 struct arg_list *ptr;
101
102 for (ptr = TT.o; ptr; ptr = ptr->next) ocount++;
103 olist = xmalloc(ocount*sizeof(long));
104 ocount = 0;
105 for (ptr = TT.o; ptr; ptr=ptr->next) olist[ocount++] = atolx(ptr->arg);
106 }
107
108 sid = getsid(pid = getpid());
109
110 if (!(dp = opendir("/proc"))) {
111 free(olist);
112 perror_exit("/proc");
113 }
114 while ((entry = readdir(dp))) {
115 int count, procpid, procsid;
116
117 if (!(procpid = atoi(entry->d_name))) continue;
118
119 snprintf(toybuf, sizeof(toybuf), "/proc/%d/stat", procpid);
120 if (!readfile(toybuf, toybuf, sizeof(toybuf))) continue;
121 if (sscanf(toybuf, "%*d %*s %*c %*d %*d %d", &procsid) != 1) continue;
122 if (pid == procpid || sid == procsid || procpid == 1) continue;
123
124
125 snprintf(toybuf, sizeof(toybuf), "/proc/%d/cmdline", procpid);
126 if (!readfile(toybuf, toybuf, sizeof(toybuf)) || !*toybuf) continue;
127
128
129 for (count = 0; count < ocount; count++)
130 if (procpid == olist[count]) break;
131 if (count != ocount) continue;
132
133 kill(procpid, signum);
134 }
135 closedir(dp);
136 free(olist);
137
138
139 } else {
140
141
142 if (!*args) help_exit("missing argument");
143
144 while (*args) {
145 char *arg = *(args++);
146
147 pid = estrtol(arg, &tmp, 10);
148 if (!errno && *tmp) errno = ESRCH;
149 if (errno || kill(pid, signum)<0) perror_msg("bad pid '%s'", arg);
150 }
151 }
152}
153
154void killall5_main(void)
155{
156 kill_main();
157}
158