kill.c revision a64adba539c290624c27a8506ee6c0ba39f44ffc
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),
45a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    _SIG(STKFLT),
46a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    _SIG(WINCH),
47a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root#undef _SIG
48a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root};
49a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
50a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root/* To indicate a matching signal was not found */
51a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Rootstatic const unsigned int SENTINEL = (unsigned int) -1;
52a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
53a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Rootvoid list_signals()
54a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root{
55a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    unsigned int sorted_signals[_NSIG];
56a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    unsigned int i;
57a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    unsigned int num;
58a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
59a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    memset(sorted_signals, SENTINEL, sizeof(sorted_signals));
60a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
61a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    // Sort the signals
62a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    for (i = 0; i < sizeof(signals)/sizeof(signals[0]); i++) {
63a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        sorted_signals[signals[i].number] = i;
64a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    }
65a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
66a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    num = 0;
67a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    for (i = 1; i < _NSIG; i++) {
68a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        unsigned int index = sorted_signals[i];
69a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if (index == SENTINEL) {
70a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            continue;
71a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
72a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
73a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        fprintf(stderr, "%2d) SIG%-9s ", i, signals[index].name);
74a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
75a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if ((num++ % 4) == 3) {
76a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            fprintf(stderr, "\n");
77a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
78a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    }
79a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
80a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    if ((num % 4) == 3) {
81a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        fprintf(stderr, "\n");
82a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    }
83a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root}
84a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
85a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Rootunsigned int name_to_signal(const char* name)
86a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root{
87a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    unsigned int i;
88a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
89a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    for (i = 1; i < sizeof(signals) / sizeof(signals[0]); i++) {
90a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if (!strcasecmp(name, signals[i].name)) {
91a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            return signals[i].number;
92a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
93a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    }
94a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
95a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    return SENTINEL;
96a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root}
97a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint kill_main(int argc, char **argv)
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
100a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    unsigned int sig = SIGTERM;
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int result = 0;
102a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argc--;
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    argv++;
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
106a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root    if (argc >= 1 && argv[0][0] == '-') {
107a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        char *endptr;
108a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        size_t arg_len = strlen(argv[0]);
109a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if (arg_len < 2) {
110a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            fprintf(stderr, "invalid argument: -\n");
111a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            return -1;
112a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
113a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
114a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        char* arg = argv[0] + 1;
115a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if (arg_len == 2 && *arg == 'l') {
116a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            list_signals();
117a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            return 0;
118a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
119a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
120a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        sig = strtol(arg, &endptr, 10);
121a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        if (*endptr != '\0') {
122a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            sig = name_to_signal(arg);
123a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            if (sig == SENTINEL) {
124a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root                fprintf(stderr, "invalid signal name: %s\n", arg);
125a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root                return -1;
126a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root            }
127a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root        }
128a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc--;
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv++;
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    while(argc > 0){
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int pid = atoi(argv[0]);
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int err = kill(pid, sig);
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (err < 0) {
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            result = err;
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "could not kill pid %d: %s\n", pid, strerror(errno));
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
140a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argc--;
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        argv++;
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
144a64adba539c290624c27a8506ee6c0ba39f44ffcKenny Root
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return result;
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
147