From c49fa762631f93c496e3e4e7d55ff730cf24d789 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 13 May 2002 05:13:58 +0000 Subject: * Makefile.in (kill.exe): Add as a specific target. * kill.cc (longopts): New. (opts): Ditto. (get_sig): Accept const char * parameter. Return -1 on unknown signal. (test_for_unknown_sig): New function. (listsig): New function. (main): Use getopt_long for option parsing. Implement -l, and -s options. Use test_for_unknown_sig() to test for signal validity. --- winsup/utils/kill.cc | 118 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 93 insertions(+), 25 deletions(-) (limited to 'winsup/utils/kill.cc') diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc index 2f538ea49..da1721f0e 100644 --- a/winsup/utils/kill.cc +++ b/winsup/utils/kill.cc @@ -16,6 +16,20 @@ details. */ #include #include #include +#include + +static struct option longopts[] = +{ + {"help", no_argument, NULL, 'h' }, + {"list", optional_argument, NULL, 'l'}, + {"force", no_argument, NULL, 'f'}, + {"signal", required_argument, NULL, 's'}, + {NULL, 0, NULL, 0} +}; + +static char opts[] = "hl::fs:"; + +extern "C" const char *strsigno (int); static void usage (void) @@ -25,10 +39,11 @@ usage (void) } static int -getsig (char *in_sig) +getsig (const char *in_sig) { - char *sig; + const char *sig; char buf[80]; + int intsig; if (strncmp (in_sig, "SIG", 3) == 0) sig = in_sig; @@ -37,7 +52,37 @@ getsig (char *in_sig) sprintf (buf, "SIG%s", in_sig); sig = buf; } - return (strtosigno (sig) ?: atoi (in_sig)); + intsig = strtosigno (sig) ?: atoi (in_sig); + char *p; + if (!intsig && (strcmp (buf, "SIG0") != 0 && (strtol (in_sig, &p, 10) != 0 || *p))) + intsig = -1; + return intsig; +} + +static void +test_for_unknown_sig (int sig, const char *sigstr) +{ + if (sig < 0 || sig > NSIG) + { + fprintf (stderr, "kill: unknown signal: %s\n", sigstr); + usage (); + exit (1); + } +} + +static void +listsig (const char *in_sig) +{ + int sig; + if (!in_sig) + for (sig = 1; sig < NSIG; sig++) + printf ("%s%c", strsigno (sig) + 3, (sig < NSIG - 1) ? ' ' : '\n'); + else + { + sig = getsig (in_sig); + test_for_unknown_sig (sig, in_sig); + puts (strsigno (sig) + 3); + } } static void __stdcall @@ -59,36 +104,59 @@ main (int argc, char **argv) { int sig = SIGTERM; int force = 0; - int gotsig = 0; + char *gotsig = NULL; int ret = 0; if (argc == 1) usage (); - while (*++argv && **argv == '-') - if (strcmp (*argv + 1, "f") == 0) - force = 1; - else if (gotsig) - break; - else if (strcmp(*argv + 1, "0") != 0) - { - sig = getsig (*argv + 1); - gotsig = 1; - } - else - { - argv++; - sig = 0; - goto sig0; - } - - if (sig <= 0 || sig > NSIG) + opterr = 0; + for (;;) { - fprintf (stderr, "kill: unknown signal: %s\n", argv[-1]); - exit (1); + int ch; + char **av = argv + optind; + if ((ch = getopt_long (argc, argv, opts, longopts, NULL)) == EOF) + break; + switch (ch) + { + case 's': + gotsig = optarg; + sig = getsig (gotsig); + break; + case 'l': + if (!optarg) + { + optarg = argv[optind]; + if (optarg) + { + optind++; + optreset = 1; + } + } + if (argv[optind]) + usage (); + listsig (optarg); + break; + case 'f': + force = 1; + break; + case '?': + if (gotsig) + usage (); + optreset = 1; + optind = 1 + av - argv; + gotsig = *av + 1; + sig = getsig (gotsig); + break; + default: + usage (); + break; + } } -sig0: + test_for_unknown_sig (sig, gotsig); + + argv += optind; while (*argv != NULL) { char *p; -- cgit v1.2.3