]> granicus.if.org Git - php/commitdiff
Improved proc_open(). Now on Windows it can run external commands not through CMD.EXE
authorDmitry Stogov <dmitry@php.net>
Sat, 6 Jan 2007 09:02:02 +0000 (09:02 +0000)
committerDmitry Stogov <dmitry@php.net>
Sat, 6 Jan 2007 09:02:02 +0000 (09:02 +0000)
NEWS
ext/standard/proc_open.c

diff --git a/NEWS b/NEWS
index 16d3638af2f1a633d8c009defc6a7c7cbb9fa703..778d848f28a8871c8657c9d1a90b3c5f0d399db0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Jan 2007, PHP 5.2.1RC3
+- Improved proc_open(). Now on Windows it can run external commands not through
+  CMD.EXE. (Dmitry)  
 
 04 Jan 2007, PHP 5.2.1RC2
 - Small optimization of the date() function (Matt,Ilia)
index e11ba1daf650384a63604773778907d9289fb45f..3806efa768899fb523a61c1a8e2c953f7112c64a 100644 (file)
@@ -489,6 +489,7 @@ PHP_FUNCTION(proc_open)
        int is_persistent = 0; /* TODO: ensure that persistent procs will work */
 #ifdef PHP_WIN32
        int suppress_errors = 0;
+       int bypass_shell = 0;
 #endif
 #if PHP_CAN_DO_PTS
        php_file_descriptor_t dev_ptmx = -1;    /* master */
@@ -509,10 +510,17 @@ PHP_FUNCTION(proc_open)
        if (other_options) {
                zval **item;
                if (SUCCESS == zend_hash_find(Z_ARRVAL_P(other_options), "suppress_errors", sizeof("suppress_errors"), (void**)&item)) {
-                       if (Z_TYPE_PP(item) == IS_BOOL && Z_BVAL_PP(item)) {
+                       if ((Z_TYPE_PP(item) == IS_BOOL || Z_TYPE_PP(item) == IS_LONG) &&
+                           Z_LVAL_PP(item)) {
                                suppress_errors = 1;
                        }
                }       
+               if (SUCCESS == zend_hash_find(Z_ARRVAL_P(other_options), "bypass_shell", sizeof("bypass_shell"), (void**)&item)) {
+                       if ((Z_TYPE_PP(item) == IS_BOOL || Z_TYPE_PP(item) == IS_LONG) &&
+                           Z_LVAL_PP(item)) {
+                               bypass_shell = 1;
+                       }
+               }       
        }
 #endif
        
@@ -727,21 +735,25 @@ PHP_FUNCTION(proc_open)
        
        memset(&pi, 0, sizeof(pi));
        
-       command_with_cmd = emalloc(command_len + sizeof(COMSPEC_9X) + 1 + sizeof(" /c "));
-       sprintf(command_with_cmd, "%s /c %s", GetVersion() < 0x80000000 ? COMSPEC_NT : COMSPEC_9X, command);
-
        if (suppress_errors) {
                old_error_mode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);
        }
        
-       newprocok = CreateProcess(NULL, command_with_cmd, &security, &security, TRUE, NORMAL_PRIORITY_CLASS, env.envp, cwd, &si, &pi);
+       if (bypass_shell) {
+               newprocok = CreateProcess(NULL, command, &security, &security, TRUE, NORMAL_PRIORITY_CLASS, env.envp, cwd, &si, &pi);
+       } else {
+               command_with_cmd = emalloc(command_len + sizeof(COMSPEC_9X) + 1 + sizeof(" /c "));
+               sprintf(command_with_cmd, "%s /c %s", GetVersion() < 0x80000000 ? COMSPEC_NT : COMSPEC_9X, command);
+
+               newprocok = CreateProcess(NULL, command_with_cmd, &security, &security, TRUE, NORMAL_PRIORITY_CLASS, env.envp, cwd, &si, &pi);
+               
+               efree(command_with_cmd);
+       }
 
        if (suppress_errors) {
                SetErrorMode(old_error_mode);
        }
        
-       efree(command_with_cmd);
-
        if (FALSE == newprocok) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "CreateProcess failed");
                goto exit_fail;