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