summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/file.c41
-rw-r--r--ext/standard/ftp_fopen_wrapper.c13
-rw-r--r--ext/standard/http_fopen_wrapper.c14
-rw-r--r--ext/standard/php_fopen_wrapper.c2
-rw-r--r--ext/zlib/zlib_fopen_wrapper.c3
5 files changed, 48 insertions, 25 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c
index 4d3e952406..fcd50a3cbd 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1529,9 +1529,8 @@ PHP_NAMED_FUNCTION(php_if_fstat)
zval *stat_dev, *stat_ino, *stat_mode, *stat_nlink, *stat_uid, *stat_gid, *stat_rdev,
*stat_size, *stat_atime, *stat_mtime, *stat_ctime, *stat_blksize, *stat_blocks;
int type;
- void *what;
- struct stat stat_sb;
- int fd;
+ php_stream *stream;
+ php_stream_statbuf stat_ssb;
char *stat_sb_names[13]={"dev", "ino", "mode", "nlink", "uid", "gid", "rdev",
"size", "atime", "mtime", "ctime", "blksize", "blocks"};
@@ -1540,41 +1539,37 @@ PHP_NAMED_FUNCTION(php_if_fstat)
WRONG_PARAM_COUNT;
}
- what = zend_fetch_resource(fp TSRMLS_CC,-1, "File-Handle", &type, 1, le_stream);
- ZEND_VERIFY_RESOURCE(what);
+ stream = (php_stream *) zend_fetch_resource(fp TSRMLS_CC,-1, "File-Handle", &type, 1, le_stream);
+ ZEND_VERIFY_RESOURCE(stream);
- if (FAILURE == php_stream_cast((php_stream*)what, PHP_STREAM_AS_FD, (void*)&fd, 1)) {
- RETURN_FALSE;
- }
-
- if (fstat(fd, &stat_sb)) {
+ if (php_stream_stat(stream, &stat_ssb)) {
RETURN_FALSE;
}
array_init(return_value);
- MAKE_LONG_ZVAL_INCREF(stat_dev, stat_sb.st_dev);
- MAKE_LONG_ZVAL_INCREF(stat_ino, stat_sb.st_ino);
- MAKE_LONG_ZVAL_INCREF(stat_mode, stat_sb.st_mode);
- MAKE_LONG_ZVAL_INCREF(stat_nlink, stat_sb.st_nlink);
- MAKE_LONG_ZVAL_INCREF(stat_uid, stat_sb.st_uid);
- MAKE_LONG_ZVAL_INCREF(stat_gid, stat_sb.st_gid);
+ MAKE_LONG_ZVAL_INCREF(stat_dev, stat_ssb.sb.st_dev);
+ MAKE_LONG_ZVAL_INCREF(stat_ino, stat_ssb.sb.st_ino);
+ MAKE_LONG_ZVAL_INCREF(stat_mode, stat_ssb.sb.st_mode);
+ MAKE_LONG_ZVAL_INCREF(stat_nlink, stat_ssb.sb.st_nlink);
+ MAKE_LONG_ZVAL_INCREF(stat_uid, stat_ssb.sb.st_uid);
+ MAKE_LONG_ZVAL_INCREF(stat_gid, stat_ssb.sb.st_gid);
#ifdef HAVE_ST_RDEV
- MAKE_LONG_ZVAL_INCREF(stat_rdev, stat_sb.st_rdev);
+ MAKE_LONG_ZVAL_INCREF(stat_rdev, stat_ssb.sb.st_rdev);
#else
MAKE_LONG_ZVAL_INCREF(stat_rdev, -1);
#endif
- MAKE_LONG_ZVAL_INCREF(stat_size, stat_sb.st_size);
- MAKE_LONG_ZVAL_INCREF(stat_atime, stat_sb.st_atime);
- MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_sb.st_mtime);
- MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_sb.st_ctime);
+ MAKE_LONG_ZVAL_INCREF(stat_size, stat_ssb.sb.st_size);
+ MAKE_LONG_ZVAL_INCREF(stat_atime, stat_ssb.sb.st_atime);
+ MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_ssb.sb.st_mtime);
+ MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_ssb.sb.st_ctime);
#ifdef HAVE_ST_BLKSIZE
- MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_sb.st_blksize);
+ MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_ssb.sb.st_blksize);
#else
MAKE_LONG_ZVAL_INCREF(stat_blksize,-1);
#endif
#ifdef HAVE_ST_BLOCKS
- MAKE_LONG_ZVAL_INCREF(stat_blocks, stat_sb.st_blocks);
+ MAKE_LONG_ZVAL_INCREF(stat_blocks, stat_ssb.sb.st_blocks);
#else
MAKE_LONG_ZVAL_INCREF(stat_blocks,-1);
#endif
diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c
index 70bf9e68ae..e7f6eef638 100644
--- a/ext/standard/ftp_fopen_wrapper.c
+++ b/ext/standard/ftp_fopen_wrapper.c
@@ -77,8 +77,21 @@ static int php_get_ftp_result(php_stream *stream TSRMLS_DC)
return strtol(tmp_line, NULL, 10);
}
+static int php_stream_ftp_stream_stat(php_stream_wrapper *wrapper,
+ php_stream *stream,
+ php_stream_statbuf *ssb
+ TSRMLS_DC)
+{
+ /* For now, we return with a failure code to prevent the underlying
+ * file's details from being used instead. */
+ return -1;
+}
+
+
static php_stream_wrapper_ops ftp_stream_wops = {
php_stream_url_wrap_ftp,
+ NULL,
+ php_stream_ftp_stream_stat,
NULL
};
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 2f566bd1b3..c96f43ddff 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -70,7 +70,6 @@
#define HTTP_HEADER_BLOCK_SIZE 1024
-
php_stream *php_stream_url_wrap_http(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)
{
php_stream *stream = NULL;
@@ -309,8 +308,21 @@ out:
return stream;
}
+static int php_stream_http_stream_stat(php_stream_wrapper *wrapper,
+ php_stream *stream,
+ php_stream_statbuf *ssb
+ TSRMLS_DC)
+{
+ /* one day, we could fill in the details based on Date: and Content-Length:
+ * headers. For now, we return with a failure code to prevent the underlying
+ * file's details from being used instead. */
+ return -1;
+}
+
static php_stream_wrapper_ops http_stream_wops = {
php_stream_url_wrap_http,
+ NULL,
+ php_stream_http_stream_stat,
NULL
};
diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c
index 842df5fcee..e7f07a9e9b 100644
--- a/ext/standard/php_fopen_wrapper.c
+++ b/ext/standard/php_fopen_wrapper.c
@@ -57,6 +57,8 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
static php_stream_wrapper_ops php_stdio_wops = {
php_stream_url_wrap_php,
+ NULL,
+ NULL,
NULL
};
diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c
index c6e60e3638..c345241aa6 100644
--- a/ext/zlib/zlib_fopen_wrapper.c
+++ b/ext/zlib/zlib_fopen_wrapper.c
@@ -88,8 +88,9 @@ static int php_gziop_flush(php_stream *stream TSRMLS_DC)
php_stream_ops php_stream_gzio_ops = {
php_gziop_write, php_gziop_read,
php_gziop_close, php_gziop_flush,
+ "ZLIB",
php_gziop_seek, php_gziop_gets,
- NULL, "ZLIB"
+ NULL, NULL
};
php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)