aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/kill.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix/kill.c')
-rw-r--r--toys/posix/kill.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/toys/posix/kill.c b/toys/posix/kill.c
new file mode 100644
index 00000000..e64a146b
--- /dev/null
+++ b/toys/posix/kill.c
@@ -0,0 +1,74 @@
+/* vi: set sw=4 ts=4:
+ *
+ * kill.c - a program to send signals to processes
+ *
+ * Copyright 2012 Daniel Walter <d.walter@0x90.at>
+ *
+ * See http://opengroup.org/onlinepubs/9699919799/utilities/kill.html
+
+USE_KILL(NEWTOY(kill, "?s: l", TOYFLAG_BIN))
+
+config KILL
+ bool "kill"
+ default y
+ help
+ usage: kill [-l [SIGNAL] | -s SIGNAL | -SIGNAL] pid...
+
+ Send a signal to a process
+
+*/
+
+#include "toys.h"
+
+DEFINE_GLOBALS(
+ char *signame;
+)
+
+#define TT this.kill
+
+void kill_main(void)
+{
+ int signum;
+ char *tmp, **args = toys.optargs;
+ pid_t pid;
+
+ // list signal(s)
+ if (toys.optflags & 1) {
+ if (*args) {
+ int signum = sig_to_num(*args);
+ char *s = NULL;
+
+ if (signum>=0) s = num_to_sig(signum&127);
+ puts(s ? s : "UNKNOWN");
+ } else sig_to_num(NULL);
+ return;
+ }
+
+ // signal must come before pids, so "kill -9 -1" isn't confusing.
+
+ if (!TT.signame && *args && **args=='-') TT.signame=*(args++)+1;
+ if (TT.signame) {
+ char *arg;
+ int i = strtol(TT.signame, &arg, 10);
+ if (!*arg) arg = num_to_sig(i);
+ else arg = TT.signame;
+
+ if (!arg || -1 == (signum = sig_to_num(arg)))
+ error_exit("Unknown signal '%s'", arg);
+ } else signum = SIGTERM;
+
+ if (!*args) {
+ toys.exithelp++;
+ error_exit("missing argument");
+ }
+
+ while (*args) {
+ char *arg = *(args++);
+
+ pid = strtol(arg, &tmp, 10);
+ if (*tmp || kill(pid, signum) < 0) {
+ error_msg("unknown pid '%s'", arg);
+ toys.exitval = EXIT_FAILURE;
+ }
+ }
+}