[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [tyndur-devel] [PATCH] neuer shell-Befehl: killall
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>
Ich habe das jetzt mal so gepusht, aber es gibt noch an ein paar Stellen
Möglichkeiten, nachzuarbeiten. ;-)
> +#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);
copied_cmdline ist nicht nullterminiert, wenn der String zu lang war.
> +
> + process = strtok((char *) task_info->tasks[i].cmdline, " ");
> + process = process == NULL
> + ? strrchr(task_info->tasks[i].cmdline, '/')
> + : strrchr(process, '/');
> + ++process;
Wenn kein / in der Kommandozeile vorkommt, hast du ein Problem.
> +
> + 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;
> + }
Das if ist eigentlich ziemlich überflüssig. Wenn du eine 1 mit noch
einer 1 überschreibst, passiert auch nichts schlimmes.
Kevin