An und für sich schön, nur sendet killall standardmäßig (unter *nix) TERM, dein killall killt die Prozesse aber einfach gnadenlos - sollte man vielleicht noch einmal überdenken/überarbeiten, sodass auch vielleicht andere Signale möglich sind. Und der Copyright-Header ist falsch, das Jahr stimmt nicht und du bist glaube ich nicht Kevin ;-) On Wed, Mar 27, 2013 at 10:46:57PM +0100, Stefan Linke wrote: > + Neuen Shell-Befehl killall implementiert, der alle Prozesse mit gegebenem Namen killt. > > Signed-off-by: Stefan Linke <particleflux@xxxxxxxxx> > --- > src/modules/c/shell/cmds/killall.c | 118 +++++++++++++++++++++++++++++++++++++ > src/modules/c/shell/lang/lang_en.c | 14 +++++ > src/modules/c/shell/lang/resstr.h | 5 ++ > src/modules/c/shell/shell.c | 1 + > src/modules/c/shell/shell.h | 1 + > 5 files changed, 139 insertions(+) > create mode 100644 src/modules/c/shell/cmds/killall.c > > diff --git a/src/modules/c/shell/cmds/killall.c b/src/modules/c/shell/cmds/killall.c > new file mode 100644 > index 0000000..48eec14 > --- /dev/null > +++ b/src/modules/c/shell/cmds/killall.c > @@ -0,0 +1,118 @@ > +/* > + * Copyright (c) 2009 The tyndur Project. All rights reserved. > + * > + * This code is derived from software contributed to the tyndur Project > + * by Kevin Wolf > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. All advertising materials mentioning features or use of this software > + * must display the following acknowledgement: > + * This product includes software developed by the tyndur Project > + * and its contributors. > + * 4. Neither the name of the tyndur Project nor the names of its > + * contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED > + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR > + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR > + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, > + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, > + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; > + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, > + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR > + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF > + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include <stdlib.h> > +#include <stdio.h> > +#include <string.h> > +#include <syscall.h> > +#include <lost/config.h> > + > +#include <errno.h> > +#include <signal.h> > +#include <tms.h> > + > +static void killall_display_usage(void); > + > +#ifdef CONFIG_SHELL_BUILTIN_ONLY > + int shell_command_killall(int argc, char* argv[], const char* args) > +#else > + int main(int argc, char* argv[]) > +#endif > +{ > + int ret=0,i=0,fail=0,matches=0; > + task_info_t *task_info = NULL; > + char *process; > + char copied_cmdline[255]; > + > + if (argc < 2) { > + killall_display_usage(); > + return -1; > + } > + > + task_info = enumerate_tasks(); > + > + if (task_info == NULL) { > + return EXIT_FAILURE; > + } > + > + > + for (i = 0; i < task_info->task_count; ++i) { > + strncpy(copied_cmdline, task_info->tasks[i].cmdline, 255); > + > + process = strtok((char *) task_info->tasks[i].cmdline, " "); > + process = process == NULL > + ? strrchr(task_info->tasks[i].cmdline, '/') > + : strrchr(process, '/'); > + ++process; > + > + if (strcmp(argv[1], process) == 0) { > + ++matches; > + ret = kill(task_info->tasks[i].pid, SIGTERM); > + > + if (ret < 0) { > + printf(TMS(killall_cant_kill, > + "Konnte pid %d - %s nicht beenden: %s (%s)\n"), > + task_info->tasks[i].pid, errno, strerror(errno)); > + > + if (!fail) { > + fail = 1; > + } > + } else { > + printf(TMS(killall_killed, "pid %d beendet\n"), > + task_info->tasks[i].pid); > + } > + } > + > + process = NULL; > + } > + > + mem_free(task_info, task_info->info_size); > + > + if (matches == 0) { > + printf(TMS(killall_not_found, "Kein passender Prozess gefunden\n")); > + } > + > + if (fail) { > + return EXIT_FAILURE; > + } > + > + return EXIT_SUCCESS; > +} > + > +static void killall_display_usage() > +{ > + printf(TMS(killall_usage, "Aufruf: killall <name>\n")); > +} > + > diff --git a/src/modules/c/shell/lang/lang_en.c b/src/modules/c/shell/lang/lang_en.c > index 3366190..c16abcf 100644 > --- a/src/modules/c/shell/lang/lang_en.c > +++ b/src/modules/c/shell/lang/lang_en.c > @@ -250,6 +250,20 @@ static const struct tms_strings dict[] = { > > > > + &__tms_killall_usage, > + "usage: killall <name>\n", > + > + &__tms_killall_not_found, > + "no matching process found\n", > + > + &__tms_killall_killed, > + "pid %d killed\n", > + > + &__tms_killall_cant_kill, > + "couldn't kill pid %d - %s: %s (%s)\n", > + > + > + > &__tms_ln_usage, > "\nUsage: ln <target> <link-path>\n\n" > "Create hardlink to file/directory <target> at <link-path>.\n", > diff --git a/src/modules/c/shell/lang/resstr.h b/src/modules/c/shell/lang/resstr.h > index 5a11d64..fdff7b9 100644 > --- a/src/modules/c/shell/lang/resstr.h > +++ b/src/modules/c/shell/lang/resstr.h > @@ -85,6 +85,11 @@ extern void* __tms_kill_usage; > extern void* __tms_kill_not_found; > extern void* __tms_kill_error; > > +extern void* __tms_killall_usage; > +extern void* __tms_killall_not_found; > +extern void* __tms_killall_cant_kill; > +extern void* __tms_killall_killed; > + > extern void* __tms_ln_usage; > extern void* __tms_ln_error; > > diff --git a/src/modules/c/shell/shell.c b/src/modules/c/shell/shell.c > index 55a3f3b..cdca2f1 100644 > --- a/src/modules/c/shell/shell.c > +++ b/src/modules/c/shell/shell.c > @@ -87,6 +87,7 @@ shell_command_t shell_commands[] = { > {"echo", &shell_command_echo}, > {"free", &shell_command_free}, > {"kill", &shell_command_kill}, > + {"killall", &shell_command_killall}, > {"ls", &shell_command_ls}, > {"mkdir", &shell_command_mkdir}, > {"pipe", &shell_command_pipe}, > diff --git a/src/modules/c/shell/shell.h b/src/modules/c/shell/shell.h > index 40f91c9..8e94409 100644 > --- a/src/modules/c/shell/shell.h > +++ b/src/modules/c/shell/shell.h > @@ -68,6 +68,7 @@ int shell_command_clear(int argc, char* argv[], const char* args); > int shell_command_echo(int argc, char* argv[], const char* args); > int shell_command_free(int argc, char* argv[], const char* args); > int shell_command_kill(int argc, char* argv[], const char* args); > + int shell_command_killall(int argc, char* argv[], const char* args); > int shell_command_ls(int argc, char* argv[], const char* args); > int shell_command_mkdir(int argc, char* argv[], const char* args); > int shell_command_pipe(int argc, char* argv[], const char* args); > -- > 1.8.1.5 > > _______________________________________________ > tyndur-devel mailing list > tyndur-devel@xxxxxxxxxx > http://list.tyndur.org/mailman/listinfo/tyndur-devel
Attachment:
pgpGzAqbR9Ck4.pgp
Description: PGP signature