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@xxxxxx> --- misc-utils/kill.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/misc-utils/kill.c b/misc-utils/kill.c index e5ec01e..40f354c 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); -- 1.9.0 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html