blob: 8cc2b044e81ec44dfd4c73dbc4b0b701ddcffc4f [file] [log] [blame]
Eric Andersenc4996011999-10-20 22:08:37 +00001/*
2 * Mini kill implementation for busybox
3 *
4 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22
Eric Andersencc8ed391999-10-05 16:24:54 +000023#include "internal.h"
24#include <stdio.h>
25#include <stdlib.h>
26#include <unistd.h>
27#include <signal.h>
Eric Andersena7093171999-10-23 05:42:08 +000028#include <ctype.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000029
Eric Andersen3cf52d11999-10-12 22:26:06 +000030const char kill_usage[] = "kill [-signal] process-id [process-id ...]\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000031
32struct signal_name {
Eric Andersen3cf52d11999-10-12 22:26:06 +000033 const char *name;
34 int number;
Eric Andersencc8ed391999-10-05 16:24:54 +000035};
36
37const struct signal_name signames[] = {
Eric Andersen3cf52d11999-10-12 22:26:06 +000038 {"HUP", SIGHUP},
39 {"INT", SIGINT},
40 {"QUIT", SIGQUIT},
41 {"ILL", SIGILL},
42 {"TRAP", SIGTRAP},
43 {"ABRT", SIGABRT},
Eric Andersencc8ed391999-10-05 16:24:54 +000044#ifndef __alpha__
Eric Andersen3cf52d11999-10-12 22:26:06 +000045 {"IOT", SIGIOT},
Eric Andersencc8ed391999-10-05 16:24:54 +000046#endif
Eric Andersene77ae3a1999-10-19 20:03:34 +000047#if defined(__sparc__) || defined(__alpha__)
Eric Andersen3cf52d11999-10-12 22:26:06 +000048 {"EMT", SIGEMT},
Eric Andersencc8ed391999-10-05 16:24:54 +000049#else
Eric Andersen3cf52d11999-10-12 22:26:06 +000050 {"BUS", SIGBUS},
Eric Andersencc8ed391999-10-05 16:24:54 +000051#endif
Eric Andersen3cf52d11999-10-12 22:26:06 +000052 {"FPE", SIGFPE},
53 {"KILL", SIGKILL},
Eric Andersene77ae3a1999-10-19 20:03:34 +000054#if defined(__sparc__) || defined(__alpha__)
Eric Andersen3cf52d11999-10-12 22:26:06 +000055 {"BUS", SIGBUS},
Eric Andersencc8ed391999-10-05 16:24:54 +000056#else
Eric Andersen3cf52d11999-10-12 22:26:06 +000057 {"USR1", SIGUSR1},
Eric Andersencc8ed391999-10-05 16:24:54 +000058#endif
Eric Andersen3cf52d11999-10-12 22:26:06 +000059 {"SEGV", SIGSEGV},
Eric Andersene77ae3a1999-10-19 20:03:34 +000060#if defined(__sparc__) || defined(__alpha__)
Eric Andersen3cf52d11999-10-12 22:26:06 +000061 {"SYS", SIGSYS},
Eric Andersencc8ed391999-10-05 16:24:54 +000062#else
Eric Andersen3cf52d11999-10-12 22:26:06 +000063 {"USR2", SIGUSR2},
Eric Andersencc8ed391999-10-05 16:24:54 +000064#endif
Eric Andersen3cf52d11999-10-12 22:26:06 +000065 {"PIPE", SIGPIPE},
66 {"ALRM", SIGALRM},
67 {"TERM", SIGTERM},
Eric Andersene77ae3a1999-10-19 20:03:34 +000068#if defined(__sparc__) || defined(__alpha__)
Eric Andersen3cf52d11999-10-12 22:26:06 +000069 {"URG", SIGURG},
70 {"STOP", SIGSTOP},
71 {"TSTP", SIGTSTP},
72 {"CONT", SIGCONT},
73 {"CHLD", SIGCHLD},
74 {"TTIN", SIGTTIN},
75 {"TTOU", SIGTTOU},
76 {"IO", SIGIO},
Eric Andersencc8ed391999-10-05 16:24:54 +000077# ifndef __alpha__
Eric Andersen3cf52d11999-10-12 22:26:06 +000078 {"POLL", SIGIO},
Eric Andersencc8ed391999-10-05 16:24:54 +000079# endif
Eric Andersen3cf52d11999-10-12 22:26:06 +000080 {"XCPU", SIGXCPU},
81 {"XFSZ", SIGXFSZ},
82 {"VTALRM", SIGVTALRM},
83 {"PROF", SIGPROF},
84 {"WINCH", SIGWINCH},
Eric Andersencc8ed391999-10-05 16:24:54 +000085# ifdef __alpha__
Eric Andersen3cf52d11999-10-12 22:26:06 +000086 {"INFO", SIGINFO},
Eric Andersencc8ed391999-10-05 16:24:54 +000087# else
Eric Andersen3cf52d11999-10-12 22:26:06 +000088 {"LOST", SIGLOST},
Eric Andersencc8ed391999-10-05 16:24:54 +000089# endif
Eric Andersen3cf52d11999-10-12 22:26:06 +000090 {"USR1", SIGUSR1},
91 {"USR2", SIGUSR2},
Eric Andersencc8ed391999-10-05 16:24:54 +000092#else
Eric Andersen3cf52d11999-10-12 22:26:06 +000093 {"STKFLT", SIGSTKFLT},
94 {"CHLD", SIGCHLD},
95 {"CONT", SIGCONT},
96 {"STOP", SIGSTOP},
97 {"TSTP", SIGTSTP},
98 {"TTIN", SIGTTIN},
99 {"TTOU", SIGTTOU},
100 {"URG", SIGURG},
101 {"XCPU", SIGXCPU},
102 {"XFSZ", SIGXFSZ},
103 {"VTALRM", SIGVTALRM},
104 {"PROF", SIGPROF},
105 {"WINCH", SIGWINCH},
106 {"IO", SIGIO},
107 {"POLL", SIGPOLL},
108 {"PWR", SIGPWR},
109 {"UNUSED", SIGUNUSED},
Eric Andersencc8ed391999-10-05 16:24:54 +0000110#endif
Eric Andersen3cf52d11999-10-12 22:26:06 +0000111 {0, 0}
Eric Andersencc8ed391999-10-05 16:24:54 +0000112};
113
Eric Andersen3cf52d11999-10-12 22:26:06 +0000114extern int kill_main (int argc, char **argv)
Eric Andersencc8ed391999-10-05 16:24:54 +0000115{
Eric Andersen3cf52d11999-10-12 22:26:06 +0000116 int sig = SIGTERM;
Eric Andersencc8ed391999-10-05 16:24:54 +0000117
Eric Andersena7093171999-10-23 05:42:08 +0000118 if ( argc < 2 )
119 usage (kill_usage);
Eric Andersen3cf52d11999-10-12 22:26:06 +0000120
Eric Andersena7093171999-10-23 05:42:08 +0000121 if ( **(argv+1) == '-' ) {
122 if (isdigit( *(*(++argv)+1) )) {
123 sig = atoi (*argv);
Eric Andersen3cf52d11999-10-12 22:26:06 +0000124 if (sig < 0 || sig >= NSIG)
125 goto end;
Eric Andersena7093171999-10-23 05:42:08 +0000126 }
127 else {
Eric Andersen3cf52d11999-10-12 22:26:06 +0000128 const struct signal_name *s = signames;
Eric Andersena7093171999-10-23 05:42:08 +0000129 while (s->name != 0) {
130 if (strcasecmp (s->name, *argv+1) == 0) {
Eric Andersen3cf52d11999-10-12 22:26:06 +0000131 sig = s->number;
132 break;
Eric Andersencc8ed391999-10-05 16:24:54 +0000133 }
Eric Andersen3cf52d11999-10-12 22:26:06 +0000134 s++;
Eric Andersen3cf52d11999-10-12 22:26:06 +0000135 }
Eric Andersena7093171999-10-23 05:42:08 +0000136 if (s->name == 0)
137 goto end;
Eric Andersencc8ed391999-10-05 16:24:54 +0000138 }
Eric Andersena7093171999-10-23 05:42:08 +0000139 }
Eric Andersen3cf52d11999-10-12 22:26:06 +0000140
Eric Andersena7093171999-10-23 05:42:08 +0000141 while (--argc > 1) {
Eric Andersen3cf52d11999-10-12 22:26:06 +0000142 int pid;
Eric Andersena7093171999-10-23 05:42:08 +0000143 if (! isdigit( **(++argv))) {
144 fprintf(stderr, "bad PID: %s\n", *argv);
145 exit( FALSE);
Eric Andersen3cf52d11999-10-12 22:26:06 +0000146 }
Eric Andersena7093171999-10-23 05:42:08 +0000147 pid = atoi (*argv);
148 if (kill (pid, sig) != 0) {
149 perror (*argv);
150 exit ( FALSE);
151 }
Eric Andersen3cf52d11999-10-12 22:26:06 +0000152 }
Eric Andersena7093171999-10-23 05:42:08 +0000153
Eric Andersen3cf52d11999-10-12 22:26:06 +0000154end:
Eric Andersena7093171999-10-23 05:42:08 +0000155 fprintf(stderr, "bad signal name: %s\n", *argv);
Eric Andersen3cf52d11999-10-12 22:26:06 +0000156 exit (TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +0000157}
Eric Andersena7093171999-10-23 05:42:08 +0000158
159