Add regression tests for /bin/test.
[dragonfly.git] / bin / kill / kill.c
CommitLineData
984263bc
MD
1/*
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.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
1de703da
MD
32 *
33 * @(#) Copyright (c) 1988, 1993, 1994 The Regents of the University of California. All rights reserved.
34 * @(#)kill.c 8.4 (Berkeley) 4/28/95
35 * $FreeBSD: src/bin/kill/kill.c,v 1.11.2.2 2002/07/28 10:19:57 tjr Exp $
07e80f3b 36 * $DragonFly: src/bin/kill/kill.c,v 1.7 2005/03/05 19:41:38 liamfoy Exp $
984263bc
MD
37 */
38
984263bc
MD
39#include <ctype.h>
40#include <err.h>
99512ac4 41#include <errno.h>
984263bc
MD
42#include <signal.h>
43#include <stdio.h>
44#include <stdlib.h>
45#include <string.h>
46
99512ac4
PA
47#ifdef SHELL
48#define main killcmd
49#include "bltin/bltin.h"
50#include "error.h"
51#endif
52
07e80f3b
LF
53static void nosig(const char *);
54static void printsignals(FILE *);
55static int signame_to_signum(const char *);
56static void usage(void);
984263bc
MD
57
58int
a7825f5c 59main(int argc, char **argv)
984263bc 60{
2848dd31 61 int errors, numsig;
07e80f3b 62 pid_t pid;
984263bc
MD
63 char *ep;
64
65 if (argc < 2)
66 usage();
67
68 numsig = SIGTERM;
69
70 argc--, argv++;
a7825f5c 71 if (strcmp(*argv, "-l") == 0) {
984263bc
MD
72 argc--, argv++;
73 if (argc > 1)
74 usage();
75 if (argc == 1) {
76 if (!isdigit(**argv))
77 usage();
78 numsig = strtol(*argv, &ep, 10);
a7825f5c 79 if (**argv == '\0' || *ep != '\0')
99512ac4 80 errx(2, "illegal signal number: %s", *argv);
984263bc
MD
81 if (numsig >= 128)
82 numsig -= 128;
9f8c5148 83 if (numsig <= 0 || numsig >= sys_nsig)
984263bc
MD
84 nosig(*argv);
85 printf("%s\n", sys_signame[numsig]);
99512ac4 86 return (0);
984263bc
MD
87 }
88 printsignals(stdout);
99512ac4 89 return (0);
984263bc
MD
90 }
91
a7825f5c 92 if (strcmp(*argv, "-s") == 0) {
984263bc
MD
93 argc--, argv++;
94 if (argc < 1) {
95 warnx("option requires an argument -- s");
96 usage();
97 }
a7825f5c 98 if (strcmp(*argv, "0") != 0) {
984263bc
MD
99 if ((numsig = signame_to_signum(*argv)) < 0)
100 nosig(*argv);
101 } else
102 numsig = 0;
103 argc--, argv++;
104 } else if (**argv == '-' && *(*argv + 1) != '-') {
105 ++*argv;
106 if (isalpha(**argv)) {
107 if ((numsig = signame_to_signum(*argv)) < 0)
108 nosig(*argv);
109 } else if (isdigit(**argv)) {
110 numsig = strtol(*argv, &ep, 10);
a7825f5c 111 if (**argv == '\0' || *ep != '\0')
99512ac4 112 errx(2, "illegal signal number: %s", *argv);
9f8c5148 113 if (numsig < 0 || numsig >= sys_nsig)
984263bc
MD
114 nosig(*argv);
115 } else
116 nosig(*argv);
117 argc--, argv++;
118 }
119
120 if (argc > 0 && strncmp(*argv, "--", 2) == 0)
121 argc--, argv++;
122
123 if (argc == 0)
124 usage();
125
126 for (errors = 0; argc; argc--, argv++) {
99512ac4
PA
127#ifdef SHELL
128 if (**argv == '%')
129 pid = getjobpgrp(*argv);
130 else
131#endif
132 {
133 pid = (pid_t)strtol(*argv, &ep, 10);
134 if (**argv == '\0' || *ep != '\0') {
135 warnx("illegal process id: %s", *argv);
136 errors = 1;
137 }
138 }
139 if (kill(pid, numsig) == -1) {
984263bc
MD
140 warn("%s", *argv);
141 errors = 1;
142 }
143 }
144
99512ac4 145 return (errors);
984263bc
MD
146}
147
2848dd31
EN
148static int
149signame_to_signum(const char *sig)
984263bc
MD
150{
151 int n;
152
07e80f3b 153 if (strncasecmp(sig, "sig", 3) == 0)
984263bc 154 sig += 3;
9f8c5148 155 for (n = 1; n < sys_nsig; n++) {
a7825f5c
CP
156 if (strcasecmp(sys_signame[n], sig) == 0)
157 return(n);
984263bc 158 }
a7825f5c 159 return(-1);
984263bc
MD
160}
161
2848dd31
EN
162static void
163nosig(const char *name)
984263bc 164{
984263bc
MD
165 warnx("unknown signal %s; valid signals:", name);
166 printsignals(stderr);
99512ac4
PA
167#ifdef SHELL
168 error(NULL);
169#else
170 exit(2);
171#endif
984263bc
MD
172}
173
2848dd31 174static void
984263bc
MD
175printsignals(FILE *fp)
176{
177 int n;
178
9f8c5148 179 for (n = 1; n < sys_nsig; n++) {
2848dd31 180 fprintf(fp, "%s", sys_signame[n]);
9f8c5148 181 if (n == (sys_nsig / 2) || n == (sys_nsig - 1))
57fed2af 182 fprintf(fp, "\n");
984263bc 183 else
57fed2af 184 fprintf(fp, " ");
984263bc
MD
185 }
186}
187
2848dd31 188static void
984263bc
MD
189usage(void)
190{
57fed2af 191 fprintf(stderr, "%s\n%s\n%s\n%s\n",
984263bc
MD
192 "usage: kill [-s signal_name] pid ...",
193 " kill -l [exit_status]",
194 " kill -signal_name pid ...",
195 " kill -signal_number pid ...");
99512ac4
PA
196#ifdef SHELL
197 error(NULL);
198#else
199 exit(2);
200#endif
984263bc 201}