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