killall.c revision 06387550f363ca910c5d58d802971ecc181ec6e2
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;
2906387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  char **names;
3006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  short *err;
31ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley)
32ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
33ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwerstatic int kill_process(pid_t pid, char *name)
34f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{
3506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  int offset = 0;
36ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
377d64dae54bde70744a9154b8ac1cbb09d03881c9Rob Landley  if (pid == TT.cur_pid) return 0;
3841b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
3927cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_i) {
4006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    sprintf(toybuf, "Signal %4000s(%d) ?", name, (int)pid);
4106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (!yesno(toybuf, 0)) return 0;
42ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer  }
43ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer
4406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  errno = 0;
4506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  kill(pid, TT.signum);
4606387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (;;) {
4706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (TT.names[offset] == name) {
4806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      TT.err[offset] = errno;
4906387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      break;
5006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    } else offset++;
5106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  }
5206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (errno) {
5306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (!(toys.optflags & FLAG_q)) perror_msg("pid %d", (int)pid);
5406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  } else if (toys.optflags & FLAG_v)
55ca4035bdacfd83f815323c9c597f2683fc4aa218Elie De Brauwer    printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum);
56ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
577d64dae54bde70744a9154b8ac1cbb09d03881c9Rob Landley  return 0;
58ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
59ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
60ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void)
61ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{
6206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  int i;
63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
6406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  TT.names = toys.optargs;
657aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  TT.signum = SIGTERM;
664696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley
6727cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  if (toys.optflags & FLAG_l) {
6827cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    sig_to_num(NULL);
6927cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    return;
707aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
71ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
7206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (**TT.names == '-') {
7306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (0 > (TT.signum = sig_to_num((*TT.names)+1))) {
747aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      if (toys.optflags & FLAG_q) exit(1);
757aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley      error_exit("Invalid signal");
767aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    }
7706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    TT.names++;
7806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    toys.optc--;
7927cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley  }
80ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
8106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (!toys.optc) {
8227cec9ac4ca6c207ea7e74e109e362659f8dfeebRob Landley    toys.exithelp++;
8306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    error_exit("no name");
847aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
85ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley
8641b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer  TT.cur_pid = getpid();
8741b47485578e8b3ee84bf5f81f76500fa7e02e55Elie De Brauwer
8806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  TT.err = xmalloc(2*toys.optc);
8906387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (i=0; i<toys.optc; i++) TT.err[i] = ESRCH;
9006387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  names_to_pid(TT.names, kill_process);
9106387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  for (i=0; i<toys.optc; i++) {
9206387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    if (TT.err[i]) {
9306387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      toys.exitval = 1;
9406387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      errno = TT.err[i];
9506387550f363ca910c5d58d802971ecc181ec6e2Rob Landley      perror_msg("%s", TT.names[i]);
9606387550f363ca910c5d58d802971ecc181ec6e2Rob Landley    }
9706387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  }
9806387550f363ca910c5d58d802971ecc181ec6e2Rob Landley  if (CFG_TOYBOX_FREE) free(TT.err);
99ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}
100