Home | History | Annotate | Download | only in toolbox
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <errno.h>
      4 
      5 #include <sys/types.h>
      6 #include <signal.h>
      7 
      8 static struct {
      9     unsigned int number;
     10     char *name;
     11 } signals[] = {
     12 #define _SIG(name) {SIG##name, #name}
     13     /* Single Unix Specification signals */
     14     _SIG(ABRT),
     15     _SIG(ALRM),
     16     _SIG(FPE),
     17     _SIG(HUP),
     18     _SIG(ILL),
     19     _SIG(INT),
     20     _SIG(KILL),
     21     _SIG(PIPE),
     22     _SIG(QUIT),
     23     _SIG(SEGV),
     24     _SIG(TERM),
     25     _SIG(USR1),
     26     _SIG(USR2),
     27     _SIG(CHLD),
     28     _SIG(CONT),
     29     _SIG(STOP),
     30     _SIG(TSTP),
     31     _SIG(TTIN),
     32     _SIG(TTOU),
     33     _SIG(BUS),
     34     _SIG(POLL),
     35     _SIG(PROF),
     36     _SIG(SYS),
     37     _SIG(TRAP),
     38     _SIG(URG),
     39     _SIG(VTALRM),
     40     _SIG(XCPU),
     41     _SIG(XFSZ),
     42     /* non-SUS signals */
     43     _SIG(IO),
     44     _SIG(PWR),
     45     _SIG(STKFLT),
     46     _SIG(WINCH),
     47 #undef _SIG
     48 };
     49 
     50 /* To indicate a matching signal was not found */
     51 static const unsigned int SENTINEL = (unsigned int) -1;
     52 
     53 void list_signals()
     54 {
     55     unsigned int sorted_signals[_NSIG];
     56     unsigned int i;
     57     unsigned int num;
     58 
     59     memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
     60 
     61     // Sort the signals
     62     for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
     63         sorted_signals[signals[i].number] = i;
     64     }
     65 
     66     num = 0;
     67     for (i = 1; i < _NSIG; i++) {
     68         unsigned int index = sorted_signals[i];
     69         if (index == SENTINEL) {
     70             continue;
     71         }
     72 
     73         fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
     74 
     75         if ((num++ % 4) == 3) {
     76             fprintf(stderr, "\n");
     77         }
     78     }
     79 
     80     if ((num % 4) == 3) {
     81         fprintf(stderr, "\n");
     82     }
     83 }
     84 
     85 unsigned int name_to_signal(const char* name)
     86 {
     87     unsigned int i;
     88 
     89     for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
     90         if (!strcasecmp(name, signals[i].name)) {
     91             return signals[i].number;
     92         }
     93     }
     94 
     95     return SENTINEL;
     96 }
     97 
     98 int kill_main(int argc, char **argv)
     99 {
    100     unsigned int sig = SIGTERM;
    101     int result = 0;
    102 
    103     argc--;
    104     argv++;
    105 
    106     if (argc >= 1 && argv[0][0] == '-') {
    107         char *endptr;
    108         size_t arg_len = strlen(argv[0]);
    109         if (arg_len < 2) {
    110             fprintf(stderr, "invalid argument: -\n");
    111             return -1;
    112         }
    113 
    114         char* arg = argv[0] + 1;
    115         if (arg_len == 2 && *arg == 'l') {
    116             list_signals();
    117             return 0;
    118         }
    119 
    120         sig = strtol(arg, &endptr, 10);
    121         if (*endptr != '\0') {
    122             sig = name_to_signal(arg);
    123             if (sig == SENTINEL) {
    124                 fprintf(stderr, "invalid signal name: %s\n", arg);
    125                 return -1;
    126             }
    127         }
    128 
    129         argc--;
    130         argv++;
    131     }
    132 
    133     while(argc > 0){
    134         int pid = atoi(argv[0]);
    135         int err = kill(pid, sig);
    136         if (err < 0) {
    137             result = err;
    138             fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
    139         }
    140 
    141         argc--;
    142         argv++;
    143     }
    144 
    145     return result;
    146 }
    147