killall.c revision 7aa651a6a4496d848f86de9b1e6b3a003256a01f
17aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley/* killall.c - Send signal (default: TERM) to all processes with given names.
2ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley *
3ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * Copyright 2012 Andreas Heck <aheck@gmx.de>
4ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley *
5f91b7c89bc852868692b9518185421ebb52d67b3Rob Landley * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/killall.html
6ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
7f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob LandleyUSE_KILLALL(NEWTOY(killall, "<1?lq", TOYFLAG_USR|TOYFLAG_BIN))
8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
9ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL
107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  bool "killall"
117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  default y
127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  help
137aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    usage: killall [-l] [-q] [-SIG] PROCESS_NAME...
14ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
157aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    Send a signal (default: TERM) to all processes with the given names.
16ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
177aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    -l	print list of all available signals
187aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    -q	don't print any warnings or error messages
19ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/
20ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
21c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_killall
22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h"
23ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
24c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS(
257aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int signum;
26ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley)
27ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
28f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landleystatic void kill_process(pid_t pid)
29f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{
307aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int ret;
31ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
327aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  toys.exitval = 0;
337aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  ret = kill(pid, TT.signum);
34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
357aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill");
36ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
37ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
38ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void)
39ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{
407aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  char **names;
41ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
427aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (toys.optflags & FLAG_l) {
437aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    sig_to_num(NULL);
447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    return;
457aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
46ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
477aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  TT.signum = SIGTERM;
487aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  toys.exitval++;
494696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley
507aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (!*toys.optargs) {
517aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    toys.exithelp = 1;
527aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    error_exit("Process name missing!");
537aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
54ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
557aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  names = toys.optargs;
56ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
577aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (**names == '-') {
587aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    if (0 > (TT.signum = sig_to_num((*names)+1))) {
597aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      if (toys.optflags & FLAG_q) exit(1);
607aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      error_exit("Invalid signal");
617aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    }
627aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    names++;
63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
647aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    if (!*names) {
657aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      toys.exithelp++;
667aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      error_exit("Process name missing!");
677aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    }
687aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
69ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
707aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  for_each_pid_with_name_in(names, kill_process);
71ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
727aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (toys.exitval && !(toys.optflags & FLAG_q)) error_exit("No such process");
73ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
74