killall.c revision 27cec9ac4ca6c207ea7e74e109e362659f8dfeeb
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
7ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De BrauwerUSE_KILLALL(NEWTOY(killall, "<1?lqvi", TOYFLAG_USR|TOYFLAG_BIN))
8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
9ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL
107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  bool "killall"
117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  default y
127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  help
1327cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    usage: killall [-l] [-iqv] [-SIG] PROCESS_NAME...
14ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
157aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    Send a signal (default: TERM) to all processes with the given names.
16ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
17ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer    -i	ask for confirmation before killing
1827cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    -l	print list of all available signals
197aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    -q	don't print any warnings or error messages
2027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    -v	report if the signal was successfully sent
21ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/
22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
23c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_killall
24ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h"
25ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
26c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS(
277aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int signum;
2841b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  pid_t cur_pid;
29ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley)
30ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
31ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwerstatic int kill_process(pid_t pid, char *name)
32f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{
337aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int ret;
34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
3541b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  if (pid == TT.cur_pid) return 1;
3641b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
3727cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_i) {
3827cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    sprintf(toybuf, "Signal %s(%d) ?", name, pid);
39ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer    if (yesno(toybuf, 0) == 0) return 1;
40ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer  }
41ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer
427aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  toys.exitval = 0;
43ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer
447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  ret = kill(pid, TT.signum);
45ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer  if (toys.optflags & FLAG_v)
46ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer    printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum);
47ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
487aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill");
497c6209d6c336df74984e62aa88679c06641ae309Elie De Brauwer  return 1;
50ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
51ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
52ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void)
53ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{
5427cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  char **names = toys.optargs;
55ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
567aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  TT.signum = SIGTERM;
577aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  toys.exitval++;
584696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley
5927cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_l) {
6027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    sig_to_num(NULL);
6127cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    return;
627aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
647aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (**names == '-') {
657aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    if (0 > (TT.signum = sig_to_num((*names)+1))) {
667aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      if (toys.optflags & FLAG_q) exit(1);
677aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      error_exit("Invalid signal");
687aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    }
697aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    names++;
7027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  }
71ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
7227cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (!*names) {
7327cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    toys.exithelp++;
7427cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    error_exit("Process name missing!");
757aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
76ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
7741b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  TT.cur_pid = getpid();
7841b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
797aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  for_each_pid_with_name_in(names, kill_process);
80ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
817aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (toys.exitval && !(toys.optflags & FLAG_q)) error_exit("No such process");
82ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
83