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}