]>
Commit | Line | Data |
---|---|---|
71aad674 | 1 | /*- |
44bd5ea7 A |
2 | * Copyright (c) 1988, 1993, 1994 |
3 | * The Regents of the University of California. All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
44bd5ea7 A |
13 | * 4. Neither the name of the University nor the names of its contributors |
14 | * may be used to endorse or promote products derived from this software | |
15 | * without specific prior written permission. | |
16 | * | |
17 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
27 | * SUCH DAMAGE. | |
28 | */ | |
71aad674 A |
29 | /* |
30 | * Important: This file is used both as a standalone program /bin/kill and | |
31 | * as a builtin for /bin/sh (#define SHELL). | |
32 | */ | |
44bd5ea7 | 33 | |
71aad674 | 34 | #if 0 |
44bd5ea7 | 35 | #ifndef lint |
c0fcf4e1 A |
36 | static char const copyright[] = |
37 | "@(#) Copyright (c) 1988, 1993, 1994\n\ | |
38 | The Regents of the University of California. All rights reserved.\n"; | |
44bd5ea7 A |
39 | #endif /* not lint */ |
40 | ||
41 | #ifndef lint | |
44bd5ea7 | 42 | static char sccsid[] = "@(#)kill.c 8.4 (Berkeley) 4/28/95"; |
44bd5ea7 | 43 | #endif /* not lint */ |
71aad674 A |
44 | #endif |
45 | #include <sys/cdefs.h> | |
46 | __FBSDID("$FreeBSD$"); | |
44bd5ea7 A |
47 | |
48 | #include <ctype.h> | |
49 | #include <err.h> | |
50 | #include <errno.h> | |
51 | #include <signal.h> | |
52 | #include <stdio.h> | |
53 | #include <stdlib.h> | |
54 | #include <string.h> | |
55 | ||
71aad674 A |
56 | #ifdef SHELL |
57 | #define main killcmd | |
58 | #include "bltin/bltin.h" | |
59 | #endif | |
60 | ||
61 | static void nosig(const char *); | |
62 | static void printsignals(FILE *); | |
63 | static int signame_to_signum(const char *); | |
64 | static void usage(void); | |
47d9aef8 | 65 | static void print_signum(int, FILE *, char); |
71aad674 A |
66 | |
67 | #ifdef __APPLE__ | |
68 | #define sys_nsig NSIG | |
69 | #endif /* __APPLE__ */ | |
44bd5ea7 A |
70 | |
71 | int | |
71aad674 | 72 | main(int argc, char *argv[]) |
44bd5ea7 | 73 | { |
71aad674 | 74 | int errors, numsig, pid, ret; |
44bd5ea7 A |
75 | char *ep; |
76 | ||
77 | if (argc < 2) | |
78 | usage(); | |
79 | ||
80 | numsig = SIGTERM; | |
81 | ||
82 | argc--, argv++; | |
83 | if (!strcmp(*argv, "-l")) { | |
84 | argc--, argv++; | |
85 | if (argc > 1) | |
86 | usage(); | |
87 | if (argc == 1) { | |
88 | if (!isdigit(**argv)) | |
89 | usage(); | |
90 | numsig = strtol(*argv, &ep, 10); | |
c0fcf4e1 | 91 | if (!**argv || *ep) |
71aad674 | 92 | errx(2, "illegal signal number: %s", *argv); |
44bd5ea7 A |
93 | if (numsig >= 128) |
94 | numsig -= 128; | |
71aad674 | 95 | if (numsig <= 0 || numsig >= sys_nsig) |
44bd5ea7 | 96 | nosig(*argv); |
47d9aef8 | 97 | print_signum(numsig, stdout, '\n'); |
71aad674 | 98 | return (0); |
44bd5ea7 A |
99 | } |
100 | printsignals(stdout); | |
71aad674 | 101 | return (0); |
44bd5ea7 A |
102 | } |
103 | ||
104 | if (!strcmp(*argv, "-s")) { | |
105 | argc--, argv++; | |
106 | if (argc < 1) { | |
107 | warnx("option requires an argument -- s"); | |
108 | usage(); | |
109 | } | |
110 | if (strcmp(*argv, "0")) { | |
111 | if ((numsig = signame_to_signum(*argv)) < 0) | |
112 | nosig(*argv); | |
113 | } else | |
114 | numsig = 0; | |
115 | argc--, argv++; | |
71aad674 | 116 | } else if (**argv == '-' && *(*argv + 1) != '-') { |
44bd5ea7 A |
117 | ++*argv; |
118 | if (isalpha(**argv)) { | |
119 | if ((numsig = signame_to_signum(*argv)) < 0) | |
120 | nosig(*argv); | |
121 | } else if (isdigit(**argv)) { | |
122 | numsig = strtol(*argv, &ep, 10); | |
c0fcf4e1 | 123 | if (!**argv || *ep) |
71aad674 A |
124 | errx(2, "illegal signal number: %s", *argv); |
125 | if (numsig < 0) | |
44bd5ea7 A |
126 | nosig(*argv); |
127 | } else | |
128 | nosig(*argv); | |
129 | argc--, argv++; | |
130 | } | |
131 | ||
71aad674 A |
132 | if (argc > 0 && strncmp(*argv, "--", 2) == 0) |
133 | argc--, argv++; | |
134 | ||
44bd5ea7 A |
135 | if (argc == 0) |
136 | usage(); | |
137 | ||
138 | for (errors = 0; argc; argc--, argv++) { | |
71aad674 A |
139 | #ifdef SHELL |
140 | if (**argv == '%') | |
141 | ret = killjob(*argv, numsig); | |
142 | else | |
143 | #endif | |
144 | { | |
145 | pid = strtol(*argv, &ep, 10); | |
146 | if (!**argv || *ep) | |
147 | errx(2, "illegal process id: %s", *argv); | |
148 | ret = kill(pid, numsig); | |
149 | } | |
150 | if (ret == -1) { | |
44bd5ea7 A |
151 | warn("%s", *argv); |
152 | errors = 1; | |
153 | } | |
154 | } | |
155 | ||
71aad674 | 156 | return (errors); |
44bd5ea7 A |
157 | } |
158 | ||
47d9aef8 A |
159 | static void |
160 | print_signum(int numsig, FILE *fp, char separator) | |
161 | { | |
162 | char *signame; | |
163 | int i; | |
164 | ||
165 | signame = strdup(sys_signame[numsig]); | |
166 | ||
167 | for(i = 0; signame[i] != '\0'; i++) { | |
168 | char upper = toupper(signame[i]); | |
169 | signame[i] = upper; | |
170 | } | |
171 | fprintf(fp, "%s%c", signame, separator); | |
172 | ||
173 | free(signame); | |
174 | } | |
175 | ||
71aad674 A |
176 | static int |
177 | signame_to_signum(const char *sig) | |
44bd5ea7 A |
178 | { |
179 | int n; | |
180 | ||
71aad674 | 181 | if (strncasecmp(sig, "SIG", 3) == 0) |
44bd5ea7 | 182 | sig += 3; |
71aad674 | 183 | for (n = 1; n < sys_nsig; n++) { |
44bd5ea7 A |
184 | if (!strcasecmp(sys_signame[n], sig)) |
185 | return (n); | |
186 | } | |
187 | return (-1); | |
188 | } | |
189 | ||
71aad674 A |
190 | static void |
191 | nosig(const char *name) | |
44bd5ea7 A |
192 | { |
193 | ||
194 | warnx("unknown signal %s; valid signals:", name); | |
195 | printsignals(stderr); | |
71aad674 A |
196 | #ifdef SHELL |
197 | error(NULL); | |
198 | #else | |
199 | exit(2); | |
200 | #endif | |
44bd5ea7 A |
201 | } |
202 | ||
71aad674 A |
203 | static void |
204 | printsignals(FILE *fp) | |
44bd5ea7 A |
205 | { |
206 | int n; | |
207 | ||
71aad674 | 208 | for (n = 1; n < sys_nsig; n++) { |
47d9aef8 | 209 | char sep = ' '; |
71aad674 | 210 | if (n == (sys_nsig / 2) || n == (sys_nsig - 1)) |
47d9aef8 A |
211 | sep = '\n'; |
212 | print_signum(n, fp, sep); | |
44bd5ea7 A |
213 | } |
214 | } | |
215 | ||
71aad674 A |
216 | static void |
217 | usage(void) | |
44bd5ea7 A |
218 | { |
219 | ||
c0fcf4e1 A |
220 | (void)fprintf(stderr, "%s\n%s\n%s\n%s\n", |
221 | "usage: kill [-s signal_name] pid ...", | |
222 | " kill -l [exit_status]", | |
223 | " kill -signal_name pid ...", | |
224 | " kill -signal_number pid ..."); | |
71aad674 A |
225 | #ifdef SHELL |
226 | error(NULL); | |
227 | #else | |
228 | exit(2); | |
229 | #endif | |
44bd5ea7 | 230 | } |