-static char *sccsid = "@(#)kill.c 4.3 (Berkeley) %G%";
/*
- * kill - send signal to process
+ * Copyright (c) 1988, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * %sccs.include.redist.c%
*/
-#include <signal.h>
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1988, 1993, 1994\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)kill.c 8.3 (Berkeley) %G%";
+#endif /* not lint */
+
#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
-char *signm[] = { 0,
-"HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "EMT", "FPE", /* 1-8 */
-"KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", /* 9-16 */
-"STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 17-24 */
-"XFSZ", "VTALRM", "PROF", "WINCH", 0, "USR1", "USR2", 0, /* 25-31 */
-};
+void nosig __P((char *));
+void printsig __P((FILE *));
+void usage __P((void));
+int
main(argc, argv)
-char **argv;
+ int argc;
+ char *argv[];
{
- register signo, pid, res;
- int errlev;
- extern char *sys_errlist[];
- extern errno;
-
- errlev = 0;
- if (argc <= 1) {
- usage:
- printf("usage: kill [ -sig ] pid ...\n");
- printf("for a list of signals: kill -l\n");
- exit(2);
+ const char *const *p;
+ int errors, numsig, pid;
+ char *ep;
+
+ if (argc < 2)
+ usage();
+
+ if (!strcmp(*++argv, "-l")) {
+ printsig(stdout);
+ exit(0);
}
- if (*argv[1] == '-') {
- if (argv[1][1] == 'l') {
- for (signo = 0; signo <= NSIG; signo++) {
- if (signm[signo])
- printf("%s ", signm[signo]);
- if (signo == 16)
- printf("\n");
- }
- printf("\n");
- exit(0);
- } else if (isdigit(argv[1][1])) {
- signo = atoi(argv[1]+1);
- if (signo < 0 || signo > NSIG) {
- printf("kill: %s: number out of range\n",
- argv[1]);
- exit(1);
- }
- } else {
- char *name = argv[1]+1;
- for (signo = 0; signo <= NSIG; signo++)
- if (signm[signo] && !strcmp(signm[signo], name))
- goto foundsig;
- printf("kill: %s: unknown signal; kill -l lists signals\n", name);
- exit(1);
-foundsig:
- ;
- }
- argc--;
- argv++;
- } else
- signo = SIGTERM;
- argv++;
- while (argc > 1) {
- if (**argv<'0' || **argv>'9')
- goto usage;
- res = kill(pid = atoi(*argv), signo);
- if (res<0) {
- printf("%u: %s\n", pid, sys_errlist[errno]);
- errlev = 1;
+
+ numsig = SIGTERM;
+ if (**argv == '-') {
+ ++*argv;
+ if (isalpha(**argv)) {
+ if (!strncasecmp(*argv, "sig", 3))
+ *argv += 3;
+ for (numsig = NSIG, p = sys_signame + 1; --numsig; ++p)
+ if (!strcasecmp(*p, *argv)) {
+ numsig = p - sys_signame;
+ break;
+ }
+ if (!numsig)
+ nosig(*argv);
+ } else if (isdigit(**argv)) {
+ numsig = strtol(*argv, &ep, 10);
+ if (!*argv || *ep)
+ errx(1, "illegal signal number: %s", *argv);
+ if (numsig <= 0 || numsig > NSIG)
+ nosig(*argv);
+ } else
+ nosig(*argv);
+ ++argv;
+ }
+
+ if (!*argv)
+ usage();
+
+ for (errors = 0; *argv; ++argv) {
+ pid = strtol(*argv, &ep, 10);
+ if (!*argv || *ep) {
+ warnx("illegal process id: %s", *argv);
+ errors = 1;
+ } else if (kill(pid, numsig) == -1) {
+ warn("%s", *argv);
+ errors = 1;
}
- argc--;
- argv++;
}
- return(errlev);
+ exit(errors);
+}
+
+void
+nosig(name)
+ char *name;
+{
+
+ warnx("unknown signal %s; valid signals:", name);
+ printsig(stderr);
+ exit(1);
+}
+
+void
+printsig(fp)
+ FILE *fp;
+{
+ const char *const *p;
+ int cnt;
+
+ for (cnt = NSIG, p = sys_signame + 1; --cnt; ++p) {
+ (void)fprintf(fp, "%s ", *p);
+ if (cnt == NSIG / 2)
+ (void)fprintf(fp, "\n");
+ }
+ (void)fprintf(fp, "\n");
+}
+
+void
+usage()
+{
+
+ (void)fprintf(stderr, "usage: kill [-l] [-sig] pid ...\n");
+ exit(1);
}