From 56373504548ecfede18eac830a54fbffac489bd3 Mon Sep 17 00:00:00 2001 From: Brett Gordon Date: Wed, 16 Mar 2016 02:15:59 -0400 Subject: [PATCH] kill: more text signals, print list. --- Applications/util/kill.c | 119 +++++++++++++++++++++++++++++++++------ 1 file changed, 103 insertions(+), 16 deletions(-) diff --git a/Applications/util/kill.c b/Applications/util/kill.c index e7d94608..e9bc276b 100644 --- a/Applications/util/kill.c +++ b/Applications/util/kill.c @@ -10,6 +10,99 @@ #include #include +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++; -- 2.34.1