wez             Tue Mar 18 18:39:31 2003 EDT

  Modified files:              (Branch: PHP_4_3)
    /php4/main  php_streams.h streams.c 
  Log:
  Manual merge of the persistent plain file streams code.
  See http://news.php.net/article.php?group=php.cvs&article=19680 for
  more information.
  
  
Index: php4/main/php_streams.h
diff -u php4/main/php_streams.h:1.61.2.9 php4/main/php_streams.h:1.61.2.10
--- php4/main/php_streams.h:1.61.2.9    Tue Mar 18 11:39:06 2003
+++ php4/main/php_streams.h     Tue Mar 18 18:39:31 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.61.2.9 2003/03/18 16:39:06 wez Exp $ */
+/* $Id: php_streams.h,v 1.61.2.10 2003/03/18 23:39:31 wez Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -65,7 +65,7 @@
 #define php_stream_fopen_with_path_rel(filename, mode, path, opened, options) 
_php_stream_fopen_with_path((filename), (mode), (path), (opened), (options) 
STREAMS_REL_CC TSRMLS_CC)
 
 #define php_stream_fopen_from_file_rel(file, mode)      
_php_stream_fopen_from_file((file), (mode) STREAMS_REL_CC TSRMLS_CC)
-#define php_stream_fopen_from_fd_rel(fd, mode)         
_php_stream_fopen_from_fd((fd), (mode) STREAMS_REL_CC TSRMLS_CC)
+#define php_stream_fopen_from_fd_rel(fd, mode, persistent_id)          
_php_stream_fopen_from_fd((fd), (mode), (persistent_id) STREAMS_REL_CC TSRMLS_CC)
        
 #define php_stream_fopen_from_pipe_rel(file, mode)      
_php_stream_fopen_from_pipe((file), (mode) STREAMS_REL_CC TSRMLS_CC)
        
@@ -440,8 +440,8 @@
 PHPAPI php_stream *_php_stream_fopen_with_path(char *filename, char *mode, char 
*path, char **opened_path, int options STREAMS_DC TSRMLS_DC);
 #define php_stream_fopen_with_path(filename, mode, path, opened)       
_php_stream_fopen_with_path((filename), (mode), (path), (opened) STREAMS_CC TSRMLS_CC)
 
-PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode STREAMS_DC 
TSRMLS_DC);
-#define php_stream_fopen_from_fd(fd, mode)  _php_stream_fopen_from_fd((fd), (mode) 
STREAMS_CC TSRMLS_CC)
+PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode, const char 
*persistent_id STREAMS_DC TSRMLS_DC);
+#define php_stream_fopen_from_fd(fd, mode, persistent_id)  
_php_stream_fopen_from_fd((fd), (mode), (persistent_id) STREAMS_CC TSRMLS_CC)
 
 PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode 
STREAMS_DC TSRMLS_DC);
 #define php_stream_fopen_from_file(file, mode) _php_stream_fopen_from_file((file), 
(mode) STREAMS_CC TSRMLS_CC)
@@ -510,6 +510,9 @@
 
 /* if set, skip open_basedir checks */
 #define STREAM_DISABLE_OPEN_BASEDIR    1024
+
+/* get (or create) a persistent version of the stream */
+#define STREAM_OPEN_PERSISTENT 2048
 
 /* Antique - no longer has meaning */
 #define IGNORE_URL_WIN 0
Index: php4/main/streams.c
diff -u php4/main/streams.c:1.125.2.43 php4/main/streams.c:1.125.2.44
--- php4/main/streams.c:1.125.2.43      Tue Mar 18 17:25:02 2003
+++ php4/main/streams.c Tue Mar 18 18:39:31 2003
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.125.2.43 2003/03/18 22:25:02 wez Exp $ */
+/* $Id: streams.c,v 1.125.2.44 2003/03/18 23:39:31 wez Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1295,7 +1295,7 @@
        int fd = php_open_temporary_fd(dir, pfx, opened_path TSRMLS_CC);
 
        if (fd != -1)   {
-               php_stream *stream = php_stream_fopen_from_fd_rel(fd, "r+b");
+               php_stream *stream = php_stream_fopen_from_fd_rel(fd, "r+b", NULL);
                if (stream) {
                        return stream;
                }
@@ -1314,7 +1314,7 @@
        int fd = php_open_temporary_fd(NULL, "php", &opened_path TSRMLS_CC);
 
        if (fd != -1)   {
-               php_stream *stream = php_stream_fopen_from_fd_rel(fd, "r+b");
+               php_stream *stream = php_stream_fopen_from_fd_rel(fd, "r+b", NULL);
                if (stream) {
                        php_stdio_stream_data *self = 
(php_stdio_stream_data*)stream->abstract;
 
@@ -1465,6 +1465,7 @@
                }
                if (data->temp_file_name) {
                        unlink(data->temp_file_name);
+                       /* temporary streams are never persistent */
                        efree(data->temp_file_name);
                }
        } else {
@@ -1472,8 +1473,7 @@
                data->file = NULL;
        }
 
-       /* STDIO streams are never persistent! */
-       efree(data);
+       pefree(data, stream->is_persistent);
 
        return ret;
 }
@@ -1875,7 +1875,9 @@
        struct stat st;
        int open_flags;
        int fd;
-       php_stream *ret;
+       php_stream *ret = NULL;
+       int persistent = options & STREAM_OPEN_PERSISTENT;
+       char *persistent_id = NULL;
 
        if (FAILURE == php_stream_parse_fopen_modes(mode, &open_flags)) {
                if (options & REPORT_ERRORS) {
@@ -1886,6 +1888,25 @@
 
        realpath = expand_filepath(filename, NULL TSRMLS_CC);
 
+       if (persistent) {
+               spprintf(&persistent_id, 0, "streams_stdio_%d_%s", open_flags, 
realpath);
+               switch (php_stream_from_persistent_id(persistent_id, &ret TSRMLS_CC)) {
+                       case PHP_STREAM_PERSISTENT_SUCCESS:
+                               if (opened_path) {
+                                       *opened_path = realpath;
+                                       realpath = NULL;
+                               }
+                               if (realpath) {
+                                       efree(realpath);
+                               }
+                               /* fall through */
+
+                       case PHP_STREAM_PERSISTENT_FAILURE:
+                               efree(persistent_id);;
+                               return ret;
+               }
+       }
+       
        fd = open(realpath, open_flags, 0666);
 
        if (fd != -1)   {
@@ -1899,15 +1920,19 @@
                                goto err;
                } 
        
-               ret = php_stream_fopen_from_fd_rel(fd, mode);
+               ret = php_stream_fopen_from_fd_rel(fd, mode, persistent_id);
 
                if (ret)        {
-                       if (opened_path)        {
+                       if (opened_path) {
                                *opened_path = realpath;
                                realpath = NULL;
                        }
-                       if (realpath)
+                       if (realpath) {
                                efree(realpath);
+                       }
+                       if (persistent_id) {
+                               efree(persistent_id);
+                       }
 
                        return ret;
                }
@@ -1915,16 +1940,19 @@
                close(fd);
        }
        efree(realpath);
+       if (persistent_id) {
+               efree(persistent_id);
+       }
        return NULL;
 }
 /* }}} */
 
-PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode STREAMS_DC 
TSRMLS_DC)
+PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode, const char 
*persistent_id STREAMS_DC TSRMLS_DC)
 {
        php_stdio_stream_data *self;
        php_stream *stream;
 
-       self = emalloc_rel_orig(sizeof(*self));
+       self = pemalloc_rel_orig(sizeof(*self), persistent_id);
        memset(self, 0, sizeof(*self));
        self->file = NULL;
        self->is_pipe = 0;
@@ -1949,7 +1977,7 @@
        }
 #endif
 
-       stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
+       stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, persistent_id, 
mode);
 
        if (stream) {
                if (self->is_pipe) {



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

Reply via email to