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
7f070ec01d918ff0474a0a5fc9aa745fcd848622aRob LandleyUSE_KILLALL(NEWTOY(killall, "?s:lqvi", TOYFLAG_USR|TOYFLAG_BIN))
8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
9ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL
107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  bool "killall"
117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  default y
127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  help
13f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley    usage: killall [-l] [-iqv] [-SIGNAL|-s SIGNAL] 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
20f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley    -s	send SIGNAL instead of SIGTERM
2127cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    -v	report if the signal was successfully sent
22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/
23ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
24c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_killall
25ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h"
26ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
27c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS(
28f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley  char *sig;
29f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley
307aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int signum;
3141b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  pid_t cur_pid;
3206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  char **names;
3306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  short *err;
34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley)
35ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
36ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwerstatic int kill_process(pid_t pid, char *name)
37f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{
3806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  int offset = 0;
39ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
407d64dae54bde70744a9154b8ac1cbb09d03881c9Rob Landley  if (pid == TT.cur_pid) return 0;
4141b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
4227cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_i) {
433d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley    snprintf(toybuf, sizeof(toybuf), "Signal %s(%d) ?", name, (int)pid);
4406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (!yesno(toybuf, 0)) return 0;
45ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer  }
46ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer
4706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  errno = 0;
4806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  kill(pid, TT.signum);
4906387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (;;) {
5006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (TT.names[offset] == name) {
5106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      TT.err[offset] = errno;
5206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      break;
5306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    } else offset++;
5406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  }
5506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (errno) {
5606387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (!(toys.optflags & FLAG_q)) perror_msg("pid %d", (int)pid);
5706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  } else if (toys.optflags & FLAG_v)
58ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer    printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum);
59ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
607d64dae54bde70744a9154b8ac1cbb09d03881c9Rob Landley  return 0;
61ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
62ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void)
64ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{
6506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  int i;
66ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
6706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  TT.names = toys.optargs;
687aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  TT.signum = SIGTERM;
694696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley
7027cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_l) {
7127cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    sig_to_num(NULL);
7227cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    return;
737aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
74ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
7508ac30d8606934a7bd8107312b0b2f3beeb315f5?ukasz Szpakowski  if (TT.sig || (*TT.names && **TT.names == '-')) {
76f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley    if (0 > (TT.signum = sig_to_num(TT.sig ? TT.sig : (*TT.names)+1))) {
777aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      if (toys.optflags & FLAG_q) exit(1);
787aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      error_exit("Invalid signal");
797aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    }
80f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley    if (!TT.sig) {
81f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley      TT.names++;
82f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley      toys.optc--;
83f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley    }
8427cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  }
85ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
86f070ec01d918ff0474a0a5fc9aa745fcd848622aRob Landley  if (!(toys.optflags & FLAG_l) && !toys.optc) {
8727cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    toys.exithelp++;
8806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    error_exit("no name");
897aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
90ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
9141b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  TT.cur_pid = getpid();
9241b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
9306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  TT.err = xmalloc(2*toys.optc);
9406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (i=0; i<toys.optc; i++) TT.err[i] = ESRCH;
9506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  names_to_pid(TT.names, kill_process);
9606387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (i=0; i<toys.optc; i++) {
9706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (TT.err[i]) {
9806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      toys.exitval = 1;
9906387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      errno = TT.err[i];
10006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      perror_msg("%s", TT.names[i]);
10106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    }
10206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  }
10306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (CFG_TOYBOX_FREE) free(TT.err);
104ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
105