]> granicus.if.org Git - php/commitdiff
Rework automatic interactive cli activation
authorAnatol Belski <ab@php.net>
Thu, 3 Aug 2017 09:23:50 +0000 (11:23 +0200)
committerAnatol Belski <ab@php.net>
Thu, 3 Aug 2017 09:23:50 +0000 (11:23 +0200)
There are still systems delivering buggy console info. If a file was
passed, obviously no interaction is meant.

sapi/cli/php_cli.c

index d1fa6a6d00eb33bfbf9bf17dc41633c370612376..52055c98c99197ef1852e1195e45715d2bd29aa8 100644 (file)
@@ -674,11 +674,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
        char *exec_direct=NULL, *exec_run=NULL, *exec_begin=NULL, *exec_end=NULL;
        char *arg_free=NULL, **arg_excp=&arg_free;
        char *script_file=NULL, *translated_path = NULL;
-#if defined(PHP_WIN32) && !defined(PHP_CLI_WIN32_NO_CONSOLE) && (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE)
-       int interactive = php_win32_console_is_own();
-#else
        int interactive=0;
-#endif
        int lineno = 0;
        const char *param_error=NULL;
        int hide_argv = 0;
@@ -918,6 +914,20 @@ static int do_cli(int argc, char **argv) /* {{{ */
                        goto err;
                }
 
+#if defined(PHP_WIN32) && !defined(PHP_CLI_WIN32_NO_CONSOLE) && (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE)
+               if (!interactive) {
+               /* The -a option was not passed. If there is no file, it could
+                       still make sense to run interactively. The presense of a file
+                       is essential to mitigate buggy console info. */
+                       interactive = php_win32_console_is_own() &&
+                               !(script_file ||
+                                       argc > php_optind && behavior!=PHP_MODE_CLI_DIRECT &&
+                                       behavior!=PHP_MODE_PROCESS_STDIN &&
+                                       strcmp(argv[php_optind-1],"--")
+                               );
+               }
+#endif
+
                if (interactive) {
 #if (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE)
                        printf("Interactive shell\n\n");