kill: more text signals, print list.
authorBrett Gordon <beretta42@gmail.com>
Wed, 16 Mar 2016 06:15:59 +0000 (02:15 -0400)
committerBrett Gordon <beretta42@gmail.com>
Wed, 16 Mar 2016 06:15:59 +0000 (02:15 -0400)
Applications/util/kill.c

index e7d9460..e9bc276 100644 (file)
 #include <ctype.h>
 #include <string.h>
 
+struct sigentry 
+{
+       char *suffix;        /* suffix of textual signal name */
+       int  no;             /* number of signal */
+};
+
+struct sigentry sigtab[]={
+       { "HUP",   1 },
+       { "INT",   2 },
+       { "QUIT",  3 },
+       { "ILL",   4 },
+        { "TRAP",  5 },
+       { "ABRT",  6 },
+       { "IOT",   6 },
+       { "BUS",   7 },
+       { "FPE",   8 },
+       { "KILL",  9 },
+       { "USR1",  10},
+       { "SEGV",  11},
+       { "USR2",  12},
+       { "PIPE",  13},
+       { "ALRM",  14},
+       { "TERM",  15},
+       { "STKFLT",16},
+       { "CHLD",  17},
+       { "CONT",  18},
+       { "STOP",  19},
+       { "TSTP",  20},
+       { "TTIN",  21},
+       { "TTOU",  22},
+       { "URG" ,  23},
+       { "XCPU",  24},
+       { "XFSZ",  25},
+       { "VTALRM",26},
+       { "PROF",  27},
+       { "WINCH", 28},
+       { "IO",    29},
+       { "POLL",  29},
+       { "PWR",   30},
+       { "SYS",   31},
+       { "UNUSED",31},
+       { NULL, 0 }
+};
+
+int getsig( char *n )
+{
+       struct sigentry *s=sigtab;
+       while( s->suffix ){
+               if( !strcmp(n,s->suffix) )
+                       return s->no;
+               s=s+1;
+       }
+       return -1;
+}      
+
+void diesig( void )
+{
+       write(2, "kill: unknown signal\n", 21);
+       exit(1);
+}
+
+char *inttoa( int n )
+{
+       static c[10];
+       char *p=&c[9];
+       *--p=0;
+       while( n ){
+               *--p = (n % 10) + '0';
+               n /= 10;
+       }
+       return p;
+}
+
+void printsigs( void )
+{
+       struct sigentry *s=sigtab;
+       int col=0;
+       while( s->suffix ){
+               int l=strlen(s->suffix);
+               char *np=inttoa( s->no );
+               write(2, "SIG", 3 );
+               write(2, s->suffix, l );
+               write(2, "       ", 7-l );
+               write(2, np, strlen(np) );
+               if( col++ & 1 )
+                       write(2, "\n", 1 );
+               else
+                       write(2, "   ", 3 );
+               s=s+1;
+       }
+       exit(0);
+}
+
 int main(int argc, char *argv[])
 {
     char *cp;
@@ -21,26 +114,20 @@ int main(int argc, char *argv[])
     }
     if (argv[1][0] == '-') {
        cp = &argv[1][1];
-       if (!strncmp(cp, "SIG", 3))
-           cp += 3;
-       if (!strcmp(cp, "HUP"))
-           sig = SIGHUP;
-       else if (!strcmp(cp, "INT"))
-           sig = SIGINT;
-       else if (!strcmp(cp, "QUIT"))
-           sig = SIGQUIT;
-       else if (!strcmp(cp, "KILL"))
-           sig = SIGKILL;
-       else if (!strcmp(cp, "TERM"))
-           sig = SIGTERM;
+       if( *cp=='l' ) 
+               printsigs();
+       if (!strncmp(cp, "SIG", 3)){
+               cp += 3;
+               sig=getsig( cp );
+               if( sig < 0 ) 
+                       diesig();
+       }
        else {
            sig = 0;
            while (isdigit(*cp))
                sig = sig * 10 + *cp++ - '0';
-           if (*cp) {
-               write(2, "kill: unknown signal\n", 21);
-               return 1;
-           }
+           if (*cp)
+                   diesig();
        }
        argc--;
        argv++;