Mercurial > hg > toybox
annotate toys/pending/killall5.c @ 1349:bf2e5591bdf0 draft
Cleanup strings.
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 11 Jun 2014 08:02:55 -0500 |
parents | 78a3eaf5555f |
children |
rev | line source |
---|---|
1326
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* killall5.c - Send signal (default: TERM) to all processes outside current session. |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2014 Ranjan Kumar <ranjankumar.bth@gmail.com> |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2014 Kyungwan Han <asura321@gamil.com> |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
8 USE_KILLALL5(NEWTOY(killall5, "?o*ls:[!lo]", TOYFLAG_SBIN)) |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
9 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 config KILLALL5 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 bool "killall5" |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 default n |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 help |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
14 usage: killall5 [-l] [-SIGNAL|-s SIGNAL] [-o PID]... |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
15 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
16 Send a signal (default: TERM) to all processes outside current session. |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 -l List all signal names and numbers |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 -o PID Don't signal this PID |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 -s send SIGNAL instead of SIGTERM |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 */ |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 #define FOR_killall5 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 #include "toys.h" |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
25 GLOBALS( |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 char *signame; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 struct arg_list *olist; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 ) |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 void killall5_main(void) |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
31 { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 DIR *dp; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 struct dirent *entry; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 int signo, pid, sid, signum = SIGTERM; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 long *olist = NULL, ocount = 0; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 char *s, **args = toys.optargs; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 // list all signal names and numbers |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 if (toys.optflags & FLAG_l) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 if (*args) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 for (; *args; args++) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 signo = sig_to_num(*args); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 if (isdigit(**args) && (s = num_to_sig(signo&127))) xputs(s); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 else if (signo > 0) xprintf("%d\n", signo); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 else error_exit("UNKNOWN signal '%s'", *args); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 } else sig_to_num(NULL); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 return; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 // when SIGNUM will be in the form of -SIGNUM |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 if (TT.signame || (*args && **args == '-')) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 if (0 > (signum = sig_to_num(TT.signame ? TT.signame : (*args)+1))) |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 error_exit("Unknown signal '%s'", *args); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 if (!TT.signame) args++; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 pid = getpid(); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 sid = getsid(pid); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 // prepare omit list |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 if (toys.optflags & FLAG_o) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 struct arg_list *ptr = TT.olist; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 if (*args) error_exit("invalid omit list"); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 for (; ptr; ptr=ptr->next) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 long val = atolx(ptr->arg); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 olist = xrealloc(olist, (ocount+1)*sizeof(long)); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 olist[ocount++] = val; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 if (!(dp = opendir("/proc"))) perror_exit("opendir"); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 while ((entry = readdir(dp))) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 int count, procpid, procsid; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 if (!(procpid = atoi(entry->d_name))) continue; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 snprintf(toybuf, sizeof(toybuf), "/proc/%d/stat", procpid); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 if (!readfile(toybuf, toybuf, sizeof(toybuf))) continue; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 if (sscanf(toybuf, "%*d %*s %*c %*d %*d %d", &procsid) != 1) continue; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 if (pid == procpid || sid == procsid || procpid == 1) continue; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 // Check for kernel threads. |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 snprintf(toybuf, sizeof(toybuf), "/proc/%d/cmdline", procpid); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 if (readfile(toybuf, toybuf, sizeof(toybuf)) && !*toybuf) continue; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 // Check with omit list. |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 if (toys.optflags & FLAG_o) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 for (count = 0; count < ocount; count++) { |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 if (procpid == olist[count]) goto OMIT; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 kill(procpid, signum); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 OMIT: ; |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 } |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 closedir(dp); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 if (CFG_TOYBOX_FREE && olist) free(olist); |
78a3eaf5555f
killall5 - kill all the processes not in its session.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 } |