diff options
Diffstat (limited to 'ext/fileinfo/fileinfo.c')
-rw-r--r-- | ext/fileinfo/fileinfo.c | 91 |
1 files changed, 21 insertions, 70 deletions
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index cfb933bdb8..5609b26015 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -51,22 +51,12 @@ typedef struct _finfo_object { zend_object zo; } finfo_object; -#define FILEINFO_DECLARE_INIT_OBJECT(object) \ - zval *object = getThis(); - static inline finfo_object *php_finfo_fetch_object(zend_object *obj) { return (finfo_object *)((char*)(obj) - XtOffsetOf(finfo_object, zo)); } #define Z_FINFO_P(zv) php_finfo_fetch_object(Z_OBJ_P((zv))) -#define FILEINFO_REGISTER_OBJECT(_object, _ptr) \ -{ \ - finfo_object *obj; \ - obj = Z_FINFO_P(_object); \ - obj->ptr = _ptr; \ -} - #define FILEINFO_FROM_OBJECT(finfo, object) \ { \ finfo_object *obj = Z_FINFO_P(object); \ @@ -112,28 +102,12 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type) options, magic_errno(magic), magic_error(magic)); \ RETURN_FALSE; \ } - -/* True global resources - no need for thread safety here */ -static int le_fileinfo; -/* }}} */ - -void finfo_resource_destructor(zend_resource *rsrc) /* {{{ */ -{ - if (rsrc->ptr) { - php_fileinfo *finfo = (php_fileinfo *) rsrc->ptr; - magic_close(finfo->magic); - efree(rsrc->ptr); - rsrc->ptr = NULL; - } -} /* }}} */ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(finfo) { - zend_class_entry _finfo_class_entry; - INIT_CLASS_ENTRY(_finfo_class_entry, "finfo", class_finfo_methods); - finfo_class_entry = zend_register_internal_class(&_finfo_class_entry); + finfo_class_entry = register_class_finfo(); finfo_class_entry->create_object = finfo_objects_new; finfo_class_entry->serialize = zend_class_serialize_deny; finfo_class_entry->unserialize = zend_class_unserialize_deny; @@ -144,8 +118,6 @@ PHP_MINIT_FUNCTION(finfo) finfo_object_handlers.free_obj = finfo_objects_free; finfo_object_handlers.clone_obj = NULL; - le_fileinfo = zend_register_list_destructors_ex(finfo_resource_destructor, NULL, "file_info", module_number); - REGISTER_LONG_CONSTANT("FILEINFO_NONE", MAGIC_NONE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK", MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILEINFO_MIME", MAGIC_MIME, CONST_CS|CONST_PERSISTENT); @@ -204,14 +176,14 @@ PHP_MINFO_FUNCTION(fileinfo) } /* }}} */ -/* {{{ Create a new fileinfo resource. */ +/* {{{ Construct a new fileinfo object. */ PHP_FUNCTION(finfo_open) { zend_long options = MAGIC_NONE; char *file = NULL; size_t file_len = 0; php_fileinfo *finfo; - FILEINFO_DECLARE_INIT_OBJECT(object) + zval *object = getThis(); char resolved_path[MAXPATHLEN]; zend_error_handling zeh; @@ -287,30 +259,28 @@ PHP_FUNCTION(finfo_open) } if (object) { + finfo_object *obj; zend_restore_error_handling(&zeh); - FILEINFO_REGISTER_OBJECT(object, finfo); + obj = Z_FINFO_P(object); + obj->ptr = finfo; } else { - RETURN_RES(zend_register_resource(finfo, le_fileinfo)); + zend_object *zobj = finfo_objects_new(finfo_class_entry); + finfo_object *obj = php_finfo_fetch_object(zobj); + obj->ptr = finfo; + RETURN_OBJ(zobj); } } /* }}} */ -/* {{{ Close fileinfo resource. */ +/* {{{ Close fileinfo object - a NOP. */ PHP_FUNCTION(finfo_close) { - php_fileinfo *finfo; - zval *zfinfo; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zfinfo) == FAILURE) { - RETURN_THROWS(); - } + zval *self; - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &self, finfo_class_entry) == FAILURE) { RETURN_THROWS(); } - zend_list_close(Z_RES_P(zfinfo)); - RETURN_TRUE; } /* }}} */ @@ -320,22 +290,12 @@ PHP_FUNCTION(finfo_set_flags) { zend_long options; php_fileinfo *finfo; - zval *zfinfo; - FILEINFO_DECLARE_INIT_OBJECT(object) + zval *self; - if (object) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &options) == FAILURE) { - RETURN_THROWS(); - } - FILEINFO_FROM_OBJECT(finfo, object); - } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &zfinfo, &options) == FAILURE) { - RETURN_THROWS(); - } - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { - RETURN_THROWS(); - } + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &self, finfo_class_entry, &options) == FAILURE) { + RETURN_THROWS(); } + FILEINFO_FROM_OBJECT(finfo, self); FINFO_SET_OPTION(finfo->magic, options) finfo->options = options; @@ -354,12 +314,10 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime char *ret_val = NULL, *buffer = NULL; size_t buffer_len; php_fileinfo *finfo = NULL; - zval *zfinfo, *zcontext = NULL; + zval *zcontext = NULL; zval *what; char mime_directory[] = "directory"; - struct magic_set *magic = NULL; - FILEINFO_DECLARE_INIT_OBJECT(object) if (mimetype_emu) { @@ -389,19 +347,12 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime php_error_docref(NULL, E_WARNING, "Failed to load magic database"); goto common; } - } else if (object) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lr!", &buffer, &buffer_len, &options, &zcontext) == FAILURE) { - RETURN_THROWS(); - } - FILEINFO_FROM_OBJECT(finfo, object); - magic = finfo->magic; } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|lr!", &zfinfo, &buffer, &buffer_len, &options, &zcontext) == FAILURE) { - RETURN_THROWS(); - } - if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) { + zval *self; + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os|lr!", &self, finfo_class_entry, &buffer, &buffer_len, &options, &zcontext) == FAILURE) { RETURN_THROWS(); } + FILEINFO_FROM_OBJECT(finfo, self); magic = finfo->magic; } |