master xplshn/aruu / cmd / posix / kill.c
  1/* See LICENSE file for copyright and license details. */
  2
  3
  4#include "sig.h"
  5#include "util.h"
  6
  7#include <sys/wait.h>
  8
  9#include <ctype.h>
 10#include <limits.h>
 11#include <signal.h>
 12#include <stdio.h>
 13#include <string.h>
 14#include <strings.h>
 15
 16static const char *
 17sig2name(int sig)
 18{
 19	static char name[SIG2STR_MAX];
 20
 21	if (sig == 0)
 22		return "0";
 23	if (sig2str(sig, name) < 0)
 24		eprintf("%d: bad signal number\n", sig);
 25	return name;
 26}
 27
 28static int
 29name2sig(const char *name)
 30{
 31	int sig;
 32
 33	if (strcmp(name, "0") == 0)
 34		return 0;
 35	if (str2sig(name, &sig) < 0)
 36		eprintf("%s: bad signal name\n", name);
 37	return sig;
 38}
 39
 40static void
 41usage(void)
 42{
 43	eprintf("usage: %s [-s signame | -num | -signame] pid ...\n"
 44	        "       %s -l [num]\n", argv0, argv0);
 45}
 46
 47// ?man kill: send signal to process
 48// ?man arguments: pid ...
 49// ?man send a specified signal to processes by pid
 50int
 51main(int argc, char *argv[])
 52{
 53	pid_t pid;
 54	size_t i;
 55	int ret = 0, sig = SIGTERM;
 56
 57	argv0 = *argv, argv0 ? (argc--, argv++) : (void *)0;
 58
 59	if (!argc)
 60		usage();
 61
 62	if ((*argv)[0] == '-') {
 63		switch ((*argv)[1]) {
 64		case 'l':
 65			if ((*argv)[2])
 66				goto longopt;
 67			argc--, argv++;
 68			if (!argc) {
 69				for (i = 1; i < (size_t)sys_nsig; i++)
 70					if (sys_signame[i])
 71						puts(sys_signame[i]);
 72			} else if (argc == 1) {
 73				sig = estrtonum(*argv, 0, INT_MAX);
 74				if (sig > 128)
 75					sig = WTERMSIG(sig);
 76				puts(sig2name(sig));
 77			} else {
 78				usage();
 79			}
 80			return fshut(stdout, "<stdout>");
 81		case 's':
 82			if ((*argv)[2])
 83				goto longopt;
 84			argc--, argv++;
 85			if (!argc)
 86				usage();
 87			sig = name2sig(*argv);
 88			argc--, argv++;
 89			break;
 90		case '-':
 91			if ((*argv)[2])
 92				goto longopt;
 93			argc--, argv++;
 94			break;
 95		default:
 96		longopt:
 97			/* XSI-extensions -argnum and -argname*/
 98			if (isdigit((*argv)[1])) {
 99				sig = estrtonum((*argv) + 1, 0, INT_MAX);
100				sig2name(sig);
101			} else {
102				sig = name2sig((*argv) + 1);
103			}
104			argc--, argv++;
105		}
106	}
107
108	if (argc && !strcmp(*argv, "--"))
109		argc--, argv++;
110
111	if (!argc)
112		usage();
113
114	for (; *argv; argc--, argv++) {
115		pid = estrtonum(*argv, INT_MIN, INT_MAX);
116		if (kill(pid, sig) < 0) {
117			weprintf("kill %d:", pid);
118			ret = 1;
119		}
120	}
121
122	return ret;
123}