aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toys/killall.c184
1 files changed, 37 insertions, 147 deletions
diff --git a/toys/killall.c b/toys/killall.c
index 5f18a646..44379833 100644
--- a/toys/killall.c
+++ b/toys/killall.c
@@ -26,161 +26,53 @@ config KILLALL
#define FLAG_l 2
DEFINE_GLOBALS(
- int matched;
int signum;
)
#define TT this.killall
struct signame {
int num;
- const char *name;
+ char *name;
};
+// Signals required by POSIX 2008:
+// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
+
+#define SIGNIFY(x) {SIG##x, #x}
+
static struct signame signames[] = {
-#ifdef SIGHUP
- {SIGHUP, "HUP"},
-#endif
-#ifdef SIGINT
- {SIGINT, "INT"},
-#endif
-#ifdef SIGQUIT
- {SIGQUIT, "QUIT"},
-#endif
-#ifdef SIGILL
- {SIGILL, "ILL"},
-#endif
-#ifdef SIGTRAP
- {SIGTRAP, "TRAP"},
-#endif
-#ifdef SIGTABRT
- {SIGABRT, "ABRT"},
-#endif
-#ifdef SIGTABRT
- {SIGIOT, "IOT"},
-#endif
-#ifdef SIGBUS
- {SIGBUS, "BUS"},
-#endif
-#ifdef SIGFPE
- {SIGFPE, "FPE"},
-#endif
-#ifdef SIGKILL
- {SIGKILL, "KILL"},
-#endif
-#ifdef SIGUSR1
- {SIGUSR1, "USR1"},
-#endif
-#ifdef SIGSEGV
- {SIGSEGV, "SEGV"},
-#endif
-#ifdef SIGUSR2
- {SIGUSR2, "USR2"},
-#endif
-#ifdef SIGPIPE
- {SIGPIPE, "PIPE"},
-#endif
-#ifdef SIGALRM
- {SIGALRM, "ALRM"},
-#endif
-#ifdef SIGTERM
- {SIGTERM, "TERM"},
-#endif
-#ifdef SIGSTKFLT
- {SIGSTKFLT, "STKFLT"},
-#endif
-#ifdef SIGCHLD
- {SIGCHLD, "CHLD"},
-#endif
-#ifdef SIGCONT
- {SIGCONT, "CONT"},
-#endif
-#ifdef SIGSTOP
- {SIGSTOP, "STOP"},
-#endif
-#ifdef SIGSTOP
- {SIGSTOP, "STOP"},
-#endif
-#ifdef SIGTSTP
- {SIGTSTP, "TSTP"},
-#endif
-#ifdef SIGTTIN
- {SIGTTIN, "TTIN"},
-#endif
-#ifdef SIGTTOU
- {SIGTTOU, "TTOU"},
-#endif
-#ifdef SIGURG
- {SIGURG, "URG"},
-#endif
-#ifdef SIGXCPU
- {SIGXCPU, "XCPU"},
-#endif
-#ifdef SIGXFSZ
- {SIGXFSZ, "XFSZ"},
-#endif
-#ifdef SIGVTALRM
- {SIGVTALRM, "VTALRM"},
-#endif
-#ifdef SIGVTALRM
- {SIGVTALRM, "VTALRM"},
-#endif
-#ifdef SIGPROF
- {SIGPROF, "PROF"},
-#endif
-#ifdef SIGWINCH
- {SIGWINCH, "WINCH"},
-#endif
-#ifdef SIGIO
- {SIGIO, "IO"},
-#endif
-#ifdef SIGPOLL
- {SIGPOLL, "POLL"},
-#endif
-#ifdef SIGPWR
- {SIGPWR, "PWR"},
-#endif
-#ifdef SIGSYS
- {SIGSYS, "SYS"},
-#endif
-#ifdef SIGUNUSED
- {SIGUNUSED, "UNUSED"},
-#endif
- {0, NULL}
+ SIGNIFY(ABRT), SIGNIFY(ALRM), SIGNIFY(BUS), SIGNIFY(CHLD), SIGNIFY(CONT),
+ SIGNIFY(FPE), SIGNIFY(HUP), SIGNIFY(ILL), SIGNIFY(INT), SIGNIFY(KILL),
+ SIGNIFY(PIPE), SIGNIFY(QUIT), SIGNIFY(SEGV), SIGNIFY(STOP), SIGNIFY(TERM),
+ SIGNIFY(TSTP), SIGNIFY(TTIN), SIGNIFY(TTOU), SIGNIFY(USR1), SIGNIFY(USR2),
+ SIGNIFY(SYS), SIGNIFY(TRAP), SIGNIFY(URG), SIGNIFY(VTALRM), SIGNIFY(XCPU),
+ SIGNIFY(XFSZ)
};
-static int sig_to_num(const char *pidstr)
-{
- int i, num;
+// SIGNIFY(STKFLT), SIGNIFY(WINCH), SIGNIFY(IO), SIGNIFY(PWR)
- if (isdigit(pidstr[0])) {
- num = atoi(pidstr);
+// Convert name to signal number. If name == NULL print names.
+static int sig_to_num(char *pidstr)
+{
+ int i;
- return num;
+ if (pidstr) {
+ if (isdigit(*pidstr)) return atol(pidstr);
+ if (!strncasecmp(pidstr, "sig", 3)) pidstr+=3;
}
-
- for (i = 0; signames[i].num; i++) {
- if (strcmp(pidstr, signames[i].name) == 0) {
+ for (i = 0; i < sizeof(signames)/sizeof(struct signame); i++)
+ if (!pidstr) xputs(signames[i].name);
+ else if (!strcasecmp(pidstr, signames[i].name))
return signames[i].num;
- }
- }
return -1;
}
-static void print_signals()
-{
- int i;
-
- for (i = 0; signames[i].num; i++) {
- puts(signames[i].name);
- }
-}
-
static void kill_process(pid_t pid)
{
int ret;
- TT.matched = 1;
+ toys.exitval = 0;
ret = kill(pid, TT.signum);
if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill");
@@ -190,13 +82,14 @@ void killall_main(void)
{
char **names;
- TT.signum = SIGTERM;
-
if (toys.optflags & FLAG_l) {
- print_signals();
+ sig_to_num(NULL);
return;
}
+ TT.signum = SIGTERM;
+ toys.exitval++;
+
if (!*toys.optargs) {
toys.exithelp = 1;
error_exit("Process name missing!");
@@ -205,23 +98,20 @@ void killall_main(void)
names = toys.optargs;
if (**names == '-') {
- TT.signum = sig_to_num((*names)+1);
- if (TT.signum <= 0) {
- if (toys.optflags & FLAG_q) error_exit("Invalid signal");
- exit(1);
+ if (0 > (TT.signum = sig_to_num((*names)+1))) {
+ if (toys.optflags & FLAG_q) exit(1);
+ error_exit("Invalid signal");
}
names++;
- }
- if (!*names) {
- toys.exithelp = 1;
- error_exit("Process name missing!");
+ if (!*names) {
+ toys.exithelp++;
+ error_exit("Process name missing!");
+ }
}
for_each_pid_with_name_in(names, kill_process);
- if (!TT.matched) {
- if (!(toys.optflags & FLAG_q)) fprintf(stderr, "No such process\n");
- exit(1);
- }
+ if (toys.exitval && !(toys.optflags & FLAG_q))
+ error_exit("No such process");
}