diff options
author | Christopher Faylor <me@cgf.cx> | 2002-05-13 05:13:58 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2002-05-13 05:13:58 +0000 |
commit | c49fa762631f93c496e3e4e7d55ff730cf24d789 (patch) | |
tree | 7195a373b927dab5c2f1a44b275719f689fe678b /winsup/utils/kill.cc | |
parent | d52265ffb265f8d72cbace65ca2656d8f55200f3 (diff) | |
download | cygnal-c49fa762631f93c496e3e4e7d55ff730cf24d789.tar.gz cygnal-c49fa762631f93c496e3e4e7d55ff730cf24d789.tar.bz2 cygnal-c49fa762631f93c496e3e4e7d55ff730cf24d789.zip |
* 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.
Diffstat (limited to 'winsup/utils/kill.cc')
-rw-r--r-- | winsup/utils/kill.cc | 118 |
1 files changed, 93 insertions, 25 deletions
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 <errno.h> #include <windows.h> #include <sys/cygwin.h> +#include <getopt.h> + +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; |