]> granicus.if.org Git - php/commitdiff
fix for bug #16168
authorWez Furlong <wez@php.net>
Tue, 19 Mar 2002 17:49:02 +0000 (17:49 +0000)
committerWez Furlong <wez@php.net>
Tue, 19 Mar 2002 17:49:02 +0000 (17:49 +0000)
ext/standard/file.c
ext/standard/file.h
main/main.c
main/network.c
main/php_network.h
main/php_streams.h
main/streams.c

index 727faa96cadd8c06c684f01aaffa185e2f84e869..a58b511902eaf3d4390ff7ef3f5c416e0fa751a5 100644 (file)
@@ -126,6 +126,7 @@ static void file_globals_ctor(php_file_globals *file_globals_p TSRMLS_DC)
        zend_hash_init(&FG(ht_persistent_socks), 0, NULL, NULL, 1);
        FG(fgetss_state) = 0;
        FG(pclose_ret) = 0;
+       FG(def_chunk_size) = PHP_SOCK_CHUNK_SIZE;
 }
 
 
index ba9fb54daeaabca26c9c9ef96c9402e9cdb16fdf..54d63469d15c7932849bfe0ed951dbb6de32f13e 100644 (file)
@@ -108,6 +108,7 @@ typedef struct {
   int fgetss_state;
   int pclose_ret;
   HashTable ht_persistent_socks;
+  size_t def_chunk_size;
 } php_file_globals;
 
 #ifdef ZTS
index b7abac4af23062461e26783c9a006ef393323f7c..e6b8c8f0fd5ed18eb2a58c4a159d4738aff939a7 100644 (file)
@@ -565,13 +565,15 @@ static FILE *php_fopen_wrapper_for_zend(const char *filename, char **opened_path
 {
        FILE *retval = NULL;
        php_stream *stream;
+       size_t old_chunk_size;
        TSRMLS_FETCH();
 
+       old_chunk_size = FG(def_chunk_size);
+       FG(def_chunk_size) = 1;
        stream = php_stream_open_wrapper((char *)filename, "rb", USE_PATH|IGNORE_URL_WIN|REPORT_ERRORS, opened_path);
+       FG(def_chunk_size) = old_chunk_size;
+       
        if (stream)     {
-               /* no need for us to check the stream type here */
-               php_stream_sock_set_chunk_size(stream, 1 TSRMLS_CC);
-
                /* when this succeeds, stream either has or will be freed automatically */
                if (php_stream_cast(stream, PHP_STREAM_AS_STDIO|PHP_STREAM_CAST_TRY_HARD|PHP_STREAM_CAST_RELEASE,
                                        (void**)&retval, REPORT_ERRORS) == FAILURE)
index 0d805270183a0041eb8c2606ec75d5ed2ec7843e..be15ae26771aeb836bc476411cf28edf7a264b8b 100644 (file)
@@ -17,7 +17,6 @@
  */
 /* $Id$ */
 
-#define PHP_SOCK_CHUNK_SIZE    8192
 #define MAX_CHUNKS_PER_READ 10
 
 #include "php.h"
@@ -71,6 +70,8 @@ int            inet_aton(const char *, struct in_addr *);
 #include <sys/un.h>
 #endif
 
+#include "ext/standard/file.h"
+
 #ifdef PHP_WIN32
 # define SOCK_ERR INVALID_SOCKET
 # define SOCK_CONN_ERR SOCKET_ERROR
@@ -425,7 +426,7 @@ PHPAPI php_stream *_php_stream_sock_open_from_socket(int socket, int persistent
        memset(sock, 0, sizeof(php_netstream_data_t));
 
        sock->is_blocked = 1;
-       sock->chunk_size = PHP_SOCK_CHUNK_SIZE;
+       sock->chunk_size = FG(def_chunk_size);
        sock->timeout.tv_sec = -1;
        sock->socket = socket;
 
@@ -780,7 +781,7 @@ static int php_sockop_cast(php_stream *stream, int castas, void **ret TSRMLS_DC)
                        if (ret)        {
                                /* DANGER!: data buffered in stream->readbuf will be forgotten! */
                                if (TOREAD(sock) > 0)
-                                       zend_error(E_WARNING, "%s(): buffered data lost during conversion to FILE*!", get_active_function_name(TSRMLS_C));
+                                       zend_error(E_WARNING, "%s(): %d bytes of buffered data lost during conversion to FILE*!", get_active_function_name(TSRMLS_C), TOREAD(sock));
                                *ret = fdopen(sock->socket, stream->mode);
                                if (*ret)
                                        return SUCCESS;
index 3d1f29a831939ab3d060d02431e911cd12dffcd7..37e0a1add572ac647af0ea64022028dbd665ae22 100644 (file)
@@ -73,6 +73,8 @@
 # define SOCK_RECV_ERR -1
 #endif
 
+#define PHP_SOCK_CHUNK_SIZE    8192
+
 #ifdef HAVE_SOCKADDR_STORAGE
 typedef struct sockaddr_storage php_sockaddr_storage;
 #else
index 8d264f021da99b22ca3789ca9a1409f0071b2048..a590c9c94ffb6b142974da05eb088cefbad03f63 100755 (executable)
@@ -69,7 +69,7 @@
        
 #define php_stream_open_wrapper_rel(path, mode, options, opened) _php_stream_open_wrapper((path), (mode), (options), (opened) STREAMS_REL_CC TSRMLS_CC)
 
-#define php_stream_make_seekable_rel(origstream, newstream) _php_stream_make_seekable(origstream, newstream STREAMS_REL_CC TSRMLS_CC)
+#define php_stream_make_seekable_rel(origstream, newstream, flags) _php_stream_make_seekable((origstream), (newstream), (flags) STREAMS_REL_CC TSRMLS_CC)
 
 /* }}} */
        
@@ -266,8 +266,10 @@ PHPAPI php_stream *_php_stream_open_wrapper(char *path, char *mode, int options,
 #define PHP_STREAM_FAILED              2 /* an error occurred while attempting conversion */
 #define PHP_STREAM_CRITICAL            3 /* an error occurred; origstream is in an unknown state; you should close origstream */
 /* DO NOT call this on streams that are referenced by resources! */
-PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstream STREAMS_DC TSRMLS_DC);
-#define php_stream_make_seekable(origstream, newstream)        _php_stream_make_seekable(origstream, newstream STREAMS_CC TSRMLS_CC)
+#define PHP_STREAM_NO_PREFERENCE       0
+#define PHP_STREAM_PREFER_STDIO                1
+PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstream, int flags STREAMS_DC TSRMLS_DC);
+#define php_stream_make_seekable(origstream, newstream, flags) _php_stream_make_seekable((origstream), (newstream), (flags) STREAMS_CC TSRMLS_CC)
 
 
 /* for user-space streams */
index 24393fed1dfd24cdac50f5798d7edd22a287c883..9665d8e240d90860e8f028772a2a7ee9a3b74978 100755 (executable)
@@ -831,17 +831,13 @@ PHPAPI int _php_stream_cast(php_stream *stream, int castas, void **ret, int show
                        goto exit_success;
                }
 
-               {
-                       TSRMLS_FETCH();
-
-                       /* must be either:
-                               a) programmer error
-                               b) no memory
-                               -> lets bail
-                        */
-                       zend_error(E_ERROR, "%s(): fopencookie failed", get_active_function_name(TSRMLS_C));
-                       return FAILURE;
-               }
+               /* must be either:
+                       a) programmer error
+                       b) no memory
+                       -> lets bail
+               */
+               zend_error(E_ERROR, "%s(): fopencookie failed", get_active_function_name(TSRMLS_C));
+               return FAILURE;
 #endif
 
                goto exit_fail;
@@ -990,7 +986,7 @@ out:
        if (stream != NULL && (options & STREAM_MUST_SEEK)) {
                php_stream *newstream;
 
-               switch(php_stream_make_seekable_rel(stream, &newstream)) {
+               switch(php_stream_make_seekable_rel(stream, &newstream, PHP_STREAM_NO_PREFERENCE)) {
                        case PHP_STREAM_UNCHANGED:
                                return stream;
                        case PHP_STREAM_RELEASED:
@@ -1018,7 +1014,9 @@ out:
        return stream;
 }
 
-PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstream STREAMS_DC TSRMLS_DC)
+#define PHP_STREAM_MAX_MEM     2 * 1024 * 1024
+
+PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstream, int flags STREAMS_DC TSRMLS_DC)
 {
        assert(newstream != NULL);
 
@@ -1031,7 +1029,10 @@ PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstr
        
        /* Use a tmpfile and copy the old streams contents into it */
 
-       *newstream = php_stream_fopen_tmpfile();
+       if (flags & PHP_STREAM_PREFER_STDIO)
+               *newstream = php_stream_fopen_tmpfile();
+       else
+               *newstream = php_stream_temp_create(TEMP_STREAM_DEFAULT, PHP_STREAM_MAX_MEM);
 
        if (*newstream == NULL)
                return PHP_STREAM_FAILED;