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