If pterm's execvp fails when given the whole argument list after -e,
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 11 Jul 2012 18:12:17 +0000 (18:12 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 11 Jul 2012 18:12:17 +0000 (18:12 +0000)
and the argument list contains only one string, try again by passing
that single string to "$SHELL -c" to be parsed as a shell command.
This matches xterm's behaviour (as of xterm 261, at least), and means
in practice that users can do _either_ of 'pterm -e some command' and
'pterm -e "some command"'.

(A quick survey suggests that the majority of X terminal programs agree
with pterm's old behaviour of only supporting '-e some command',
except that gnome-terminal only supports the other behaviour and xterm
supports both. With that disagreement, I think supporting both is
probably the sensible thing.)

git-svn-id: svn://svn.tartarus.org/sgt/putty@9575 cda61777-01e9-0310-a592-d414129be87e

unix/uxpty.c

index afd64af..36a05fc 100644 (file)
@@ -835,9 +835,41 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
        putty_signal(SIGQUIT, SIG_DFL);
        putty_signal(SIGPIPE, SIG_DFL);
        block_signal(SIGCHLD, 0);
-       if (pty_argv)
+       if (pty_argv) {
+            /*
+             * Exec the exact argument list we were given.
+             */
            execvp(pty_argv[0], pty_argv);
-       else {
+            /*
+             * If that fails, and if we had exactly one argument, pass
+             * that argument to $SHELL -c.
+             *
+             * This arranges that we can _either_ follow 'pterm -e'
+             * with a list of argv elements to be fed directly to
+             * exec, _or_ with a single argument containing a command
+             * to be parsed by a shell (but, in cases of doubt, the
+             * former is more reliable).
+             *
+             * A quick survey of other terminal emulators' -e options
+             * (as of Debian squeeze) suggests that:
+             *
+             *  - xterm supports both modes, more or less like this
+             *  - gnome-terminal will only accept a one-string shell command
+             *  - Eterm, kterm and rxvt will only accept a list of
+             *    argv elements (as did older versions of pterm).
+             *
+             * It therefore seems important to support both usage
+             * modes in order to be a drop-in replacement for either
+             * xterm or gnome-terminal, and hence for anyone's
+             * plausible uses of the Debian-style alias
+             * 'x-terminal-emulator'...
+             */
+            if (pty_argv[1] == NULL) {
+                char *shell = getenv("SHELL");
+                if (shell)
+                    execl(shell, shell, "-c", pty_argv[0], (void *)NULL);
+            }
+        } else {
            char *shell = getenv("SHELL");
            char *shellname;
            if (conf_get_int(conf, CONF_login_shell)) {