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