diff options
Diffstat (limited to 'Zend/zend_extensions.c')
-rw-r--r-- | Zend/zend_extensions.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c new file mode 100644 index 0000000000..fe63768dba --- /dev/null +++ b/Zend/zend_extensions.c @@ -0,0 +1,123 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | + +----------------------------------------------------------------------+ + | This source file is subject to the Zend license, that is bundled | + | with this package in the file LICENSE. If you did not receive a | + | copy of the Zend license, please mail us at zend@zend.com so we can | + | send you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Andi Gutmans <andi@zend.com> | + | Zeev Suraski <zeev@zend.com> | + +----------------------------------------------------------------------+ +*/ + +#include "zend_extensions.h" + +ZEND_API zend_llist zend_extensions; +static int last_resource_number; + +int zend_load_extensions(char **extension_paths) +{ + char **p = extension_paths; + + if (!p) { + return SUCCESS; + } + while (*p) { + if (zend_load_extension(*p)==FAILURE) { + return FAILURE; + } + p++; + } + return SUCCESS; +} + + +int zend_load_extension(char *path) +{ +#if ZEND_EXTENSIONS_SUPPORT + DL_HANDLE handle; + zend_extension extension, *new_extension; + zend_extension_version_info *extension_version_info; + + handle = DL_LOAD(path); + if (!handle) { + zend_printf("Failed loading %s\n", path); + return FAILURE; + } + + extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info"); + new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "zend_extension_entry"); + if (!extension_version_info || !new_extension) { + zend_printf("%s doesn't appear to be a valid Zend extension\n", path); + return FAILURE; + } + + if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) { + zend_printf("%s requires Zend version %s or later\n" + "Current version %s, API version %d\n", + new_extension->name, + extension_version_info->required_zend_version, + ZEND_VERSION, + ZEND_EXTENSION_API_NO); + return FAILURE; + } else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) { + /* we may be able to allow for downwards compatability in some harmless cases. */ + zend_printf("%s is outdated (API version %d, current version %d)\n" + "Contact %s at %s for a later version of this module.\n", + new_extension->name, + extension_version_info->zend_extension_api_no, + ZEND_EXTENSION_API_NO, + new_extension->author, + new_extension->URL); + return FAILURE; + } else if (ZTS_V!=extension_version_info->thread_safe) { + zend_printf("Cannot load %s - it %s thread safe, whereas Zend %s\n", + new_extension->name, + (extension_version_info->thread_safe?"is":"isn't"), + (ZTS_V?"is":"isn't")); + return FAILURE; + } + + if (new_extension->startup) { + new_extension->startup(new_extension); + } + extension = *new_extension; + extension.handle = handle; + + zend_llist_add_element(&zend_extensions, &extension); + + /*zend_printf("Loaded %s, version %s\n", extension.name, extension.version);*/ + + zend_append_version_info(&extension); + return SUCCESS; +#else + zend_printf("Extensions are not supported on this platform.\n"); + return FAILURE +#endif +} + + +void zend_extension_dtor(zend_extension *extension) +{ +#if ZEND_EXTENSIONS_SUPPORT + if (extension->shutdown) { + extension->shutdown(extension); + } + DL_UNLOAD(extension->handle); +#endif +} + + +ZEND_API int zend_get_resource_handle(zend_extension *extension) +{ + if (last_resource_number<4) { + extension->resource_number = last_resource_number; + return last_resource_number; + } else { + return -1; + } +} |