summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorWez Furlong <wez@php.net>2002-04-16 22:14:27 +0000
committerWez Furlong <wez@php.net>2002-04-16 22:14:27 +0000
commitb10b24d50cd4fb584897badee0c6b809b02d7fcb (patch)
tree7f616a36aab17efb68f83ec3075b454eb4b34356 /ext
parentfe2badf64eb32c290e681dd531a27c5467b0867b (diff)
downloadphp-git-b10b24d50cd4fb584897badee0c6b809b02d7fcb.tar.gz
Always initialize wrappers, regardless of PG(allow_url_fopen).
Add is_url field to wrapper structure; the stream wrapper openers will disallow opening is is_url && !PG(allow_url_fopen). Add infrastructure for stat($url) and opendir($url). Tidy up/centralize code that locates and instantiates wrappers for the various operations. Implement opendir for plain files. Make the PHP opendir and dir functions use the streams implementations. Add modelines for syntax highlighting the pear scripts in vim
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/basic_functions.c28
-rw-r--r--ext/standard/dir.c78
-rw-r--r--ext/standard/ftp_fopen_wrapper.c3
-rw-r--r--ext/standard/http_fopen_wrapper.c3
-rw-r--r--ext/standard/php_fopen_wrapper.c3
-rw-r--r--ext/zlib/zlib.c7
-rw-r--r--ext/zlib/zlib_fopen_wrapper.c5
7 files changed, 45 insertions, 82 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 3a10750302..6a2ab33467 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -983,21 +983,14 @@ PHP_MINIT_FUNCTION(basic)
PHP_MINIT(url_scanner_ex) (INIT_FUNC_ARGS_PASSTHRU);
PHP_MINIT(proc_open) (INIT_FUNC_ARGS_PASSTHRU);
+ PHP_MINIT(user_streams) (INIT_FUNC_ARGS_PASSTHRU);
- if (PG(allow_url_fopen)) {
- PHP_MINIT(user_streams) (INIT_FUNC_ARGS_PASSTHRU);
-
- if (FAILURE == php_register_url_stream_wrapper("http", &php_stream_http_wrapper TSRMLS_CC))
- return FAILURE;
- if (FAILURE == php_register_url_stream_wrapper("php", &php_stream_php_wrapper TSRMLS_CC))
- return FAILURE;
- if (FAILURE == php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper TSRMLS_CC))
- return FAILURE;
+ php_register_url_stream_wrapper("http", &php_stream_http_wrapper TSRMLS_CC);
+ php_register_url_stream_wrapper("php", &php_stream_php_wrapper TSRMLS_CC);
+ php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper TSRMLS_CC);
# if HAVE_OPENSSL_EXT
- if (FAILURE == php_register_url_stream_wrapper("https", &php_stream_http_wrapper TSRMLS_CC))
- return FAILURE;
+ php_register_url_stream_wrapper("https", &php_stream_http_wrapper TSRMLS_CC);
# endif
- }
return SUCCESS;
}
@@ -1011,16 +1004,13 @@ PHP_MSHUTDOWN_FUNCTION(basic)
basic_globals_dtor(&basic_globals TSRMLS_CC);
#endif
- if (PG(allow_url_fopen)) {
- php_unregister_url_stream_wrapper("http" TSRMLS_CC);
- php_unregister_url_stream_wrapper("ftp" TSRMLS_CC);
- php_unregister_url_stream_wrapper("php" TSRMLS_CC);
+ php_unregister_url_stream_wrapper("http" TSRMLS_CC);
+ php_unregister_url_stream_wrapper("ftp" TSRMLS_CC);
+ php_unregister_url_stream_wrapper("php" TSRMLS_CC);
# if HAVE_OPENSSL_EXT
- php_unregister_url_stream_wrapper("https" TSRMLS_CC);
+ php_unregister_url_stream_wrapper("https" TSRMLS_CC);
# endif
- }
-
UNREGISTER_INI_ENTRIES();
PHP_MSHUTDOWN(regex) (SHUTDOWN_FUNC_ARGS_PASSTHRU);
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
index a4eb21024f..e14eb56dae 100644
--- a/ext/standard/dir.c
+++ b/ext/standard/dir.c
@@ -22,7 +22,7 @@
#include "php.h"
#include "fopen_wrappers.h"
-
+#include "file.h"
#include "php_dir.h"
#ifdef HAVE_DIRENT_H
@@ -55,12 +55,14 @@ int dir_globals_id;
php_dir_globals dir_globals;
#endif
+#if 0
typedef struct {
int id;
DIR *dir;
} php_dir;
static int le_dirp;
+#endif
static zend_class_entry *dir_class_entry_ptr;
@@ -72,14 +74,14 @@ static zend_class_entry *dir_class_entry_ptr;
php_error(E_WARNING, "unable to find my handle property"); \
RETURN_FALSE; \
} \
- ZEND_FETCH_RESOURCE(dirp, php_dir *, tmp, -1, "Directory", le_dirp); \
+ ZEND_FETCH_RESOURCE(dirp, php_stream *, tmp, -1, "Directory", php_file_le_stream()); \
} else { \
- ZEND_FETCH_RESOURCE(dirp, php_dir *, 0, DIRG(default_dir), "Directory", le_dirp); \
+ ZEND_FETCH_RESOURCE(dirp, php_stream *, 0, DIRG(default_dir), "Directory", php_file_le_stream()); \
} \
} else if ((ZEND_NUM_ARGS() != 1) || zend_get_parameters_ex(1, &id) == FAILURE) { \
WRONG_PARAM_COUNT; \
} else { \
- ZEND_FETCH_RESOURCE(dirp, php_dir *, id,-1, "Directory", le_dirp); \
+ ZEND_FETCH_RESOURCE(dirp, php_stream *, id,-1, "Directory", php_file_le_stream()); \
}
static zend_function_entry php_dir_class_functions[] = {
@@ -103,15 +105,6 @@ static void php_set_default_dir(int id TSRMLS_DC)
DIRG(default_dir) = id;
}
-
-static void _dir_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- php_dir *dirp = (php_dir *)rsrc->ptr;
-
- closedir(dirp->dir);
- efree(dirp);
-}
-
PHP_RINIT_FUNCTION(dir)
{
DIRG(default_dir) = -1;
@@ -123,8 +116,6 @@ PHP_MINIT_FUNCTION(dir)
static char tmpstr[2];
zend_class_entry dir_class_entry;
- le_dirp = zend_register_list_destructors_ex(_dir_dtor, NULL, "dir", module_number);
-
INIT_CLASS_ENTRY(dir_class_entry, "Directory", php_dir_class_functions);
dir_class_entry_ptr = zend_register_internal_class(&dir_class_entry TSRMLS_CC);
@@ -144,49 +135,29 @@ PHP_MINIT_FUNCTION(dir)
static void _php_do_opendir(INTERNAL_FUNCTION_PARAMETERS, int createobject)
{
pval **arg;
- php_dir *dirp;
+ php_stream *dirp;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(arg);
-
- if (php_check_open_basedir(Z_STRVAL_PP(arg) TSRMLS_CC)) {
- RETURN_FALSE;
- }
- if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(arg), NULL, CHECKUID_ALLOW_ONLY_FILE))) {
- RETURN_FALSE;
- }
-
- dirp = emalloc(sizeof(php_dir));
-
- dirp->dir = VCWD_OPENDIR(Z_STRVAL_PP(arg));
+ dirp = php_stream_opendir(Z_STRVAL_PP(arg), ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
-#ifdef PHP_WIN32
- if (!dirp->dir || dirp->dir->finished) {
- if (dirp->dir) {
- closedir(dirp->dir);
- }
-#else
- if (!dirp->dir) {
-#endif
- efree(dirp);
- php_error(E_WARNING, "OpenDir: %s (errno %d)", strerror(errno), errno);
+ if (dirp == NULL) {
RETURN_FALSE;
}
-
- dirp->id = zend_list_insert(dirp, le_dirp);
-
- php_set_default_dir(dirp->id TSRMLS_CC);
+
+ php_set_default_dir(dirp->rsrc_id TSRMLS_CC);
if (createobject) {
object_init_ex(return_value, dir_class_entry_ptr);
add_property_stringl(return_value, "path", Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), 1);
- add_property_resource(return_value, "handle", dirp->id);
- zend_list_addref(dirp->id);
+ add_property_resource(return_value, "handle", dirp->rsrc_id);
+ zend_list_addref(dirp->rsrc_id); /* might not be needed */
+ php_stream_auto_cleanup(dirp); /* so we don't get warnings under debug */
} else {
- RETURN_RESOURCE(dirp->id);
+ php_stream_to_zval(dirp, return_value);
}
}
@@ -215,13 +186,13 @@ PHP_FUNCTION(getdir)
PHP_FUNCTION(closedir)
{
pval **id, **tmp, *myself;
- php_dir *dirp;
+ php_stream *dirp;
FETCH_DIRP();
- zend_list_delete(dirp->id);
+ zend_list_delete(dirp->rsrc_id);
- if (dirp->id == DIRG(default_dir)) {
+ if (dirp->rsrc_id == DIRG(default_dir)) {
php_set_default_dir(-1 TSRMLS_CC);
}
}
@@ -323,11 +294,11 @@ PHP_FUNCTION(getcwd)
PHP_FUNCTION(rewinddir)
{
pval **id, **tmp, *myself;
- php_dir *dirp;
+ php_stream *dirp;
FETCH_DIRP();
- rewinddir(dirp->dir);
+ php_stream_rewinddir(dirp);
}
/* }}} */
@@ -337,14 +308,13 @@ PHP_FUNCTION(rewinddir)
PHP_NAMED_FUNCTION(php_if_readdir)
{
pval **id, **tmp, *myself;
- php_dir *dirp;
- char entry[sizeof(struct dirent)+MAXPATHLEN];
- struct dirent *result = (struct dirent *)&entry; /* patch for libc5 readdir problems */
+ php_stream *dirp;
+ php_stream_dirent entry;
FETCH_DIRP();
- if (php_readdir_r(dirp->dir, (struct dirent *) entry, &result) == 0 && result) {
- RETURN_STRINGL(result->d_name, strlen(result->d_name), 1);
+ if (php_stream_readdir(dirp, &entry)) {
+ RETURN_STRINGL(entry.d_name, strlen(entry.d_name), 1);
}
RETURN_FALSE;
}
diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c
index 2f3db50593..f37b71e01c 100644
--- a/ext/standard/ftp_fopen_wrapper.c
+++ b/ext/standard/ftp_fopen_wrapper.c
@@ -97,7 +97,8 @@ static php_stream_wrapper_ops ftp_stream_wops = {
php_stream_wrapper php_stream_ftp_wrapper = {
&ftp_stream_wops,
- NULL
+ NULL,
+ 1 /* is_url */
};
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 994e60d719..05006f2517 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -367,7 +367,8 @@ static php_stream_wrapper_ops http_stream_wops = {
php_stream_wrapper php_stream_http_wrapper = {
&http_stream_wops,
- NULL
+ NULL,
+ 1 /* is_url */
};
/*
diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c
index 6249aeae98..e2a9eea8b6 100644
--- a/ext/standard/php_fopen_wrapper.c
+++ b/ext/standard/php_fopen_wrapper.c
@@ -64,7 +64,8 @@ static php_stream_wrapper_ops php_stdio_wops = {
php_stream_wrapper php_stream_php_wrapper = {
&php_stdio_wops,
- NULL
+ NULL,
+ 0, /* is_url */
};
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 0ddb63e362..fb63e7d123 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -181,9 +181,7 @@ PHP_MINIT_FUNCTION(zlib)
#ifdef ZTS
ts_allocate_id(&zlib_globals_id, sizeof(zend_zlib_globals), (ts_allocate_ctor) php_zlib_init_globals, NULL);
#endif
- if(PG(allow_url_fopen)) {
- php_register_url_stream_wrapper("zlib", &php_stream_gzip_wrapper TSRMLS_CC);
- }
+ php_register_url_stream_wrapper("zlib", &php_stream_gzip_wrapper TSRMLS_CC);
REGISTER_LONG_CONSTANT("FORCE_GZIP", CODING_GZIP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FORCE_DEFLATE", CODING_DEFLATE, CONST_CS | CONST_PERSISTENT);
@@ -216,8 +214,7 @@ PHP_RINIT_FUNCTION(zlib)
*/
PHP_MSHUTDOWN_FUNCTION(zlib)
{
- if (PG(allow_url_fopen))
- php_unregister_url_stream_wrapper("zlib" TSRMLS_CC);
+ php_unregister_url_stream_wrapper("zlib" TSRMLS_CC);
UNREGISTER_INI_ENTRIES();
diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c
index bdc2b5a882..0886689634 100644
--- a/ext/zlib/zlib_fopen_wrapper.c
+++ b/ext/zlib/zlib_fopen_wrapper.c
@@ -132,12 +132,15 @@ php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mod
static php_stream_wrapper_ops gzip_stream_wops = {
php_stream_gzopen,
+ NULL,
+ NULL,
NULL
};
php_stream_wrapper php_stream_gzip_wrapper = {
&gzip_stream_wops,
- NULL
+ NULL,
+ 0, /* is_url */
};