commit 64da0d1ebc6c00b3f1a939cdb6d3abe219850ed7
parent ac012408000e7f83831569b3f74c78b5c491a885
Author: FRIGN <dev@frign.de>
Date: Mon, 16 Mar 2015 12:37:46 +0100
Audit kill(1)
1) Refactor the manpage with num-options, optimize wording to be more
concise and to the point, pid also specifies process groups.
2) Make int sig const.
3) Remove prototypes.
4) /* not reached */ consistency.
5) Refactor usage() with eprintf.
6) Refactor arg-parser with a switch, use estrtonum
7) Use return instead of exit() in main()
8) argc-argv-correctness.
Diffstat:
M | README | | | 2 | +- |
M | kill.1 | | | 41 | ++++++++++++++++------------------------- |
M | kill.c | | | 134 | +++++++++++++++++++++++++++++++++++++------------------------------------------ |
3 files changed, 80 insertions(+), 97 deletions(-)
diff --git a/README b/README
@@ -37,7 +37,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=* grep yes none
=*| head yes none
=*| hostname non-posix none
-=* kill yes none
+=*| kill yes none
=*| link yes none
=*| ln yes none
=*| logger yes none
diff --git a/kill.1 b/kill.1
@@ -1,4 +1,4 @@
-.Dd November 23, 2014
+.Dd March 16, 2015
.Dt KILL 1
.Os sbase
.Sh NAME
@@ -6,34 +6,25 @@
.Nd signal processes
.Sh SYNOPSIS
.Nm
-.Op Fl s Ar signal_name
+.Op Fl s Ar signame | Fl num | Fl signame
.Ar pid ...
.Nm
-.Fl l Op Ar exit_status
-.Nm
-.Fl Ar signal_name
-.Ar pid ...
-.Nm
-.Fl Ar signal_number
-.Ar pid ...
+.Fl l Op Ar num
.Sh DESCRIPTION
.Nm
-by default sends a TERM signal to the given processes.
+signals TERM to each process or process group specified by
+.Ar pid .
.Sh OPTIONS
.Bl -tag -width Ds
-.It Fl l Op Ar exit_status
-Lists available signals. If an
-.Ar exit_status
-is given, only the corresponding signal name will be printed.
-.It Fl s Ar signal_name
-A symbolic signal name specifying the signal to be sent instead of the
-default SIGTERM. Sends the named signal.
-.It Fl signal_name
-A symbolic signal name specifying the signal to be sent instead
-of the default SIGTERM.
-.It Fl signal_number
-A non-negative decimal integer specifying the signal to be sent instead of
-the default SIGTERM.
+.It Fl l Op Ar num
+List all available signals or the signal name of
+.Ar num .
+.It Fl s Ar signame | Fl num | Fl signame
+Send signal corresponding to
+.Ar signame
+|
+.Ar num .
+The default is TERM.
.El
.Sh SEE ALSO
.Xr kill 2 ,
@@ -46,9 +37,9 @@ utility is compliant with the
specification.
.Pp
The
-.Fl Ar signal_name
+.Fl Ar signame
and
-.Fl Ar signal_number
+.Fl Ar num
syntax is marked by
.St -p1003.1-2008
as being an
diff --git a/kill.c b/kill.c
@@ -2,18 +2,16 @@
#include <sys/wait.h>
#include <ctype.h>
-#include <errno.h>
+#include <limits.h>
#include <signal.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <strings.h>
#include "util.h"
struct {
const char *name;
- int sig;
+ const int sig;
} sigs[] = {
{ "0", 0 },
#define SIG(n) { #n, SIG##n }
@@ -23,11 +21,8 @@ struct {
#undef SIG
};
-const char *sig2name(int);
-int name2sig(const char *);
-
const char *
-sig2name(int sig)
+sig2name(const int sig)
{
size_t i;
@@ -35,104 +30,101 @@ sig2name(int sig)
if (sigs[i].sig == sig)
return sigs[i].name;
eprintf("%d: bad signal number\n", sig);
- /* unreachable */
- return NULL;
+
+ return NULL; /* not reached */
}
-int
+const int
name2sig(const char *name)
{
size_t i;
for (i = 0; i < LEN(sigs); i++)
- if (strcasecmp(sigs[i].name, name) == 0)
+ if (!strcasecmp(sigs[i].name, name))
return sigs[i].sig;
eprintf("%s: bad signal name\n", name);
- /* unreachable */
- return -1;
+
+ return -1; /* not reached */
}
static void
usage(void)
{
- weprintf("usage: %s [-s signame | -signum | -signame] pid ...\n", argv0);
- weprintf(" %s -l [exit_status]\n", argv0);
- exit(1);
+ eprintf("usage: %s [-s signame | -num | -signame] pid ...\n"
+ " %s -l [num]\n", argv0, argv0);
}
int
main(int argc, char *argv[])
{
- char *end;
- int ret = 0;
- int sig = SIGTERM;
pid_t pid;
size_t i;
+ int ret = 0, sig = SIGTERM;
- argv0 = argv[0];
- if (argc < 2)
+ argv0 = argv[0], argc--, argv++;
+ if (!argc)
usage();
- argc--, argv++;
- if (strcmp(argv[0], "-l") == 0) {
- argc--, argv++;
- if (argc == 0) {
- for (i = 0; i < LEN(sigs); i++)
- puts(sigs[i].name);
- exit(0);
- } else if (argc > 1)
- usage();
- errno = 0;
- sig = strtol(argv[0], &end, 10);
- if (*end != '\0' || errno != 0)
- eprintf("%s: bad signal number\n", argv[0]);
- if (sig > 128)
- sig = WTERMSIG(sig);
- puts(sig2name(sig));
- exit(0);
- }
-
- if (strcmp(argv[0], "-s") == 0) {
- argc--, argv++;
- if (argc == 0)
- usage();
- sig = name2sig(argv[0]);
- argc--, argv++;
- } else if (argv[0][0] == '-') {
- if (isdigit(argv[0][1])) {
- /* handle XSI extension -signum */
- errno = 0;
- sig = strtol(&argv[0][1], &end, 10);
- if (*end != '\0' || errno != 0)
- eprintf("%s: bad signal number\n", &argv[0][1]);
- sig2name(sig);
+ if ((*argv)[0] == '-') {
+ switch ((*argv)[1]) {
+ case 'l':
+ if ((*argv)[2])
+ goto longopt;
+ argc--, argv++;
+ if (!argc) {
+ for (i = 0; i < LEN(sigs); i++)
+ puts(sigs[i].name);
+ return 0;
+ } else if (argc == 1) {
+ sig = estrtonum(*argv, 0, INT_MAX);
+ if (sig > 128)
+ sig = WTERMSIG(sig);
+ puts(sig2name(sig));
+ return 0;
+ } else {
+ usage();
+ }
+ break;
+ case 's':
+ if ((*argv)[2])
+ goto longopt;
+ argc--, argv++;
+ if (!argc)
+ usage();
+ sig = name2sig(*argv);
argc--, argv++;
- } else if (argv[0][1] != '-') {
- /* handle XSI extension -signame */
- sig = name2sig(&argv[0][1]);
+ break;
+ case '-':
+ if ((*argv)[2])
+ goto longopt;
+ argc--, argv++;
+ break;
+ default:
+ longopt:
+ /* XSI-extensions -argnum and -argname*/
+ if (isdigit((*argv)[1])) {
+ sig = estrtonum((*argv) + 1, 0, INT_MAX);
+ sig2name(sig);
+ } else {
+ sig = name2sig((*argv) + 1);
+ }
argc--, argv++;
}
}
- if (argc > 0 && strcmp(argv[0], "--") == 0)
+ if (argc && !strcmp(*argv, "--"))
argc--, argv++;
- if (argc == 0)
+ if (!argc)
usage();
- for (; argc; argc--, argv++) {
- errno = 0;
- pid = strtol(argv[0], &end, 10);
- if (*end == '\0' && errno == 0) {
- if (kill(pid, sig) < 0) {
- weprintf("kill %d:", pid);
- ret = 1;
- }
- } else {
- weprintf("%s: bad pid\n", argv[0]);
+ for (; *argv; argc--, argv++) {
+ pid = estrtonum(*argv, INT_MIN, INT_MAX);
+ if (kill(pid, sig) < 0) {
+ weprintf("kill %d:", pid);
ret = 1;
}
}
- exit(ret);
+ return ret;
}