Annotation of embedaddon/php/Zend/zend_extensions.c, revision 1.1.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>