diff options
author | Sami Kerola | 2014-03-09 21:16:14 +0100 |
---|---|---|
committer | Sami Kerola | 2014-03-30 22:32:36 +0200 |
commit | 9e8dffd5cd29f03029b1ac99eecb129532ca5c0f (patch) | |
tree | 7ab291cdc0ac9969712bde22d84993156f12a2c9 /misc-utils/kill.c | |
parent | kill: add parse_arguments() function (diff) | |
download | kernel-qcow2-util-linux-9e8dffd5cd29f03029b1ac99eecb129532ca5c0f.tar.gz kernel-qcow2-util-linux-9e8dffd5cd29f03029b1ac99eecb129532ca5c0f.tar.xz kernel-qcow2-util-linux-9e8dffd5cd29f03029b1ac99eecb129532ca5c0f.zip |
kill: move sigqueue inputs to control struct
Use of global variables is messy. The earlier implementation also
assumed queue argument never to be textual, such as 'HUP', which now
works as one might expect.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'misc-utils/kill.c')
-rw-r--r-- | misc-utils/kill.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/misc-utils/kill.c b/misc-utils/kill.c index 01995b844..c3e2eb10f 100644 --- a/misc-utils/kill.c +++ b/misc-utils/kill.c @@ -66,10 +66,14 @@ struct kill_control { char *arg; pid_t pid; int numsig; +#ifdef HAVE_SIGQUEUE + union sigval sigdata; +#endif unsigned int check_all:1, do_kill:1, - do_pid:1; + do_pid:1, + use_sigval:1; }; struct signv { @@ -163,10 +167,6 @@ static void printsignals(FILE *fp, int pretty); static void __attribute__((__noreturn__)) usage(FILE *out); static int kill_verbose(const struct kill_control *ctl); -#ifdef HAVE_SIGQUEUE -static int use_sigval; -static union sigval sigdata; -#endif int main(int argc, char **argv) { @@ -289,18 +289,21 @@ static char **parse_arguments(int argc, char **argv, struct kill_control *ctl) } continue; } +#ifdef HAVE_SIGQUEUE if (!strcmp(arg, "-q") || !strcmp(arg, "--queue")) { if (argc < 2) errx(EXIT_FAILURE, _("option '%s' requires an argument"), arg); argc--, argv++; arg = *argv; -#ifdef HAVE_SIGQUEUE - sigdata.sival_int = - strtos32_or_err(arg, _("invalid sigval argument")); - use_sigval = 1; -#endif + if ((ctl->numsig = arg_to_signum(arg, 0)) < 0) { + nosig(arg); + exit(EXIT_FAILURE); + } + ctl->sigdata.sival_int = ctl->numsig; + ctl->use_sigval = 1; continue; } +#endif /* 'arg' begins with a dash but is not a known option. * So it's probably something like -HUP, or -1/-n try to * deal with it. @@ -467,7 +470,9 @@ static void __attribute__((__noreturn__)) usage(FILE *out) fputs(_(" -a, --all do not restrict the name-to-pid conversion to processes\n" " with the same uid as the present process\n"), out); fputs(_(" -s, --signal <sig> send specified signal\n"), out); +#ifdef HAVE_SIGQUEUE fputs(_(" -q, --queue <sig> use sigqueue(2) rather than kill(2)\n"), out); +#endif fputs(_(" -p, --pid print pids without signaling them\n"), out); fputs(_(" -l, --list [=<signal>] list signal names, or convert one to a name\n"), out); fputs(_(" -L, --table list signal names and numbers\n"), out); @@ -487,8 +492,8 @@ static int kill_verbose(const struct kill_control *ctl) return 0; } #ifdef HAVE_SIGQUEUE - if (use_sigval) - rc = sigqueue(ctl->pid, ctl->numsig, sigdata); + if (ctl->use_sigval) + rc = sigqueue(ctl->pid, ctl->numsig, ctl->sigdata); else #endif rc = kill(ctl->pid, ctl->numsig); |