X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=procps%2Fkill.c;h=25a8d012467ac86cde9c236bf07ee4078663c6c3;hb=14f5c8d764ab7429367feb407ab86191054e6a8a;hp=44cb38395fb4012dcd2a16fd9ef68b782f63bd00;hpb=e58771e73c0d8589a458ede4088f5ba70eff917b;p=oweals%2Fbusybox.git diff --git a/procps/kill.c b/procps/kill.c index 44cb38395..25a8d0124 100644 --- a/procps/kill.c +++ b/procps/kill.c @@ -3,6 +3,7 @@ * Mini kill/killall implementation for busybox * * Copyright (C) 1995, 1996 by Bruce Perens . + * Copyright (C) 1999-2004 by Erik Andersen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,180 +22,89 @@ */ -#include "internal.h" #include #include #include #include #include #include -#include +#include #include +#include "busybox.h" -static const char *kill_usage = - "kill [-signal] process-id [process-id ...]\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nSend a signal (default is SIGTERM) to the specified process(es).\n\n" - "Options:\n" "\t-l\tList all signal names and numbers.\n\n" -#endif - ; - -#ifdef BB_KILLALL -static const char *killall_usage = - "killall [-signal] process-name [process-name ...]\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nSend a signal (default is SIGTERM) to the specified process(es).\n\n" - "Options:\n" "\t-l\tList all signal names and numbers.\n\n" -#endif -#endif - ; - -#define KILL 0 -#define KILLALL 1 - -struct signal_name { - const char *name; - int number; -}; - -const struct signal_name signames[] = { - /* Everything, order not important */ - {"HUP", SIGHUP}, - {"INT", SIGINT}, - {"QUIT", SIGQUIT}, - {"ILL", SIGILL}, - {"TRAP", SIGTRAP}, - {"ABRT", SIGABRT}, - {"FPE", SIGFPE}, - {"KILL", SIGKILL}, - {"SEGV", SIGSEGV}, - {"PIPE", SIGPIPE}, - {"ALRM", SIGALRM}, - {"TERM", SIGTERM}, - {"BUS", SIGBUS}, - {"USR1", SIGUSR1}, - {"USR2", SIGUSR2}, - {"STOP", SIGSTOP}, - {"CONT", SIGCONT}, - {"TTIN", SIGTTIN}, - {"TTOU", SIGTTOU}, - {"IO", SIGIO}, - {"TSTP", SIGTSTP}, - {"CHLD", SIGCHLD}, - {"XCPU", SIGXCPU}, - {"XFSZ", SIGXFSZ}, - {"PROF", SIGPROF}, - {"WINCH", SIGWINCH}, - {"URG", SIGURG}, - {"VTALRM", SIGVTALRM}, -#ifndef __alpha__ - /* everything except alpha */ - {"IOT", SIGIOT}, - {"POLL", SIGPOLL}, -#endif -#if defined(__sparc__) || defined(__alpha__) || defined(__mips__) - /* everthing except intel */ - {"EMT", SIGEMT}, - {"SYS", SIGSYS}, -# ifdef __alpha__ - /* alpha only */ - {"LOST", SIGLOST}, -#endif -#ifdef __sparc__ - /* space only */ - {"INFO", SIGINFO}, -#endif -#ifdef __mips__ - /* mips only */ - {"CLD", SIGCLD}, - {"PWR", SIGPWR}, -#endif -#else - /* intel only */ - {"STKFLT", SIGSTKFLT}, - {"PWR", SIGPWR}, - {"UNUSED", SIGUNUSED}, -#endif - {0, 0} -}; +#define KILL 0 +#define KILLALL 1 extern int kill_main(int argc, char **argv) { - int whichApp, sig = SIGTERM; - const char *appUsage; + int whichApp, signo = SIGTERM; + const char *name; + int errors = 0; -#ifdef BB_KILLALL +#ifdef CONFIG_KILLALL + int quiet=0; /* Figure out what we are trying to do here */ - whichApp = (strcmp(applet_name, "killall") == 0)? KILLALL : KILL; - appUsage = (whichApp == KILLALL)? killall_usage : kill_usage; + whichApp = (strcmp(bb_applet_name, "killall") == 0)? KILLALL : KILL; #else whichApp = KILL; - appUsage = kill_usage; #endif - argc--; - argv++; /* Parse any options */ - if (argc < 1) - usage(appUsage); - - while (argc > 0 && **argv == '-') { - while (*++(*argv)) { - switch (**argv) { - case 'l': - { - int col = 0; - const struct signal_name *s = signames; - - while (s->name != 0) { - col += - fprintf(stderr, "%2d) %-8s", s->number, - (s++)->name); - if (col > 60) { - fprintf(stderr, "\n"); - col = 0; - } - } - fprintf(stderr, "\n\n"); - exit(TRUE); - } - break; - case '-': - usage(appUsage); - default: - { - if (isdigit(**argv)) { - sig = atoi(*argv); - if (sig < 0 || sig >= NSIG) - goto end; - else { - argc--; - argv++; - goto do_it_now; - } - } else { - const struct signal_name *s = signames; - - while (s->name != 0) { - if (strcasecmp(s->name, *argv) == 0) { - sig = s->number; - argc--; - argv++; - goto do_it_now; - } - s++; - } - if (s->name == 0) - goto end; - } + if (argc < 2) + bb_show_usage(); + + if(argv[1][0] != '-'){ + argv++; + argc--; + goto do_it_now; + } + + /* The -l option, which prints out signal names. */ + if(argv[1][1]=='l' && argv[1][2]=='\0'){ + if(argc==2) { + /* Print the whole signal list */ + int col = 0; + for(signo=1; signo < NSIG; signo++) { + name = u_signal_names(0, &signo, 1); + if(name==NULL) /* unnamed */ + continue; + col += printf("%2d) %-16s", signo, name); + if (col > 60) { + printf("\n"); + col = 0; } } - argc--; - argv++; + printf("\n"); + + } else { + for(argv++; *argv; argv++) { + name = u_signal_names(*argv, &signo, -1); + if(name!=NULL) + printf("%s\n", name); + } + } + /* If they specified -l, were all done */ + return EXIT_SUCCESS; + } + +#ifdef CONFIG_KILLALL + /* The -q quiet option */ + if(argv[1][1]=='q' && argv[1][2]=='\0'){ + quiet++; + argv++; + argc--; + if(argc<2 || argv[1][0] != '-'){ + goto do_it_now; } } +#endif + + if(!u_signal_names(argv[1]+1, &signo, 0)) + bb_error_msg_and_die( "bad signal name '%s'", argv[1]+1); + argv+=2; + argc-=2; - do_it_now: +do_it_now: if (whichApp == KILL) { /* Looks like they want to do a kill. Do that */ @@ -202,45 +112,45 @@ extern int kill_main(int argc, char **argv) int pid; if (!isdigit(**argv)) - fatalError( "Bad PID: %s\n", strerror(errno)); + bb_error_msg_and_die( "Bad PID '%s'", *argv); pid = strtol(*argv, NULL, 0); - if (kill(pid, sig) != 0) - fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno)); + if (kill(pid, signo) != 0) { + bb_perror_msg( "Could not kill pid '%d'", pid); + errors++; + } argv++; } - } -#ifdef BB_KILLALL + + } +#ifdef CONFIG_KILLALL else { - int all_found = TRUE; pid_t myPid=getpid(); /* Looks like they want to do a killall. Do that */ while (--argc >= 0) { - pid_t* pidList; - - pidList = findPidByName( *argv); - if (!pidList) { - all_found = FALSE; - errorMsg( "%s: no process killed\n", *argv); - } - - for(; pidList && *pidList!=0; pidList++) { - if (*pidList==myPid) - continue; - if (kill(*pidList, sig) != 0) - fatalError( "Could not kill pid '%d': %s\n", *pidList, strerror(errno)); + long* pidList; + + pidList = find_pid_by_name(*argv); + if (!pidList || *pidList<=0) { + errors++; + if (quiet==0) + bb_error_msg( "%s: no process killed", *argv); + } else { + long *pl; + + for(pl = pidList; *pl !=0 ; pl++) { + if (*pl==myPid) + continue; + if (kill(*pl, signo) != 0) { + errors++; + if (quiet==0) + bb_perror_msg( "Could not kill pid '%ld'", *pl); + } + } } - /* Note that we don't bother to free the memory - * allocated in findPidByName(). It will be freed - * upon exit, so we can save a byte or two */ + free(pidList); argv++; } - exit (all_found); } #endif - - exit(TRUE); - - - end: - fatalError( "bad signal name: %s\n", *argv); + return errors; }