kill -NMAE
[unix-history] / usr / src / bin / kill / kill.c
index 86603c9..751916e 100644 (file)
@@ -1,9 +1,17 @@
-static char *sccsid = "@(#)kill.c      4.1 (Berkeley) %G%";
+static char *sccsid = "@(#)kill.c      4.2 (Berkeley) %G%";
 /*
  * kill - send signal to process
  */
 
 #include <signal.h>
 /*
  * kill - send signal to process
  */
 
 #include <signal.h>
+#include <ctype.h>
+
+char *signm[] = { 0,
+"HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "EMT", "FPE",      /* 1-8 */
+"KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", 0,       /* 9-16 */
+"STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "TINT", "XCPU",        /* 17-24 */
+"XFSZ", 0, 0, 0, 0, 0, 0, 0,                                   /* 25-31 */
+};
 
 main(argc, argv)
 char **argv;
 
 main(argc, argv)
 char **argv;
@@ -16,11 +24,37 @@ char **argv;
        errlev = 0;
        if (argc <= 1) {
        usage:
        errlev = 0;
        if (argc <= 1) {
        usage:
-               printf("usage: kill [ -signo ] pid ...\n");
+               printf("usage: kill [ -sig ] pid ...\n");
+               printf("for a list of signals: kill -l\n");
                exit(2);
        }
        if (*argv[1] == '-') {
                exit(2);
        }
        if (*argv[1] == '-') {
-               signo = atoi(argv[1]+1);
+               if (argv[1][1] == 'l') {
+                       for (signo = 1; 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 < 1 || signo > NSIG) {
+                               printf("kill: %s: number out of range\n",
+                                   argv[1]);
+                               exit(1);
+                       }
+               } else {
+                       char *name = argv[1]+1;
+                       for (signo = 1; 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
                argc--;
                argv++;
        } else