killall.c revision 4696bfc4057e87ea8a66bd64aafb9ca14a64290e
1ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley/* vi: set sw=4 ts=4: 2ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * 3f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley * killall.c - Send signal (default: TERM) to all processes with given names. 4ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * 5ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * Copyright 2012 Andreas Heck <aheck@gmx.de> 6ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * 7ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley * Not in SUSv4. 8ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 9f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob LandleyUSE_KILLALL(NEWTOY(killall, "<1?lq", TOYFLAG_USR|TOYFLAG_BIN)) 10ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 11ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyconfig KILLALL 12ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley bool "killall" 13ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley default y 14ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley help 15ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley usage: killall [-l] [-q] [-SIG] PROCESS_NAME... 16ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 17ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley Send a signal (default: TERM) to all processes with the given names. 18ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 19ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley -l print list of all available signals 20ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley -q don't print any warnings or error messages 21ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley*/ 22ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 23ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#include "toys.h" 24ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 25ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#define FLAG_q 1 26ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#define FLAG_l 2 27ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 28ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob LandleyDEFINE_GLOBALS( 29f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley int signum; 30ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley) 31ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley#define TT this.killall 32ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 33ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleystruct signame { 34ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley int num; 354696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley char *name; 36ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}; 37ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 384696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley// Signals required by POSIX 2008: 394696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html 404696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley 414696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley#define SIGNIFY(x) {SIG##x, #x} 424696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley 43ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleystatic struct signame signames[] = { 444696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(ABRT), SIGNIFY(ALRM), SIGNIFY(BUS), SIGNIFY(CHLD), SIGNIFY(CONT), 454696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(FPE), SIGNIFY(HUP), SIGNIFY(ILL), SIGNIFY(INT), SIGNIFY(KILL), 464696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(PIPE), SIGNIFY(QUIT), SIGNIFY(SEGV), SIGNIFY(STOP), SIGNIFY(TERM), 474696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(TSTP), SIGNIFY(TTIN), SIGNIFY(TTOU), SIGNIFY(USR1), SIGNIFY(USR2), 484696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(SYS), SIGNIFY(TRAP), SIGNIFY(URG), SIGNIFY(VTALRM), SIGNIFY(XCPU), 494696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley SIGNIFY(XFSZ) 50ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley}; 51ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 524696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley// SIGNIFY(STKFLT), SIGNIFY(WINCH), SIGNIFY(IO), SIGNIFY(PWR) 53ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 544696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley// Convert name to signal number. If name == NULL print names. 554696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landleystatic int sig_to_num(char *pidstr) 564696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley{ 574696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley int i; 58ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 594696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (pidstr) { 604696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (isdigit(*pidstr)) return atol(pidstr); 614696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (!strncasecmp(pidstr, "sig", 3)) pidstr+=3; 62ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley } 634696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley for (i = 0; i < sizeof(signames)/sizeof(struct signame); i++) 644696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (!pidstr) xputs(signames[i].name); 654696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley else if (!strcasecmp(pidstr, signames[i].name)) 66ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley return signames[i].num; 67ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 68ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley return -1; 69ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 70ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 71f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landleystatic void kill_process(pid_t pid) 72f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley{ 73ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley int ret; 74ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 754696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley toys.exitval = 0; 76ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley ret = kill(pid, TT.signum); 77ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 78f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill"); 79ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 80ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 81ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landleyvoid killall_main(void) 82ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley{ 83ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley char **names; 84ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 85ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley if (toys.optflags & FLAG_l) { 864696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley sig_to_num(NULL); 87f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley return; 88ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley } 89ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 904696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley TT.signum = SIGTERM; 914696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley toys.exitval++; 924696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley 93ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley if (!*toys.optargs) { 94ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley toys.exithelp = 1; 95ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley error_exit("Process name missing!"); 96ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley } 97ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 98ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley names = toys.optargs; 99ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 100f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley if (**names == '-') { 1014696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (0 > (TT.signum = sig_to_num((*names)+1))) { 1024696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (toys.optflags & FLAG_q) exit(1); 1034696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley error_exit("Invalid signal"); 104ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley } 105f42e11b6712f7bd17d1ee2e548f54a2f6d9aed46Rob Landley names++; 106ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 1074696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (!*names) { 1084696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley toys.exithelp++; 1094696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley error_exit("Process name missing!"); 1104696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley } 111ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley } 112ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 113ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley for_each_pid_with_name_in(names, kill_process); 114ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley 1154696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley if (toys.exitval && !(toys.optflags & FLAG_q)) 1164696bfc4057e87ea8a66bd64aafb9ca14a64290eRob Landley error_exit("No such process"); 117ff9ee8fc15e1a41bffe06bfcee30368e7c117601Rob Landley} 118