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