#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;
}