add 1994 copyright
[unix-history] / usr / src / bin / kill / kill.c
index b22244f..7d7307d 100644 (file)
-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 <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)
 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);
 }
 }