ash: allow "trap NUM [SIG]..." syntax

While at it, make get_signum() return -1 for numeric strings >= NSIG.

function                                             old     new   delta
trapcmd                                              292     306     +14
get_signum                                           295     300      +5
builtin_trap                                         413     412      -1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 19/-1)              Total: 18 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-25 20:06:17 +02:00
parent f1a5cb0548
commit 86981e3ad2
4 changed files with 10 additions and 5 deletions

View File

@ -143,7 +143,7 @@ int FAST_FUNC get_signum(const char *name)
unsigned i; unsigned i;
i = bb_strtou(name, NULL, 10); i = bb_strtou(name, NULL, 10);
if (!errno) if (!errno && i < NSIG) /* for shells, we allow 0 too */
return i; return i;
if (strncasecmp(name, "SIG", 3) == 0) if (strncasecmp(name, "SIG", 3) == 0)
name += 3; name += 3;

View File

@ -188,7 +188,7 @@ int kill_main(int argc UNUSED_PARAM, char **argv)
arg = *++argv; arg = *++argv;
} /* else it must be -SIG */ } /* else it must be -SIG */
signo = get_signum(arg); signo = get_signum(arg);
if (signo < 0) { /* || signo > MAX_SIGNUM ? */ if (signo < 0) {
bb_error_msg("bad signal name '%s'", arg); bb_error_msg("bad signal name '%s'", arg);
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -12981,13 +12981,18 @@ trapcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
return 0; return 0;
} }
/* Why the second check?
* "trap NUM [sig2]..." is the same as "trap - NUM [sig2]..."
* In this case, NUM is signal no, not an action.
*/
action = NULL; action = NULL;
if (ap[1]) if (ap[1] && !is_number(ap[0]))
action = *ap++; action = *ap++;
exitcode = 0; exitcode = 0;
while (*ap) { while (*ap) {
signo = get_signum(*ap); signo = get_signum(*ap);
if (signo < 0 || signo >= NSIG) { if (signo < 0) {
/* Mimic bash message exactly */ /* Mimic bash message exactly */
ash_msg("%s: invalid signal specification", *ap); ash_msg("%s: invalid signal specification", *ap);
exitcode = 1; exitcode = 1;

View File

@ -9745,7 +9745,7 @@ static int FAST_FUNC builtin_trap(char **argv)
sighandler_t handler; sighandler_t handler;
sig = get_signum(*argv++); sig = get_signum(*argv++);
if (sig < 0 || sig >= NSIG) { if (sig < 0) {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
/* Mimic bash message exactly */ /* Mimic bash message exactly */
bb_error_msg("trap: %s: invalid signal specification", argv[-1]); bb_error_msg("trap: %s: invalid signal specification", argv[-1]);