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