Annotation of embedaddon/php/Zend/zend_extensions.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | Zend Engine                                                          |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 2.00 of the Zend license,     |
        !             8:    | that is bundled with this package in the file LICENSE, and is        | 
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.zend.com/license/2_00.txt.                                |
        !            11:    | If you did not receive a copy of the Zend license and are unable to  |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@zend.com so we can mail you a copy immediately.              |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Andi Gutmans <andi@zend.com>                                |
        !            16:    |          Zeev Suraski <zeev@zend.com>                                |
        !            17:    +----------------------------------------------------------------------+
        !            18: */
        !            19: 
        !            20: /* $Id: zend_extensions.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #include "zend_extensions.h"
        !            23: 
        !            24: ZEND_API zend_llist zend_extensions;
        !            25: static int last_resource_number;
        !            26: 
        !            27: int zend_load_extension(const char *path)
        !            28: {
        !            29: #if ZEND_EXTENSIONS_SUPPORT
        !            30:        DL_HANDLE handle;
        !            31:        zend_extension *new_extension;
        !            32:        zend_extension_version_info *extension_version_info;
        !            33: 
        !            34:        handle = DL_LOAD(path);
        !            35:        if (!handle) {
        !            36: #ifndef ZEND_WIN32
        !            37:                fprintf(stderr, "Failed loading %s:  %s\n", path, DL_ERROR());
        !            38: /* See http://support.microsoft.com/kb/190351 */
        !            39: #ifdef PHP_WIN32
        !            40:                fflush(stderr);
        !            41: #endif
        !            42: #else
        !            43:                fprintf(stderr, "Failed loading %s\n", path);
        !            44: #endif
        !            45:                return FAILURE;
        !            46:        }
        !            47: 
        !            48:        extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info");
        !            49:        if (!extension_version_info) {
        !            50:                extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "_extension_version_info");
        !            51:        }
        !            52:        new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "zend_extension_entry");
        !            53:        if (!new_extension) {
        !            54:                new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "_zend_extension_entry");
        !            55:        }
        !            56:        if (!extension_version_info || !new_extension) {
        !            57:                fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path);
        !            58: /* See http://support.microsoft.com/kb/190351 */
        !            59: #ifdef PHP_WIN32
        !            60:                fflush(stderr);
        !            61: #endif
        !            62:                DL_UNLOAD(handle);
        !            63:                return FAILURE;
        !            64:        }
        !            65: 
        !            66: 
        !            67:        /* allow extension to proclaim compatibility with any Zend version */
        !            68:        if (extension_version_info->zend_extension_api_no != ZEND_EXTENSION_API_NO &&(!new_extension->api_no_check || new_extension->api_no_check(ZEND_EXTENSION_API_NO) != SUCCESS)) {
        !            69:                if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) {
        !            70:                        fprintf(stderr, "%s requires Zend Engine API version %d.\n"
        !            71:                                        "The Zend Engine API version %d which is installed, is outdated.\n\n",
        !            72:                                        new_extension->name,
        !            73:                                        extension_version_info->zend_extension_api_no,
        !            74:                                        ZEND_EXTENSION_API_NO);
        !            75: /* See http://support.microsoft.com/kb/190351 */
        !            76: #ifdef PHP_WIN32
        !            77:                        fflush(stderr);
        !            78: #endif
        !            79:                        DL_UNLOAD(handle);
        !            80:                        return FAILURE;
        !            81:                } else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) {
        !            82:                        fprintf(stderr, "%s requires Zend Engine API version %d.\n"
        !            83:                                        "The Zend Engine API version %d which is installed, is newer.\n"
        !            84:                                        "Contact %s at %s for a later version of %s.\n\n",
        !            85:                                        new_extension->name,
        !            86:                                        extension_version_info->zend_extension_api_no,
        !            87:                                        ZEND_EXTENSION_API_NO,
        !            88:                                        new_extension->author,
        !            89:                                        new_extension->URL,
        !            90:                                        new_extension->name);
        !            91: /* See http://support.microsoft.com/kb/190351 */
        !            92: #ifdef PHP_WIN32
        !            93:                        fflush(stderr);
        !            94: #endif
        !            95:                        DL_UNLOAD(handle);
        !            96:                        return FAILURE;
        !            97:                }
        !            98:        } else if (strcmp(ZEND_EXTENSION_BUILD_ID, extension_version_info->build_id) &&
        !            99:                   (!new_extension->build_id_check || new_extension->build_id_check(ZEND_EXTENSION_BUILD_ID) != SUCCESS)) {
        !           100:                fprintf(stderr, "Cannot load %s - it was built with configuration %s, whereas running engine is %s\n",
        !           101:                                        new_extension->name, extension_version_info->build_id, ZEND_EXTENSION_BUILD_ID);
        !           102: /* See http://support.microsoft.com/kb/190351 */
        !           103: #ifdef PHP_WIN32
        !           104:                fflush(stderr);
        !           105: #endif
        !           106:                DL_UNLOAD(handle);
        !           107:                return FAILURE;
        !           108:        }
        !           109: 
        !           110:        return zend_register_extension(new_extension, handle);
        !           111: #else
        !           112:        fprintf(stderr, "Extensions are not supported on this platform.\n");
        !           113: /* See http://support.microsoft.com/kb/190351 */
        !           114: #ifdef PHP_WIN32
        !           115:        fflush(stderr);
        !           116: #endif
        !           117:        return FAILURE;
        !           118: #endif
        !           119: }
        !           120: 
        !           121: 
        !           122: int zend_register_extension(zend_extension *new_extension, DL_HANDLE handle)
        !           123: {
        !           124: #if ZEND_EXTENSIONS_SUPPORT
        !           125:        zend_extension extension;
        !           126: 
        !           127:        extension = *new_extension;
        !           128:        extension.handle = handle;
        !           129: 
        !           130:        zend_extension_dispatch_message(ZEND_EXTMSG_NEW_EXTENSION, &extension);
        !           131: 
        !           132:        zend_llist_add_element(&zend_extensions, &extension);
        !           133: 
        !           134:        /*fprintf(stderr, "Loaded %s, version %s\n", extension.name, extension.version);*/
        !           135: #endif
        !           136: 
        !           137:        return SUCCESS;
        !           138: }
        !           139: 
        !           140: 
        !           141: static void zend_extension_shutdown(zend_extension *extension TSRMLS_DC)
        !           142: {
        !           143: #if ZEND_EXTENSIONS_SUPPORT
        !           144:        if (extension->shutdown) {
        !           145:                extension->shutdown(extension);
        !           146:        }
        !           147: #endif
        !           148: }
        !           149: 
        !           150: static int zend_extension_startup(zend_extension *extension)
        !           151: {
        !           152: #if ZEND_EXTENSIONS_SUPPORT
        !           153:        if (extension->startup) {
        !           154:                if (extension->startup(extension)!=SUCCESS) {
        !           155:                        return 1;
        !           156:                }
        !           157:                zend_append_version_info(extension);
        !           158:        }
        !           159: #endif
        !           160:        return 0;
        !           161: }
        !           162: 
        !           163: 
        !           164: int zend_startup_extensions_mechanism()
        !           165: {
        !           166:        /* Startup extensions mechanism */
        !           167:        zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1);
        !           168:        last_resource_number = 0;
        !           169:        return SUCCESS;
        !           170: }
        !           171: 
        !           172: 
        !           173: int zend_startup_extensions()
        !           174: {
        !           175:        zend_llist_apply_with_del(&zend_extensions, (int (*)(void *)) zend_extension_startup);
        !           176:        return SUCCESS;
        !           177: }
        !           178: 
        !           179: 
        !           180: void zend_shutdown_extensions(TSRMLS_D)
        !           181: {
        !           182:        zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_shutdown TSRMLS_CC);
        !           183:        zend_llist_destroy(&zend_extensions);
        !           184: }
        !           185: 
        !           186: 
        !           187: void zend_extension_dtor(zend_extension *extension)
        !           188: {
        !           189: #if ZEND_EXTENSIONS_SUPPORT && !ZEND_DEBUG
        !           190:        if (extension->handle) {
        !           191:                DL_UNLOAD(extension->handle);
        !           192:        }
        !           193: #endif
        !           194: }
        !           195: 
        !           196: 
        !           197: static void zend_extension_message_dispatcher(const zend_extension *extension, int num_args, va_list args TSRMLS_DC)
        !           198: {
        !           199:        int message;
        !           200:        void *arg;
        !           201: 
        !           202:        if (!extension->message_handler || num_args!=2) {
        !           203:                return;
        !           204:        }
        !           205:        message = va_arg(args, int);
        !           206:        arg = va_arg(args, void *);
        !           207:        extension->message_handler(message, arg);
        !           208: }
        !           209: 
        !           210: 
        !           211: ZEND_API void zend_extension_dispatch_message(int message, void *arg)
        !           212: {
        !           213:        TSRMLS_FETCH();
        !           214: 
        !           215:        zend_llist_apply_with_arguments(&zend_extensions, (llist_apply_with_args_func_t) zend_extension_message_dispatcher TSRMLS_CC, 2, message, arg);
        !           216: }
        !           217: 
        !           218: 
        !           219: ZEND_API int zend_get_resource_handle(zend_extension *extension)
        !           220: {
        !           221:        if (last_resource_number<ZEND_MAX_RESERVED_RESOURCES) {
        !           222:                extension->resource_number = last_resource_number;
        !           223:                return last_resource_number++;
        !           224:        } else {
        !           225:                return -1;
        !           226:        }
        !           227: }
        !           228: 
        !           229: 
        !           230: ZEND_API zend_extension *zend_get_extension(const char *extension_name)
        !           231: {
        !           232:        zend_llist_element *element;
        !           233: 
        !           234:        for (element = zend_extensions.head; element; element = element->next) {
        !           235:                zend_extension *extension = (zend_extension *) element->data;
        !           236: 
        !           237:                if (!strcmp(extension->name, extension_name)) {
        !           238:                        return extension;
        !           239:                }
        !           240:        }
        !           241:        return NULL;
        !           242: }
        !           243: 
        !           244: /*
        !           245:  * Local variables:
        !           246:  * tab-width: 4
        !           247:  * c-basic-offset: 4
        !           248:  * indent-tabs-mode: t
        !           249:  * End:
        !           250:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>