X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=procps%2Fkill.c;h=3d6fe80cbc79e9c4ea382b8409953174cf5247c7;hb=cad5364599eb5062d59e0c397ed638ddd61a8d5d;hp=a0b93be2b9caea100665541dbb45aa2a6145f5b7;hpb=3cfa9ec09cbd6742abee95526912269fd2e62a4c;p=oweals%2Fbusybox.git diff --git a/procps/kill.c b/procps/kill.c index a0b93be2b..3d6fe80cb 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-2002 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,181 +22,86 @@ */ -#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 - ; +static const int KILL = 0; +static const int KILLALL = 1; -#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} -}; extern int kill_main(int argc, char **argv) { - int whichApp, sig = SIGTERM; - const char *appUsage; + int whichApp, sig = SIGTERM, quiet; + const char *name; + int errors = 0; -#ifdef BB_KILLALL +#ifdef CONFIG_KILLALL /* Figure out what we are trying to do here */ - whichApp = (strcmp(*argv, "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 + quiet=0; argc--; argv++; /* Parse any options */ if (argc < 1) - usage(appUsage); + bb_show_usage(); 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; +#ifdef CONFIG_KILLALL + case 'q': + quiet++; + break; +#endif + case 'l': + if(argc>1) { + for(argv++; *argv; argv++) { + name = u_signal_names(*argv, &sig, -1); + if(name!=NULL) + printf("%s\n", name); } } 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; + int col = 0; + for(sig=1; sig < NSIG; sig++) { + name = u_signal_names(0, &sig, 1); + if(name==NULL) /* unnamed */ + continue; + col += printf("%2d) %-16s", sig, name); + if (col > 60) { + printf("\n"); + col = 0; } - s++; } - if (s->name == 0) - goto end; + printf("\n"); } - } + return EXIT_SUCCESS; + case '-': + bb_show_usage(); + default: + name = u_signal_names(*argv, &sig, 0); + if(name==NULL) + bb_error_msg_and_die( "bad signal name: %s", *argv); + argc--; + argv++; + goto do_it_now; } argc--; argv++; } } - do_it_now: +do_it_now: if (whichApp == KILL) { /* Looks like they want to do a kill. Do that */ @@ -203,45 +109,45 @@ extern int kill_main(int argc, char **argv) int pid; if (!isdigit(**argv)) - fatalError( "Bad PID: %s\n", strerror(errno)); + bb_perror_msg_and_die( "Bad PID"); pid = strtol(*argv, NULL, 0); - if (kill(pid, sig) != 0) - fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno)); + if (kill(pid, sig) != 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 <= 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, sig) != 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; }