[PATCH] kill: add '--' option to separate options from arguments

Xabier Oneca -- xOneca xoneca at gmail.com
Fri Sep 1 08:29:00 UTC 2017


> Shouldn't '--' be taken care by getopt/getopt32 so all applets benefit
> from it? (I thought it already did that...)

Nevermind. I just saw kill doesn't use getopt... :/


> 2017-08-28 14:07 GMT+02:00 Denys Vlasenko <vda.linux at googlemail.com>:
>> Applied, thanks.
>>
>> On Sun, Aug 27, 2017 at 9:25 AM, Ron Yorston <rmy at pobox.com> wrote:
>>> Using a negative pid to send TERM to a process group results in an
>>> obscure error:
>>>
>>>    $ ./busybox kill -12345
>>>    kill: bad signal name '12345'
>>>
>>> There are a couple of workarounds:
>>>
>>> - specify the signal: 'kill -TERM -12345'
>>>
>>> - use the 'shell hack' and add a leading space to the argument:
>>>   'kill " -12345"'.  This only works if the shell hack is enabled.
>>>
>>> The full versions of kill and killall provide a '--' argument to
>>> separate options from arguments.  Add this capability to BusyBox.
>>>
>>> This doesn't avoid the need for the shell hack, which is only partly
>>> about handling arguments that start with a dash:  it also packs multiple
>>> pids into a single argument.
>>>
>>> bloat-o-meter gives the somewhat unbelievable result:
>>>
>>> function                                             old     new   delta
>>> kill_main                                            993     999      +6
>>> packed_usage                                       32073 32047     -26
>>> .rodata                                           164190  164164     -26
>>> ------------------------------------------------------------------------------
>>> (add/remove: 0/0 grow/shrink: 1/2 up/down: 6/-52)             Total: -46 bytes
>>>    text    data     bss     dec     hex filename
>>>  872711    4110    1944  878765   d68ad busybox_old
>>>  872691    4110    1944  878745   d6899 busybox_unstripped
>>>
>>> A few more changes like that and BusyBox will take a negative amount
>>> of disk space.
>>>
>>> Signed-off-by: Ron Yorston <rmy at pobox.com>
>>> ---
>>>  procps/kill.c | 9 +++++++--
>>>  1 file changed, 7 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/procps/kill.c b/procps/kill.c
>>> index 0ddae2f70..e085f4d56 100644
>>> --- a/procps/kill.c
>>> +++ b/procps/kill.c
>>> @@ -42,7 +42,7 @@
>>>  //kbuild:lib-$(CONFIG_KILLALL5) += kill.o
>>>
>>>  //usage:#define kill_trivial_usage
>>> -//usage:       "[-l] [-SIG] PID..."
>>> +//usage:       "[-l] [-SIG] [--] PID..."
>>>  //usage:#define kill_full_usage "\n\n"
>>>  //usage:       "Send a signal (default: TERM) to given PIDs\n"
>>>  //usage:     "\n       -l      List all signal names and numbers"
>>> @@ -59,7 +59,7 @@
>>>  //usage:       "$ kill 252\n"
>>>  //usage:
>>>  //usage:#define killall_trivial_usage
>>> -//usage:       "[-l] [-q] [-SIG] PROCESS_NAME..."
>>> +//usage:       "[-l] [-q] [-SIG] [--] PROCESS_NAME..."
>>>  //usage:#define killall_full_usage "\n\n"
>>>  //usage:       "Send a signal (default: TERM) to given processes\n"
>>>  //usage:     "\n       -l      List all signal names and numbers"
>>> @@ -184,6 +184,10 @@ int kill_main(int argc UNUSED_PARAM, char **argv)
>>>         if (is_killall5 && arg[0] == 'o')
>>>                 goto do_it_now;
>>>
>>> +       /* -- separates options from arguments */
>>> +       if (!is_killall5 && arg[0] == '-')
>>> +               goto do_it_sooner;
>>> +
>>>         if (argv[1] && arg[0] == 's' && arg[1] == '\0') { /* -s SIG? */
>>>                 arg = *++argv;
>>>         } /* else it must be -SIG */
>>> @@ -192,6 +196,7 @@ int kill_main(int argc UNUSED_PARAM, char **argv)
>>>                 bb_error_msg("bad signal name '%s'", arg);
>>>                 return EXIT_FAILURE;
>>>         }
>>> + do_it_sooner:
>>>         arg = *++argv;
>>>
>>>   do_it_now:
>>> --
>>> 2.13.5


More information about the busybox mailing list