return strtol(tmp_line, NULL, 10);
}
-php_stream_wrapper php_stream_ftp_wrapper = {
+static php_stream_wrapper_ops ftp_stream_wops = {
php_stream_url_wrap_ftp,
- NULL,
+ NULL
+};
+
+php_stream_wrapper php_stream_ftp_wrapper = {
+ &ftp_stream_wops,
NULL
};
/* {{{ php_fopen_url_wrap_ftp
*/
-php_stream * php_stream_url_wrap_ftp(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC)
+php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)
{
php_stream *stream=NULL;
php_url *resource=NULL;
#define HTTP_HEADER_BLOCK_SIZE 1024
-php_stream *php_stream_url_wrap_http(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC)
+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;
php_url *resource = NULL;
else {
strlcpy(new_path, location, sizeof(new_path));
}
- stream = php_stream_url_wrap_http(new_path, mode, options, opened_path, NULL STREAMS_CC TSRMLS_CC);
+ stream = php_stream_url_wrap_http(NULL, new_path, mode, options, opened_path STREAMS_CC TSRMLS_CC);
if (stream->wrapperdata) {
entryp = &entry;
MAKE_STD_ZVAL(entry);
return stream;
}
-php_stream_wrapper php_stream_http_wrapper = {
+static php_stream_wrapper_ops http_stream_wops = {
php_stream_url_wrap_http,
- NULL,
NULL
};
+php_stream_wrapper php_stream_http_wrapper = {
+ &http_stream_wops,
+ NULL
+};
/*
* Local variables:
#include "php_standard.h"
#include "php_fopen_wrappers.h"
-php_stream * php_stream_url_wrap_php(char * path, char * mode, int options, char ** opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC)
+php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)
{
FILE * fp = NULL;
php_stream * stream = NULL;
return stream;
}
-php_stream_wrapper php_stream_php_wrapper = {
+static php_stream_wrapper_ops php_stdio_wops = {
php_stream_url_wrap_php,
- NULL,
+ NULL
+};
+
+php_stream_wrapper php_stream_php_wrapper = {
+ &php_stdio_wops,
NULL
};
#ifndef PHP_FOPEN_WRAPPERS_H
#define PHP_FOPEN_WRAPPERS_H
-php_stream *php_stream_url_wrap_http(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC);
-php_stream *php_stream_url_wrap_ftp(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC);
+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 *php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC);
php_stream_wrapper php_stream_http_wrapper;
php_stream_wrapper php_stream_ftp_wrapper;
php_stream_wrapper php_stream_php_wrapper;
int php_enable_output_compression(int buffer_size TSRMLS_DC);
-php_stream *php_stream_gzopen(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC);
+php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC);
extern php_stream_ops php_stream_gzio_ops;
extern php_stream_wrapper php_stream_gzip_wrapper;
convert_to_string_ex(filename);
/* using a stream here is a bit more efficient (resource wise) than php_gzopen_wrapper */
- stream = php_stream_gzopen(Z_STRVAL_PP(filename), "rb", use_include_path|ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, NULL STREAMS_CC TSRMLS_CC);
+ stream = php_stream_gzopen(NULL, Z_STRVAL_PP(filename), "rb", use_include_path|ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL STREAMS_CC TSRMLS_CC);
if (stream == NULL) {
php_error(E_WARNING,"gzFile(\"%s\") - %s",Z_STRVAL_PP(filename),strerror(errno));
RETURN_FALSE;
convert_to_string_ex(arg2);
p = estrndup(Z_STRVAL_PP(arg2),Z_STRLEN_PP(arg2));
- stream = php_stream_gzopen(Z_STRVAL_PP(arg1), p, use_include_path|ENFORCE_SAFE_MODE, NULL, NULL STREAMS_CC TSRMLS_CC);
+ stream = php_stream_gzopen(NULL, Z_STRVAL_PP(arg1), p, use_include_path|ENFORCE_SAFE_MODE, NULL STREAMS_CC TSRMLS_CC);
if (!stream) {
RETURN_FALSE;
}
}
convert_to_string_ex(arg1);
- stream = php_stream_gzopen(Z_STRVAL_PP(arg1), "rb", use_include_path|ENFORCE_SAFE_MODE, NULL, NULL STREAMS_CC TSRMLS_CC);
+ stream = php_stream_gzopen(NULL, Z_STRVAL_PP(arg1), "rb", use_include_path|ENFORCE_SAFE_MODE, NULL STREAMS_CC TSRMLS_CC);
if (!stream) {
RETURN_FALSE;
}
NULL, "ZLIB"
};
-php_stream *php_stream_gzopen(char *path, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC)
+php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)
{
struct php_gz_stream_data_t *self;
php_stream *stream = NULL;
return NULL;
}
-php_stream_wrapper php_stream_gzip_wrapper = {
+static php_stream_wrapper_ops gzip_stream_wops = {
php_stream_gzopen,
- NULL,
+ NULL
+};
+
+php_stream_wrapper php_stream_gzip_wrapper = {
+ &gzip_stream_wops,
NULL
};
* retrieve using fgetwrapperdata(). */
typedef struct _php_stream php_stream;
+typedef struct _php_stream_wrapper php_stream_wrapper;
typedef struct _php_stream_ops {
/* stdio like functions - these are mandatory! */
const char *label; /* label for this ops structure */
} php_stream_ops;
-/* options uses the IGNORE_URL family of defines from fopen_wrappers.h */
-typedef php_stream *(*php_stream_factory_func_t)(char *filename, char *mode, int options, char **opened_path, void * wrappercontext STREAMS_DC TSRMLS_DC);
-typedef void (*php_stream_wrapper_dtor_func_t)(php_stream *stream TSRMLS_DC);
+typedef struct _php_stream_wrapper_ops {
+ php_stream *(*opener)(php_stream_wrapper *wrapper, char *filename, char *mode,
+ int options, char **opened_path STREAMS_DC TSRMLS_DC);
+ php_stream *(*closer)(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC);
+} php_stream_wrapper_ops;
-typedef struct _php_stream_wrapper {
- php_stream_factory_func_t create;
- php_stream_wrapper_dtor_func_t destroy;
- void * wrappercontext;
-} php_stream_wrapper;
+struct _php_stream_wrapper {
+ php_stream_wrapper_ops *wops; /* operations the wrapper can perform */
+ void *abstract; /* context for the wrapper */
+};
struct _php_stream {
php_stream_ops *ops;
if (close_options & PHP_STREAM_FREE_RELEASE_STREAM) {
- if (stream->wrapper && stream->wrapper->destroy) {
- stream->wrapper->destroy(stream TSRMLS_CC);
+ if (stream->wrapper && stream->wrapper->wops->closer) {
+ stream->wrapper->wops->closer(stream->wrapper, stream TSRMLS_CC);
stream->wrapper = NULL;
}
protocol = NULL;
}
if (wrapper) {
- php_stream *stream = wrapper->create(path, mode, options, opened_path, wrapper->wrappercontext STREAMS_REL_CC TSRMLS_CC);
+ php_stream *stream = wrapper->wops->opener(wrapper, path, mode, options, opened_path STREAMS_REL_CC TSRMLS_CC);
if (stream)
stream->wrapper = wrapper;
return stream;
php_stream_wrapper wrapper;
};
-static php_stream *user_wrapper_factory(char *filename, char *mode, int options, char **opened_path, void * wrappercontext STREAMS_DC TSRMLS_DC);
+static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filename, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC);
+
+static php_stream_wrapper_ops user_stream_wops = {
+ user_wrapper_opener,
+ NULL
+};
+
static void stream_wrapper_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
* */
-static php_stream *user_wrapper_factory(char *filename, char *mode, int options, char **opened_path, void *wrappercontext STREAMS_DC TSRMLS_DC)
+static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filename, char *mode, int options, char **opened_path STREAMS_DC TSRMLS_DC)
{
- struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrappercontext;
+ struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
php_userstream_data_t *us;
zval *zfilename, *zmode, *zopened, *zoptions, *zretval = NULL, *zfuncname;
zval **args[4];
uwrap = (struct php_user_stream_wrapper *)ecalloc(1, sizeof(*uwrap));
uwrap->protoname = estrndup(protocol, protocol_len);
uwrap->classname = estrndup(classname, classname_len);
- uwrap->wrapper.create = user_wrapper_factory;
- uwrap->wrapper.wrappercontext = uwrap;
+ uwrap->wrapper.wops = &user_stream_wops;
+ uwrap->wrapper.abstract = uwrap;
zend_str_tolower(uwrap->classname, classname_len);
rsrc_id = ZEND_REGISTER_RESOURCE(NULL, uwrap, le_protocols);
if (zend_hash_find(EG(class_table), uwrap->classname, classname_len + 1, (void**)&uwrap->ce) == SUCCESS) {
-#ifdef ZEND_ENGINE_2
+#if ZEND_ENGINE_2
uwrap->ce = *(zend_class_entry**)uwrap->ce;
#endif
if (php_register_url_stream_wrapper(protocol, &uwrap->wrapper TSRMLS_CC) == SUCCESS) {