From 246cc6dddd3df2164e8a925ebd8e9a7bba379253 Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Tue, 7 Mar 2000 07:41:42 +0000 Subject: Wrote killall. Adjusted mount, ps, utility.c, etc to handle my nifty new kernel patches the allow busybox to run perfectly without /proc. -Erik --- kill.c | 63 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 23 deletions(-) (limited to 'kill.c') diff --git a/kill.c b/kill.c index 516621232..8a99e0f9e 100644 --- a/kill.c +++ b/kill.c @@ -24,6 +24,7 @@ #include "internal.h" #include #include +#include #include #include #include @@ -35,6 +36,14 @@ static const char *kill_usage = "Send a signal (default is SIGTERM) to the specified process(es).\n\n" "Options:\n" "\t-l\tList all signal names and numbers.\n\n"; +static const char *killall_usage = + "killall [-signal] process-name [process-name ...]\n\n" + "Send a signal (default is SIGTERM) to the specified process(es).\n\n" + "Options:\n" "\t-l\tList all signal names and numbers.\n\n"; + + +#define KILL 0 +#define KILLALL 1 struct signal_name { const char *name; @@ -120,13 +129,19 @@ const struct signal_name signames[] = { extern int kill_main(int argc, char **argv) { - int sig = SIGTERM; + int whichApp, sig = SIGTERM; + const char *appUsage; + + /* Figure out what we are trying to do here */ + whichApp = (strcmp(*argv, "killall") == 0)? + KILLALL : KILL; + appUsage = (whichApp == KILLALL)? killall_usage : kill_usage; argc--; argv++; /* Parse any options */ if (argc < 1) - usage(kill_usage); + usage(appUsage); while (argc > 0 && **argv == '-') { while (*++(*argv)) { @@ -150,7 +165,7 @@ extern int kill_main(int argc, char **argv) } break; case '-': - usage(kill_usage); + usage(appUsage); default: { if (isdigit(**argv)) { @@ -186,32 +201,34 @@ extern int kill_main(int argc, char **argv) do_it_now: - while (--argc >= 0) { - int pid; - struct stat statbuf; - char pidpath[20] = "/proc/"; + if (whichApp == KILL) { + /* Looks like they want to do a kill. Do that */ + while (--argc >= 0) { + int pid; - if (!isdigit(**argv)) { - fprintf(stderr, "bad PID: %s\n", *argv); - exit(FALSE); - } - pid = atoi(*argv); - snprintf(pidpath, 20, "/proc/%s/stat", *argv); - if (stat(pidpath, &statbuf) != 0) { - fprintf(stderr, "kill: (%d) - No such pid\n", pid); - exit(FALSE); + if (!isdigit(**argv)) + fatalError( "Bad PID: %s\n", strerror(errno)); + pid = strtol(*argv, NULL, 0); + if (kill(pid, sig) != 0) + fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno)); + argv++; } - fprintf(stderr, "sig = %d\n", sig); - if (kill(pid, sig) != 0) { - perror(*argv); - exit(FALSE); + } else { + /* Looks like they want to do a killall. Do that */ + while (--argc >= 0) { + int pid; + + while((pid = findPidByName( *argv))) { + if (kill(pid, sig) != 0) + fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno)); + } + argv++; } - argv++; } + exit(TRUE); end: - fprintf(stderr, "bad signal name: %s\n", *argv); - exit(TRUE); + fatalError( "bad signal name: %s\n", *argv); } -- cgit v1.2.3