diff options
Diffstat (limited to 'kill.c')
-rw-r--r-- | kill.c | 142 |
1 files changed, 0 insertions, 142 deletions
@@ -1,142 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Mini kill/killall implementation for busybox - * - * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>. - * - * 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 <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <signal.h> -#include <ctype.h> -#include <string.h> -#include <unistd.h> -#include "busybox.h" - -static const int KILL = 0; -static const int KILLALL = 1; - - -extern int kill_main(int argc, char **argv) -{ - int whichApp, sig = SIGTERM; - const char *name; - -#ifdef BB_KILLALL - /* Figure out what we are trying to do here */ - whichApp = (strcmp(applet_name, "killall") == 0)? KILLALL : KILL; -#else - whichApp = KILL; -#endif - - argc--; - argv++; - /* Parse any options */ - if (argc < 1) - show_usage(); - - while (argc > 0 && **argv == '-') { - while (*++(*argv)) { - switch (**argv) { - case 'l': - if(argc>1) { - for(argv++; *argv; argv++) { - name = u_signal_names(*argv, &sig, -1); - if(name!=NULL) - printf("%s\n", name); - } - } else { - 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; - } - } - printf("\n"); - } - return EXIT_SUCCESS; - case '-': - show_usage(); - default: - name = u_signal_names(*argv, &sig, 0); - if(name==NULL) - error_msg_and_die( "bad signal name: %s", *argv); - argc--; - argv++; - goto do_it_now; - } - argc--; - argv++; - } - } - - do_it_now: - - if (whichApp == KILL) { - /* Looks like they want to do a kill. Do that */ - while (--argc >= 0) { - int pid; - - if (!isdigit(**argv)) - perror_msg_and_die( "Bad PID"); - pid = strtol(*argv, NULL, 0); - if (kill(pid, sig) != 0) - perror_msg_and_die( "Could not kill pid '%d'", pid); - argv++; - } - } -#ifdef BB_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 = find_pid_by_name( *argv); - if (!pidList || *pidList<=0) { - all_found = FALSE; - error_msg_and_die( "%s: no process killed", *argv); - } - - for(; pidList && *pidList!=0; pidList++) { - if (*pidList==myPid) - continue; - if (kill(*pidList, sig) != 0) - perror_msg_and_die( "Could not kill pid '%d'", *pidList); - } - /* Note that we don't bother to free the memory - * allocated in find_pid_by_name(). It will be freed - * upon exit, so we can save a byte or two */ - argv++; - } - if (all_found == FALSE) - return EXIT_FAILURE; - } -#endif - - return EXIT_SUCCESS; -} |