From 008d0be72b2f160382c6e880765e96b64a050c65 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 12:04:58 +0100 Subject: imported original firmware WRT54GL_v4.30.11_11_US --- release/src/router/busybox/kill.c | 142 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 release/src/router/busybox/kill.c (limited to 'release/src/router/busybox/kill.c') diff --git a/release/src/router/busybox/kill.c b/release/src/router/busybox/kill.c new file mode 100644 index 00000000..3884ebdf --- /dev/null +++ b/release/src/router/busybox/kill.c @@ -0,0 +1,142 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini kill/killall implementation for busybox + * + * Copyright (C) 1995, 1996 by Bruce Perens . + * + * 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" + +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; +} -- cgit v1.2.3-54-g00ecf