diff options
Diffstat (limited to 'procps')
-rw-r--r-- | procps/free.c | 35 | ||||
-rw-r--r-- | procps/kill.c | 112 |
2 files changed, 119 insertions, 28 deletions
diff --git a/procps/free.c b/procps/free.c new file mode 100644 index 000000000..36d357522 --- /dev/null +++ b/procps/free.c @@ -0,0 +1,35 @@ +/* + * Mini free implementation for busybox + * + * Copyright (C) 1999 by Lineo, inc. + * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org> + * + * 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 "internal.h" +#include <stdio.h> + + +#if ! defined BB_FEATURE_USE_PROCFS +#error Sorry, I depend on the /proc filesystem right now. +#endif + +extern int free_main(int argc, char **argv) +{ + char* cmd[] = { "cat", "/proc/meminfo", "\0" }; + exit(cat_main( 3, cmd)); +} diff --git a/procps/kill.c b/procps/kill.c index 8cc2b044e..0ba6d76ce 100644 --- a/procps/kill.c +++ b/procps/kill.c @@ -26,8 +26,14 @@ #include <unistd.h> #include <signal.h> #include <ctype.h> +#include <sys/stat.h> +#include <unistd.h> + +static const char* kill_usage = "kill [-signal] process-id [process-id ...]\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"; -const char kill_usage[] = "kill [-signal] process-id [process-id ...]\n"; struct signal_name { const char *name; @@ -114,42 +120,92 @@ const struct signal_name signames[] = { extern int kill_main (int argc, char **argv) { int sig = SIGTERM; + + argc--; + argv++; + /* Parse any options */ + if (argc < 1) + usage(kill_usage); - if ( argc < 2 ) - usage (kill_usage); + while (argc > 0 && **argv == '-') { + while (*++(*argv)) { + switch (**argv) { + case 'l': + { + int col=0; + const struct signal_name *s = signames; - if ( **(argv+1) == '-' ) { - if (isdigit( *(*(++argv)+1) )) { - sig = atoi (*argv); - if (sig < 0 || sig >= NSIG) - goto end; - } - else { - const struct signal_name *s = signames; - while (s->name != 0) { - if (strcasecmp (s->name, *argv+1) == 0) { - sig = s->number; - break; + 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(kill_usage); + default: + { + if (isdigit( **argv)) { + sig = atoi (*argv); + if (sig < 0 || sig >= NSIG) + goto end; + else { + argc--; + argv++; + goto do_it_now; + } + } + 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; + } + s++; + } + if (s->name == 0) + goto end; + } } - s++; } - if (s->name == 0) - goto end; + argc--; + argv++; } } - while (--argc > 1) { - int pid; - if (! isdigit( **(++argv))) { - fprintf(stderr, "bad PID: %s\n", *argv); - exit( FALSE); - } - pid = atoi (*argv); - if (kill (pid, sig) != 0) { - perror (*argv); - exit ( FALSE); +do_it_now: + + while (argc >= 1) { + int pid; + struct stat statbuf; + char pidpath[20]="/proc/"; + + 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 (kill (pid, sig) != 0) { + perror (*argv); + exit ( FALSE); + } + argv++; } + exit ( TRUE); + end: fprintf(stderr, "bad signal name: %s\n", *argv); |