Re: zend module patch

From: Date: Wed, 10 Oct 2001 00:29:49 +0000
Subject: Re: zend module patch
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-67652@lists.php.net to get a copy of this message
Stig Sæther Bakken wrote: > > Hi, > > A while ago, we discussed being able to give more intelligent error > messages when loading extensions compiled with different > configurations/API versions. > > Attached is a patch that changes the zend_module_entry type so the > configuration appears first. This way PHP can give more sensible > error messages like "I need thread-safe extensions" or "sorry, this > extension was built in debug mode". > > The patch also adds a "version" field to the struct, along with a > zend_get_module_version Zend API function and an optional parameter to > phpversion() for getting the version of a loaded extension. > > The downside is that moving zend_module_entry's configuration fields > first can't be done in a backwards-compatible way. This patch breaks > every extension out there (except ext/standard, which is updated), but > it does buy us better BC possibilities in the future. > > Comments, opinions? > > - Stig Now where did that attachment go? Sigh, here it is inlined: Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php4/ext/standard/basic_functions.c,v retrieving revision 1.404 diff -u -b -B -r1.404 basic_functions.c --- ext/standard/basic_functions.c 5 Oct 2001 23:56:19 -0000 1.404 +++ ext/standard/basic_functions.c 10 Oct 2001 00:02:08 -0000 @@ -830,6 +830,7 @@ zend_module_entry basic_functions_module = { + STANDARD_MODULE_HEADER, "standard", /* extension name */ basic_functions, /* function list */ PHP_MINIT(basic), /* process startup */ @@ -837,6 +838,7 @@ PHP_RINIT(basic), /* request startup */ PHP_RSHUTDOWN(basic), /* request shutdown */ PHP_MINFO(basic), /* extension info */ + PHP_VERSION, /* extension version */ STANDARD_MODULE_PROPERTIES }; Index: ext/standard/info.c =================================================================== RCS file: /repository/php4/ext/standard/info.c,v retrieving revision 1.158 diff -u -b -B -r1.158 info.c --- ext/standard/info.c 6 Oct 2001 20:13:37 -0000 1.158 +++ ext/standard/info.c 10 Oct 2001 00:02:09 -0000 @@ -473,15 +473,26 @@ /* }}} */ -/* {{{ proto string phpversion(void) +/* {{{ proto string phpversion([string extension]) Return the current PHP version */ PHP_FUNCTION(phpversion) { - if (ZEND_NUM_ARGS() != 0) { - WRONG_PARAM_COUNT; - } + zval **arg; + int argc = ZEND_NUM_ARGS(); + if (argc == 0) { RETURN_STRING(PHP_VERSION, 1); + } else if (argc == 1 && zend_get_parameters_ex(1, &arg) == SUCCESS) { + char *version; + convert_to_string_ex(arg); + version = zend_get_module_version(Z_STRVAL_PP(arg)); + if (version == NULL) { + RETURN_FALSE; + } + RETURN_STRING(version, 1); + } else { + WRONG_PARAM_COUNT; + } } /* }}} */ Index: Zend/zend_API.c =================================================================== RCS file: /repository/Zend/zend_API.c,v retrieving revision 1.100 diff -u -b -B -r1.100 zend_API.c --- Zend/zend_API.c 2001/08/24 03:18:44 1.100 +++ Zend/zend_API.c 2001/10/10 00:02:15 @@ -1385,3 +1385,14 @@ return retval; } + +ZEND_API char *zend_get_module_version(char *module_name) +{ + zend_module_entry *module; + + if (zend_hash_find(&module_registry, module_name, strlen(module_name) + 1, + (void**)&module) == FAILURE) { + return NULL; + } + return module->version; +} Index: Zend/zend_API.h =================================================================== RCS file: /repository/Zend/zend_API.h,v retrieving revision 1.107 diff -u -b -B -r1.107 zend_API.h --- Zend/zend_API.h 2001/08/12 14:50:14 1.107 +++ Zend/zend_API.h 2001/10/10 00:02:16 @@ -137,6 +137,7 @@ ZEND_API void zend_wrong_param_count(TSRMLS_D); ZEND_API zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callable_name); +ZEND_API char *zend_get_module_version(char *module_name); #define getThis() (this_ptr) Index: Zend/zend_modules.h =================================================================== RCS file: /repository/Zend/zend_modules.h,v retrieving revision 1.40 diff -u -b -B -r1.40 zend_modules.h --- Zend/zend_modules.h 2001/09/01 12:57:50 1.40 +++ Zend/zend_modules.h 2001/10/10 00:02:16 @@ -43,8 +43,10 @@ #define USING_ZTS 0 #endif -#define STANDARD_MODULE_PROPERTIES_EX 0, 0, 0, NULL, 0, ZEND_DEBUG, USING_ZTS, ZEND_MODULE_API_NO +#define STANDARD_MODULE_HEADER ZEND_MODULE_API_NO, ZEND_DEBUG, USING_ZTS +#define STANDARD_MODULE_PROPERTIES_EX 0, 0, 0, NULL, 0 + #define STANDARD_MODULE_PROPERTIES \ NULL, NULL, STANDARD_MODULE_PROPERTIES_EX @@ -54,6 +56,9 @@ typedef struct _zend_module_entry zend_module_entry; struct _zend_module_entry { + unsigned int zend_api; + unsigned char zend_debug; + unsigned char zts; char *name; zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); @@ -61,6 +66,7 @@ int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); + char *version; int (*global_startup_func)(void); int (*global_shutdown_func)(void); int globals_id; @@ -68,9 +74,6 @@ unsigned char type; void *handle; int module_number; - unsigned char zend_debug; - unsigned char zts; - unsigned int zend_api; };

« previous php.dev (#67652) next »