diff mbox

trap: Implement POSIX.1-2008 trap reset behaviour (#2)

Message ID 20151207175047.GG735@joyent.com (mailing list archive)
State Changes Requested
Delegated to: Herbert Xu
Headers show

Commit Message

Jonathan Perkin Dec. 7, 2015, 5:50 p.m. UTC
Clarifies a couple of issues with the previous patch, and expands on
the rationale in the commit message.  Sorry for the noise -- jperkin

POSIX.1-2008 for trap adds the following behaviour:

    If the first operand is an unsigned decimal integer, the shell shall
    treat all operands as conditions, and shall reset each condition to
    the default value.

The interpretation of this behaviour differs among other shells.  In the
case where the first operand is an invalid signo:

  bash-4.3.39(1), zsh-5.1.1:

    $ trap echo 1 2 3
    $ trap 100 1 2
    $ trap
    trap -- '100' SIGHUP
    trap -- '100' SIGINT
    trap -- 'echo' SIGQUIT

  mksh-51:

    $ trap echo 1 2 3
    $ trap 100 1 2
    mksh: trap: bad signal '100'
    $ trap
    trap -- echo QUIT

  ksh 93u+:

    $ trap echo 1 2 3
    $ trap 100 1 2
    ksh: trap: 100: bad trap
    $ trap
    trap -- echo QUIT
    trap -- echo INT
    trap -- echo HUP

As the standard does not appear to specify that the first operand must
be a valid signo for this behaviour to be triggered, we align with the
ksh behaviour:

    $ trap echo 1 2 3
    $ trap 100 1 2
    trap: 100: bad trap
    $ trap
    trap -- 'echo' HUP
    trap -- 'echo' INT
    trap -- 'echo' QUIT

As for the case of the first operand being a signal name:

  bash-4.3.39(1), mksh-51, ksh 93u+:

    $ trap echo 1 2 3
    $ trap HUP 2
    $ trap
    trap -- 'echo' SIGHUP
    trap -- 'HUP' SIGINT
    trap -- 'echo' SIGQUIT

  zsh-5.1.1:

    $ trap echo 1 2 3
    $ trap HUP 2
    $ trap
    trap -- echo QUIT

Here we go with the majority and a strict interpretation of the
standard, parsing it as a string rather than a signal:

    $ trap echo 1 2 3
    $ trap HUP 2
    $ trap
    trap -- 'echo' HUP
    trap -- 'HUP' INT
    trap -- 'echo' QUIT
---
 src/trap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Herbert Xu Dec. 8, 2015, 8:24 a.m. UTC | #1
Jonathan Perkin <jperkin@joyent.com> wrote:
> Clarifies a couple of issues with the previous patch, and expands on
> the rationale in the commit message.  Sorry for the noise -- jperkin
> 
> POSIX.1-2008 for trap adds the following behaviour:
> 
>    If the first operand is an unsigned decimal integer, the shell shall
>    treat all operands as conditions, and shall reset each condition to
>    the default value.
> 
> The interpretation of this behaviour differs among other shells.  In the
> case where the first operand is an invalid signo:
> 
>  bash-4.3.39(1), zsh-5.1.1:
> 
>    $ trap echo 1 2 3
>    $ trap 100 1 2
>    $ trap
>    trap -- '100' SIGHUP
>    trap -- '100' SIGINT
>    trap -- 'echo' SIGQUIT

So dash's behaviour is the same as bash.  I'm not changing this.

Cheers,
diff mbox

Patch

diff --git a/src/trap.c b/src/trap.c
index 82d4263..3dc1949 100644
--- a/src/trap.c
+++ b/src/trap.c
@@ -112,7 +112,7 @@  trapcmd(int argc, char **argv)
 		}
 		return 0;
 	}
-	if (!ap[1])
+	if ((!ap[1]) || (is_number(*ap)))
 		action = NULL;
 	else
 		action = *ap++;