xref: /original-bsd/bin/kill/kill.c (revision 7f64fca7)
1 /*
2  * Copyright (c) 1988 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1988 Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)kill.c	5.1 (Berkeley) 06/17/91";
16 #endif /* not lint */
17 
18 #include <signal.h>
19 #include <errno.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <ctype.h>
24 
25 static char *signals[] = {
26 	"hup", "int", "quit", "ill", "trap", "iot",		/*  1 - 6  */
27 	"emt", "fpe", "kill", "bus", "segv", "sys",		/*  7 - 12 */
28 	"pipe", "alrm",  "term", "urg", "stop", "tstp",		/* 13 - 18 */
29 	"cont", "chld", "ttin", "ttou", "io", "xcpu",		/* 19 - 24 */
30 	"xfsz", "vtalrm", "prof", "winch", "29", "usr1",	/* 25 - 30 */
31 	"usr2", NULL,						/* 31 - 32 */
32 };
33 
34 main(argc, argv)
35 	int argc;
36 	char **argv;
37 {
38 	register int errors, numsig, pid;
39 	register char **p;
40 	char *ep;
41 
42 	if (argc < 2)
43 		usage();
44 
45 	if (!strcmp(*++argv, "-l")) {
46 		printsig(stdout);
47 		exit(0);
48 	}
49 
50 	numsig = SIGTERM;
51 	if (**argv == '-') {
52 		++*argv;
53 		if (isalpha(**argv)) {
54 			if (!strncasecmp(*argv, "sig", 3))
55 				*argv += 3;
56 			for (p = signals;; ++p) {
57 				if (!*p)
58 					nosig(*argv);
59 				if (!strcasecmp(*p, *argv)) {
60 					numsig = p - signals + 1;
61 					break;
62 				}
63 			}
64 		} else if (isdigit(**argv)) {
65 			numsig = strtol(*argv, &ep, 10);
66 			if (!*argv || *ep) {
67 				(void)fprintf(stderr,
68 				    "kill: illegal signal number %s\n", *argv);
69 				exit(1);
70 			}
71 			if (numsig <= 0 || numsig > NSIG)
72 				nosig(*argv);
73 		} else
74 			nosig(*argv);
75 		++argv;
76 	}
77 
78 	if (!*argv)
79 		usage();
80 
81 	for (errors = 0; *argv; ++argv) {
82 		pid = strtol(*argv, &ep, 10);
83 		if (!*argv || *ep) {
84 			(void)fprintf(stderr,
85 			    "kill: illegal process id %s\n", *argv);
86 			continue;
87 		}
88 		if (kill(atoi(*argv), numsig) == -1) {
89 			(void)fprintf(stderr,
90 			    "kill: %s: %s\n", *argv, strerror(errno));
91 			errors = 1;
92 		}
93 	}
94 	exit(errors);
95 }
96 
97 nosig(name)
98 	char *name;
99 {
100 	(void)fprintf(stderr,
101 	    "kill: unknown signal %s; valid signals:\n", name);
102 	printsig(stderr);
103 	exit(1);
104 }
105 
106 printsig(fp)
107 	FILE *fp;
108 {
109 	register char **p;
110 
111 	for (p = signals; *p; ++p) {
112 		(void)fprintf(fp, "%s ", *p);
113 		if ((p - signals) == NSIG / 2 - 1)
114 			(void)fprintf(fp, "\n");
115 	}
116 	(void)fprintf(fp, "\n");
117 }
118 
119 usage()
120 {
121 	(void)fprintf(stderr, "usage: kill [-l] [-sig] pid ...\n");
122 	exit(1);
123 }
124