1 /* vi: set sw=4 ts=4: */
3 * Mini kill/killall implementation for busybox
5 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
6 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
8 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
13 int kill_main(int argc, char **argv)
17 int signo = SIGTERM, errors = 0, quiet = 0;
18 const int killall = (ENABLE_KILLALL && bb_applet_name[4]=='a'
19 && (!ENABLE_KILLALL5 || bb_applet_name[7]!='5'));
20 const int killall5 = (ENABLE_KILLALL5 && bb_applet_name[4]=='a'
21 && (!ENABLE_KILLALL || bb_applet_name[7]=='5'));
23 /* Parse any options */
27 if (argc<1 || arg[0]!='-') {
31 /* The -l option, which prints out signal names. */
32 if (arg[1]=='l' && arg[2]=='\0') {
35 /* Print the whole signal list */
37 for (signo = 1; signo<32; signo++) {
38 name = get_signame(signo);
39 if (isdigit(name[0])) continue;
44 col += printf("%2d) %-6s", signo, name);
47 } else { /* -l <sig list> */
48 while ((arg = *++argv)!=NULL) {
49 if (isdigit(arg[0])) {
51 name = get_signame(signo);
53 signo = get_signum(arg);
55 bb_error_msg_and_die("unknown signal '%s'", arg);
56 name = get_signame(signo);
58 printf("%2d) %s\n", signo, name);
61 /* If they specified -l, we are all done */
65 /* The -q quiet option */
66 if (killall && arg[1]=='q' && arg[2]=='\0') {
70 if (argc<1) bb_show_usage();
71 if (arg[0]!='-') goto do_it_now;
75 signo = get_signum(&arg[1]);
77 bb_error_msg_and_die("bad signal name '%s'", &arg[1]);
87 /* kill(-1, sig) on Linux (at least 2.1.x)
88 * might send signal to the calling process too */
89 signal(SIGTERM, SIG_IGN);
90 /* Now stop all processes */
92 /* Find out our own session id */
95 /* Now kill all processes except our session */
96 while ((p = procps_scan(0))!=0) {
97 if (getsid(p->pid)!=sid && p->pid!=pid && p->pid!=1)
100 /* And let them continue */
105 /* Pid or name required for kill/killall */
110 /* Looks like they want to do a killall. Do that */
115 pidList = find_pid_by_name(arg);
116 if (!pidList || *pidList<=0) {
119 bb_error_msg("%s: no process killed", arg);
123 for (pl = pidList; *pl!=0; pl++) {
126 if (kill(*pl, signo)!=0) {
129 bb_perror_msg("cannot kill pid %ld", *pl);
139 /* Looks like they want to do a kill. Do that */
141 if (!isdigit(arg[0]) && arg[0]!='-')
142 bb_error_msg_and_die("bad pid '%s'", arg);
143 pid = strtol(arg, NULL, 0);
144 /* FIXME: better overflow check? */
145 if (kill(pid, signo)!=0) {
146 bb_perror_msg("cannot kill pid %ld", (long)pid);