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