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.2 (Berkeley) 06/19/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(pid, 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