summaryrefslogtreecommitdiff
path: root/kill.c
diff options
context:
space:
mode:
Diffstat (limited to 'kill.c')
-rw-r--r--kill.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/kill.c b/kill.c
new file mode 100644
index 0000000..da025fa
--- /dev/null
+++ b/kill.c
@@ -0,0 +1,140 @@
+#include "internal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+
+const char kill_usage[] = "kill [-signal] process-id [process-id ...]\n";
+
+struct signal_name {
+ const char * name;
+ int number;
+};
+
+const struct signal_name signames[] = {
+ { "HUP", SIGHUP },
+ { "INT", SIGINT },
+ { "QUIT", SIGQUIT },
+ { "ILL", SIGILL },
+ { "TRAP", SIGTRAP },
+ { "ABRT", SIGABRT },
+#ifndef __alpha__
+ { "IOT", SIGIOT },
+#endif
+#if defined(sparc) || defined(__alpha__)
+ { "EMT", SIGEMT },
+#else
+ { "BUS", SIGBUS },
+#endif
+ { "FPE", SIGFPE },
+ { "KILL", SIGKILL },
+#if defined(sparc) || defined(__alpha__)
+ { "BUS", SIGBUS },
+#else
+ { "USR1", SIGUSR1 },
+#endif
+ { "SEGV", SIGSEGV },
+#if defined(sparc) || defined(__alpha__)
+ { "SYS", SIGSYS },
+#else
+ { "USR2", SIGUSR2 },
+#endif
+ { "PIPE", SIGPIPE },
+ { "ALRM", SIGALRM },
+ { "TERM", SIGTERM },
+#if defined(sparc) || defined(__alpha__)
+ { "URG", SIGURG },
+ { "STOP", SIGSTOP },
+ { "TSTP", SIGTSTP },
+ { "CONT", SIGCONT },
+ { "CHLD", SIGCHLD },
+ { "TTIN", SIGTTIN },
+ { "TTOU", SIGTTOU },
+ { "IO", SIGIO },
+# ifndef __alpha__
+ { "POLL", SIGIO },
+# endif
+ { "XCPU", SIGXCPU },
+ { "XFSZ", SIGXFSZ },
+ { "VTALRM", SIGVTALRM },
+ { "PROF", SIGPROF },
+ { "WINCH", SIGWINCH },
+# ifdef __alpha__
+ { "INFO", SIGINFO },
+# else
+ { "LOST", SIGLOST },
+# endif
+ { "USR1", SIGUSR1 },
+ { "USR2", SIGUSR2 },
+#else
+ { "STKFLT", SIGSTKFLT },
+ { "CHLD", SIGCHLD },
+ { "CONT", SIGCONT },
+ { "STOP", SIGSTOP },
+ { "TSTP", SIGTSTP },
+ { "TTIN", SIGTTIN },
+ { "TTOU", SIGTTOU },
+ { "URG", SIGURG },
+ { "XCPU", SIGXCPU },
+ { "XFSZ", SIGXFSZ },
+ { "VTALRM", SIGVTALRM },
+ { "PROF", SIGPROF },
+ { "WINCH", SIGWINCH },
+ { "IO", SIGIO },
+ { "POLL", SIGPOLL },
+ { "PWR", SIGPWR },
+ { "UNUSED", SIGUNUSED },
+#endif
+ { 0, 0 }
+};
+
+extern int
+kill_main(struct FileInfo * i, int argc, char * * argv)
+{
+ int had_error = 0;
+ int sig = SIGTERM;
+ if ( argv[1][0] == '-' ) {
+ if ( argv[1][1] >= '0' && argv[1][1] <= '9' ) {
+ sig = atoi(&argv[1][1]);
+ if ( sig < 0 || sig >= NSIG ) {
+ usage(kill_usage);
+ exit(-1);
+ }
+ }
+ else {
+ const struct signal_name * s = signames;
+ for ( ; ; ) {
+ if ( strcmp(s->name, &argv[1][1]) == 0 ) {
+ sig = s->number;
+ break;
+ }
+ s++;
+ if ( s->name == 0 ) {
+ usage(kill_usage);
+ exit(-1);
+ }
+ }
+ }
+ argv++;
+ argc--;
+
+ }
+ while ( argc > 1 ) {
+ int pid;
+ if ( argv[1][0] < '0' || argv[1][0] > '9' ) {
+ usage(kill_usage);
+ exit(-1);
+ }
+ pid = atoi(argv[1]);
+ if ( kill(pid, sig) != 0 ) {
+ had_error = 1;
+ perror(argv[1]);
+ }
+ argv++;
+ argc--;
+ }
+ if ( had_error )
+ return -1;
+ else
+ return 0;
+}