From 27cdd59febfbcf79ac407fd05edb44716e81caa3 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 12 Dec 2002 17:44:48 +0000 Subject: [PATCH] Fix some issues with the return value from pclose and proc_close, and bogus seek-on-pipe warnings when used with fpassthru. --- ext/standard/exec.c | 18 +++++++++--------- main/streams.c | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/ext/standard/exec.c b/ext/standard/exec.c index f83ca07f19..fd5076297b 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -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; diff --git a/main/streams.c b/main/streams.c index f49f7549e6..72df26ea16 100755 --- a/main/streams.c +++ b/main/streams.c @@ -32,6 +32,9 @@ #ifdef HAVE_SYS_MMAN_H #include #endif +#if HAVE_SYS_WAIT_H +#include +#endif #include @@ -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); } -- 2.40.0