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:
parent
f1a5cb0548
commit
86981e3ad2
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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]);
|
||||||
|
Loading…
Reference in New Issue
Block a user