]> granicus.if.org Git - php/commitdiff
Fix some issues with the return value from pclose and proc_close,
authorWez Furlong <wez@php.net>
Thu, 12 Dec 2002 17:44:48 +0000 (17:44 +0000)
committerWez Furlong <wez@php.net>
Thu, 12 Dec 2002 17:44:48 +0000 (17:44 +0000)
and bogus seek-on-pipe warnings when used with fpassthru.

ext/standard/exec.c
main/streams.c

index f83ca07f192fabff3ad6df7aa31728d372274842..fd5076297bb7e1dd1dd8f5e61787df461b1b66a3 100644 (file)
@@ -118,6 +118,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value TSRMLS_DC)
        int overflow_limit, lcmd, ldir;
        char *b, *c, *d=NULL;
        php_stream *stream = NULL;
+       int pclose_return = 0;
 #if PHP_SIGCHILD
        void (*sig_handler)();
 #endif
@@ -283,13 +284,8 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value TSRMLS_DC)
                }
        }
 
-       FG(pclose_ret) = php_stream_close(stream); 
+       pclose_return = php_stream_close(stream); 
 
-#if HAVE_SYS_WAIT_H
-       if (WIFEXITED(FG(pclose_ret))) {
-               FG(pclose_ret) = WEXITSTATUS(FG(pclose_ret));
-       }
-#endif
 #if PHP_SIGCHILD
        signal (SIGCHLD, sig_handler);
 #endif
@@ -297,7 +293,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value TSRMLS_DC)
                efree(d);
        }
        efree(buf);
-       return FG(pclose_ret);
+       return pclose_return;
 }
 /* }}} */
 
@@ -586,8 +582,12 @@ static void proc_open_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
        
        if (wait_pid == -1)
                FG(pclose_ret) = -1;
-       else
+       else {
+               if (WIFEXITED(wstatus))
+                       wstatus = WEXITSTATUS(wstatus);
                FG(pclose_ret) = wstatus;
+       }
+       
 # else
        FG(pclose_ret) = -1;
 # endif
@@ -976,7 +976,7 @@ PHP_FUNCTION(proc_open)
                                fp = fdopen(descriptors[i].parentend, mode_string);
 #endif
                                if (fp) {
-                                       stream = php_stream_fopen_from_file(fp, mode_string);
+                                       stream = php_stream_fopen_from_pipe(fp, mode_string);
                                        if (stream) {
                                                zval *retfp;
 
index f49f7549e688bedf289accd257f0e0c813218e91..72df26ea16fb56350a53fbd501784ab9d35b0333 100755 (executable)
@@ -32,6 +32,9 @@
 #ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h>
 #endif
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
 
 #include <stddef.h>
 
@@ -1317,6 +1320,7 @@ PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STRE
 PHPAPI php_stream *_php_stream_fopen_from_pipe(FILE *file, const char *mode STREAMS_DC TSRMLS_DC)
 {
        php_stdio_stream_data *self;
+       php_stream *stream;
 
        self = emalloc_rel_orig(sizeof(*self));
        self->file = file;
@@ -1325,7 +1329,9 @@ PHPAPI php_stream *_php_stream_fopen_from_pipe(FILE *file, const char *mode STRE
        self->fd = fileno(file);
        self->temp_file_name = NULL;
 
-       return php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
+       stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
+       stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
+       return stream;
 }
 
 static size_t php_stdiop_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC)
@@ -1385,11 +1391,19 @@ static int php_stdiop_close(php_stream *stream, int close_handle TSRMLS_DC)
        php_stdio_stream_data *data = (php_stdio_stream_data*)stream->abstract;
 
        assert(data != NULL);
-
+       
        if (close_handle) {
                if (data->file) {
                        if (data->is_process_pipe) {
+                               errno = 0;
                                ret = pclose(data->file);
+
+#if HAVE_SYS_WAIT_H
+                               if (WIFEXITED(ret)) {
+                                       ret = WEXITSTATUS(ret);
+                               }
+#endif
+
                        } else {
                                ret = fclose(data->file);
                        }