killall.c revision 7aa651a6a4496d848f86de9b1e6b3a003256a01f
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 7f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob LandleyUSE_KILLALL(NEWTOY(killall, "<1?lq", TOYFLAG_USR|TOYFLAG_BIN)) 8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 9ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL 107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley bool "killall" 117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley default y 127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley help 137aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley usage: killall [-l] [-q] [-SIG] PROCESS_NAME... 14ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 157aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley Send a signal (default: TERM) to all processes with the given names. 16ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 177aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley -l print list of all available signals 187aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley -q don't print any warnings or error messages 19ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/ 20ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 21c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_killall 22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h" 23ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 24c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS( 257aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley int signum; 26ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley) 27ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 28f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landleystatic void kill_process(pid_t pid) 29f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{ 307aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley int ret; 31ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 327aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exitval = 0; 337aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley ret = kill(pid, TT.signum); 34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 357aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill"); 36ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 37ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 38ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void) 39ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{ 407aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley char **names; 41ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 427aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (toys.optflags & FLAG_l) { 437aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley sig_to_num(NULL); 447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley return; 457aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 46ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 477aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley TT.signum = SIGTERM; 487aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exitval++; 494696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley 507aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (!*toys.optargs) { 517aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exithelp = 1; 527aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley error_exit("Process name missing!"); 537aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 54ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 557aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley names = toys.optargs; 56ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 577aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (**names == '-') { 587aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (0 > (TT.signum = sig_to_num((*names)+1))) { 597aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (toys.optflags & FLAG_q) exit(1); 607aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley error_exit("Invalid signal"); 617aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 627aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley names++; 63ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 647aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (!*names) { 657aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley toys.exithelp++; 667aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley error_exit("Process name missing!"); 677aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 687aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 69ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 707aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley for_each_pid_with_name_in(names, kill_process); 71ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 727aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley if (toys.exitval && !(toys.optflags & FLAG_q)) error_exit("No such process"); 73ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 74