]>
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); | |
65 | ||
66 | #ifdef __APPLE__ | |
67 | #define sys_nsig NSIG | |
68 | #endif /* __APPLE__ */ | |
44bd5ea7 A |
69 | |
70 | int | |
71aad674 | 71 | main(int argc, char *argv[]) |
44bd5ea7 | 72 | { |
71aad674 | 73 | int errors, numsig, pid, ret; |
44bd5ea7 A |
74 | char *ep; |
75 | ||
76 | if (argc < 2) | |
77 | usage(); | |
78 | ||
79 | numsig = SIGTERM; | |
80 | ||
81 | argc--, argv++; | |
82 | if (!strcmp(*argv, "-l")) { | |
83 | argc--, argv++; | |
84 | if (argc > 1) | |
85 | usage(); | |
86 | if (argc == 1) { | |
87 | if (!isdigit(**argv)) | |
88 | usage(); | |
89 | numsig = strtol(*argv, &ep, 10); | |
c0fcf4e1 | 90 | if (!**argv || *ep) |
71aad674 | 91 | errx(2, "illegal signal number: %s", *argv); |
44bd5ea7 A |
92 | if (numsig >= 128) |
93 | numsig -= 128; | |
71aad674 | 94 | if (numsig <= 0 || numsig >= sys_nsig) |
44bd5ea7 | 95 | nosig(*argv); |
c0fcf4e1 | 96 | printf("%s\n", sys_signame[numsig]); |
71aad674 | 97 | return (0); |
44bd5ea7 A |
98 | } |
99 | printsignals(stdout); | |
71aad674 | 100 | return (0); |
44bd5ea7 A |
101 | } |
102 | ||
103 | if (!strcmp(*argv, "-s")) { | |
104 | argc--, argv++; | |
105 | if (argc < 1) { | |
106 | warnx("option requires an argument -- s"); | |
107 | usage(); | |
108 | } | |
109 | if (strcmp(*argv, "0")) { | |
110 | if ((numsig = signame_to_signum(*argv)) < 0) | |
111 | nosig(*argv); | |
112 | } else | |
113 | numsig = 0; | |
114 | argc--, argv++; | |
71aad674 | 115 | } else if (**argv == '-' && *(*argv + 1) != '-') { |
44bd5ea7 A |
116 | ++*argv; |
117 | if (isalpha(**argv)) { | |
118 | if ((numsig = signame_to_signum(*argv)) < 0) | |
119 | nosig(*argv); | |
120 | } else if (isdigit(**argv)) { | |
121 | numsig = strtol(*argv, &ep, 10); | |
c0fcf4e1 | 122 | if (!**argv || *ep) |
71aad674 A |
123 | errx(2, "illegal signal number: %s", *argv); |
124 | if (numsig < 0) | |
44bd5ea7 A |
125 | nosig(*argv); |
126 | } else | |
127 | nosig(*argv); | |
128 | argc--, argv++; | |
129 | } | |
130 | ||
71aad674 A |
131 | if (argc > 0 && strncmp(*argv, "--", 2) == 0) |
132 | argc--, argv++; | |
133 | ||
44bd5ea7 A |
134 | if (argc == 0) |
135 | usage(); | |
136 | ||
137 | for (errors = 0; argc; argc--, argv++) { | |
71aad674 A |
138 | #ifdef SHELL |
139 | if (**argv == '%') | |
140 | ret = killjob(*argv, numsig); | |
141 | else | |
142 | #endif | |
143 | { | |
144 | pid = strtol(*argv, &ep, 10); | |
145 | if (!**argv || *ep) | |
146 | errx(2, "illegal process id: %s", *argv); | |
147 | ret = kill(pid, numsig); | |
148 | } | |
149 | if (ret == -1) { | |
44bd5ea7 A |
150 | warn("%s", *argv); |
151 | errors = 1; | |
152 | } | |
153 | } | |
154 | ||
71aad674 | 155 | return (errors); |
44bd5ea7 A |
156 | } |
157 | ||
71aad674 A |
158 | static int |
159 | signame_to_signum(const char *sig) | |
44bd5ea7 A |
160 | { |
161 | int n; | |
162 | ||
71aad674 | 163 | if (strncasecmp(sig, "SIG", 3) == 0) |
44bd5ea7 | 164 | sig += 3; |
71aad674 | 165 | for (n = 1; n < sys_nsig; n++) { |
44bd5ea7 A |
166 | if (!strcasecmp(sys_signame[n], sig)) |
167 | return (n); | |
168 | } | |
169 | return (-1); | |
170 | } | |
171 | ||
71aad674 A |
172 | static void |
173 | nosig(const char *name) | |
44bd5ea7 A |
174 | { |
175 | ||
176 | warnx("unknown signal %s; valid signals:", name); | |
177 | printsignals(stderr); | |
71aad674 A |
178 | #ifdef SHELL |
179 | error(NULL); | |
180 | #else | |
181 | exit(2); | |
182 | #endif | |
44bd5ea7 A |
183 | } |
184 | ||
71aad674 A |
185 | static void |
186 | printsignals(FILE *fp) | |
44bd5ea7 A |
187 | { |
188 | int n; | |
189 | ||
71aad674 | 190 | for (n = 1; n < sys_nsig; n++) { |
44bd5ea7 | 191 | (void)fprintf(fp, "%s", sys_signame[n]); |
71aad674 | 192 | if (n == (sys_nsig / 2) || n == (sys_nsig - 1)) |
44bd5ea7 A |
193 | (void)fprintf(fp, "\n"); |
194 | else | |
195 | (void)fprintf(fp, " "); | |
196 | } | |
197 | } | |
198 | ||
71aad674 A |
199 | static void |
200 | usage(void) | |
44bd5ea7 A |
201 | { |
202 | ||
c0fcf4e1 A |
203 | (void)fprintf(stderr, "%s\n%s\n%s\n%s\n", |
204 | "usage: kill [-s signal_name] pid ...", | |
205 | " kill -l [exit_status]", | |
206 | " kill -signal_name pid ...", | |
207 | " kill -signal_number pid ..."); | |
71aad674 A |
208 | #ifdef SHELL |
209 | error(NULL); | |
210 | #else | |
211 | exit(2); | |
212 | #endif | |
44bd5ea7 | 213 | } |