Initial revision
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;
+}