dmitry          Sat Jan  6 09:08:07 2007 UTC

  Modified files:              
    /php-src/ext/standard       proc_open.c 
  Log:
  Improved proc_open(). Now on Windows it can run external commands not through 
CMD.EXE
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/proc_open.c?r1=1.49&r2=1.50&diff_format=u
Index: php-src/ext/standard/proc_open.c
diff -u php-src/ext/standard/proc_open.c:1.49 
php-src/ext/standard/proc_open.c:1.50
--- php-src/ext/standard/proc_open.c:1.49       Tue Jan  2 15:31:58 2007
+++ php-src/ext/standard/proc_open.c    Sat Jan  6 09:08:06 2007
@@ -15,7 +15,7 @@
    | Author: Wez Furlong <[EMAIL PROTECTED]>                           |
    +----------------------------------------------------------------------+
  */
-/* $Id: proc_open.c,v 1.49 2007/01/02 15:31:58 nlopess Exp $ */
+/* $Id: proc_open.c,v 1.50 2007/01/06 09:08:06 dmitry Exp $ */
 
 #if 0 && (defined(__linux__) || defined(sun) || defined(__IRIX__))
 # define _BSD_SOURCE           /* linux wants this when XOPEN mode is on */
@@ -455,6 +455,7 @@
        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 */
@@ -476,10 +477,17 @@
                zval **item;
 #ifdef PHP_WIN32
                if (SUCCESS == zend_ascii_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_ascii_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
                /* Suppresses automatic application of unicode filters when 
unicode.semantics=on */
                if (SUCCESS == zend_ascii_hash_find(Z_ARRVAL_P(other_options), 
"binary_pipes", sizeof("binary_pipes"), (void**)&item)) {
@@ -720,21 +728,25 @@
        
        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;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to