X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=procps%2Fkill.c;h=22bb98a120d4c014970626906c8f472706483149;hb=75a5684793da59f8ed4c7fc6b05bc2bf148d06b1;hp=da025fafc963f1099ff8ee9ffa35bd16da664a8a;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/procps/kill.c b/procps/kill.c index da025fafc..22bb98a12 100644 --- a/procps/kill.c +++ b/procps/kill.c @@ -1,140 +1,153 @@ -#include "internal.h" +/* vi: set sw=4 ts=4: */ +/* + * Mini kill/killall implementation for busybox + * + * Copyright (C) 1995, 1996 by Bruce Perens . + * Copyright (C) 1999-2003 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + #include #include +#include #include #include +#include +#include +#include +#include "busybox.h" -const char kill_usage[] = "kill [-signal] process-id [process-id ...]\n"; - -struct signal_name { - const char * name; - int number; -}; - -const struct signal_name signames[] = { - { "HUP", SIGHUP }, - { "INT", SIGINT }, - { "QUIT", SIGQUIT }, - { "ILL", SIGILL }, - { "TRAP", SIGTRAP }, - { "ABRT", SIGABRT }, -#ifndef __alpha__ - { "IOT", SIGIOT }, -#endif -#if defined(sparc) || defined(__alpha__) - { "EMT", SIGEMT }, -#else - { "BUS", SIGBUS }, -#endif - { "FPE", SIGFPE }, - { "KILL", SIGKILL }, -#if defined(sparc) || defined(__alpha__) - { "BUS", SIGBUS }, -#else - { "USR1", SIGUSR1 }, -#endif - { "SEGV", SIGSEGV }, -#if defined(sparc) || defined(__alpha__) - { "SYS", SIGSYS }, -#else - { "USR2", SIGUSR2 }, -#endif - { "PIPE", SIGPIPE }, - { "ALRM", SIGALRM }, - { "TERM", SIGTERM }, -#if defined(sparc) || defined(__alpha__) - { "URG", SIGURG }, - { "STOP", SIGSTOP }, - { "TSTP", SIGTSTP }, - { "CONT", SIGCONT }, - { "CHLD", SIGCHLD }, - { "TTIN", SIGTTIN }, - { "TTOU", SIGTTOU }, - { "IO", SIGIO }, -# ifndef __alpha__ - { "POLL", SIGIO }, -# endif - { "XCPU", SIGXCPU }, - { "XFSZ", SIGXFSZ }, - { "VTALRM", SIGVTALRM }, - { "PROF", SIGPROF }, - { "WINCH", SIGWINCH }, -# ifdef __alpha__ - { "INFO", SIGINFO }, -# else - { "LOST", SIGLOST }, -# endif - { "USR1", SIGUSR1 }, - { "USR2", SIGUSR2 }, +#define KILL 0 +#define KILLALL 1 + +extern int kill_main(int argc, char **argv) +{ + int whichApp, signo = SIGTERM, quiet = 0; + const char *name; + int errors = 0; + +#ifdef CONFIG_KILLALL + /* Figure out what we are trying to do here */ + whichApp = (strcmp(bb_applet_name, "killall") == 0)? KILLALL : KILL; #else - { "STKFLT", SIGSTKFLT }, - { "CHLD", SIGCHLD }, - { "CONT", SIGCONT }, - { "STOP", SIGSTOP }, - { "TSTP", SIGTSTP }, - { "TTIN", SIGTTIN }, - { "TTOU", SIGTTOU }, - { "URG", SIGURG }, - { "XCPU", SIGXCPU }, - { "XFSZ", SIGXFSZ }, - { "VTALRM", SIGVTALRM }, - { "PROF", SIGPROF }, - { "WINCH", SIGWINCH }, - { "IO", SIGIO }, - { "POLL", SIGPOLL }, - { "PWR", SIGPWR }, - { "UNUSED", SIGUNUSED }, + whichApp = KILL; #endif - { 0, 0 } -}; -extern int -kill_main(struct FileInfo * i, int argc, char * * argv) -{ - int had_error = 0; - int sig = SIGTERM; - if ( argv[1][0] == '-' ) { - if ( argv[1][1] >= '0' && argv[1][1] <= '9' ) { - sig = atoi(&argv[1][1]); - if ( sig < 0 || sig >= NSIG ) { - usage(kill_usage); - exit(-1); - } - } - else { - const struct signal_name * s = signames; - for ( ; ; ) { - if ( strcmp(s->name, &argv[1][1]) == 0 ) { - sig = s->number; - break; - } - s++; - if ( s->name == 0 ) { - usage(kill_usage); - exit(-1); + /* Parse any options */ + 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; } } + 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; + } + + /* 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; + } } - while ( argc > 1 ) { - int pid; - if ( argv[1][0] < '0' || argv[1][0] > '9' ) { - usage(kill_usage); - exit(-1); + + 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: + + if (whichApp == KILL) { + /* Looks like they want to do a kill. Do that */ + while (--argc >= 0) { + int pid; + + if (!isdigit(**argv)) + bb_error_msg_and_die( "Bad PID '%s'", *argv); + pid = strtol(*argv, NULL, 0); + if (kill(pid, signo) != 0) { + bb_perror_msg( "Could not kill pid '%d'", pid); + errors++; + } + argv++; } - pid = atoi(argv[1]); - if ( kill(pid, sig) != 0 ) { - had_error = 1; - perror(argv[1]); + + } +#ifdef CONFIG_KILLALL + else { + pid_t myPid=getpid(); + /* Looks like they want to do a killall. Do that */ + while (--argc >= 0) { + 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); + } + } + } + free(pidList); + argv++; } - argv++; - argc--; } - if ( had_error ) - return -1; - else - return 0; +#endif + return errors; }