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