The supplied patch enhances PHP's .INI from ... php-%sapi-name%.ini
to ... php%php-version%-%sapi-module-name%.ini php%php-major-version%.%php-minor-version%.%php-release-version%-%sapi-module-name%.ini php%php-major-version%.%php-minor-version%-%sapi-module-name%.ini php%php-major-version%-%sapi-module-name%.ini with the original as a fallback. e.g. from php-isapi.ini to php5.2.0-dev-isapi.ini php5.1.4-isapi.ini php5.0-isapi.ini php5-isapi.ini php-isapi.ini (Just examples - all combinations are valid). With the INI files, the most specific one is looked for first and each check gets less specific until a file is found. The supplied patches also do the same work with the Windows Registry. Currently the registry key examined is ... SOFTWARE\\PHP This is extended to ... SOFTWARE\\PHP\\V5\\Per Directory Values SOFTWARE\\PHP\\V5.1\\Per Directory Values SOFTWARE\\PHP\\V5.1.4\\Per Directory Values SOFTWARE\\PHP\\V5.2.0-dev\\Per Directory Values The more specific settings will override the less specific settings. And the supplied patches allow for the location of the ini file on a per PHP version basis... SOFTWARE\\PHP\\V5\\IniFilePath SOFTWARE\\PHP\\V5.1\\IniFilePath SOFTWARE\\PHP\\V5.1.4\\IniFilePath SOFTWARE\\PHP\\V5.2.0-dev\\IniFilePath The more specific paths will be examined before the less specific paths. NOTE: I am NOT able to verify this code as I am not yet able to compile PHP. I'm still learning this, so please accept my apologies for any syntax errors, bugs. I'm more than willing to fix them! And if anyone has used MS VC++ Express Edition to build PHP, I'd be REALLY grateful to have any notes/comments about the process. Thanks, Richard Quadling. -- ----- Richard Quadling Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
Index: main/php_ini.c =================================================================== RCS file: /repository/php-src/main/php_ini.c,v retrieving revision 1.143 diff -u -r1.143 php_ini.c --- main/php_ini.c 4 Jul 2006 06:38:32 -0000 1.143 +++ main/php_ini.c 18 Jul 2006 08:36:34 -0000 @@ -293,6 +293,7 @@ static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 }; #ifdef PHP_WIN32 char *reg_location; + int version_specific; #endif env_location = getenv("PHPRC"); @@ -318,14 +319,17 @@ #ifdef PHP_WIN32 /* Add registry location */ - reg_location = GetIniPathFromRegistry(); - if (reg_location != NULL) { - if (*php_ini_search_path) { - strcat(php_ini_search_path, paths_separator); + /* RAQ : Add version specific registry location */ + for (version_specific = MAX_VERSION_SPECIFIC ; version_specific >= NOT_VERSION_SPECIFIC ; --version_specific) + { + reg_location = GetIniPathFromRegistry(version_specific); + if (reg_location != NULL) { + if (*php_ini_search_path) { + strcat(php_ini_search_path, paths_separator); + } + strcat(php_ini_search_path, reg_location); + efree(reg_location); } - strcat(php_ini_search_path, reg_location); - efree(reg_location); - } #endif /* Add cwd (only with CLI) */ @@ -428,6 +432,50 @@ } } } + /* RAQ : Search php%php-version%-%sapi-module-name%.ini file in search path */ + if (!fh.handle.fp) { + const char *fmt = "php%s-%s.ini"; + char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + strlen(PHP_VERSION)); + sprintf(ini_fname, fmt, PHP_VERSION, sapi_module.name); + fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC); + efree(ini_fname); + if (fh.handle.fp) { + fh.filename = php_ini_opened_path; + } + } + /* RAQ : Search php%php-major-version%.%php-minor-version%.%php-release-version%-%sapi-module-name%.ini file in search path */ + if (!fh.handle.fp) { + const char *fmt = "php%d.%d.%d-%s.ini"; + char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 6); + sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, sapi_module.name); + fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC); + efree(ini_fname); + if (fh.handle.fp) { + fh.filename = php_ini_opened_path; + } + } + /* RAQ : Search php%php-major-version%.%php-minor-version%-%sapi-module-name%.ini file in search path */ + if (!fh.handle.fp) { + const char *fmt = "php%d.%d-%s.ini"; + char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 4); + sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, PHP_MINOR_VERSION, sapi_module.name); + fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC); + efree(ini_fname); + if (fh.handle.fp) { + fh.filename = php_ini_opened_path; + } + } + /* RAQ : Search php%php-major-version%-%sapi-module-name%.ini file in search path */ + if (!fh.handle.fp) { + const char *fmt = "php%d-%s.ini"; + char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 2); + sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, sapi_module.name); + fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC); + efree(ini_fname); + if (fh.handle.fp) { + fh.filename = php_ini_opened_path; + } + } /* Search php-%sapi-module-name%.ini file in search path */ if (!fh.handle.fp) { const char *fmt = "php-%s.ini"; Index: win32/php_registry.h =================================================================== RCS file: /repository/php-src/win32/php_registry.h,v retrieving revision 1.4 diff -u -r1.4 php_registry.h --- win32/php_registry.h 19 Oct 2003 10:22:21 -0000 1.4 +++ win32/php_registry.h 18 Jul 2006 08:36:34 -0000 @@ -1,8 +1,17 @@ #ifndef PHP_REGISTRY_H #define PHP_REGISTRY_H +/* RAQ : Constants to assist in version specificness. */ +#define NOT_VERSION_SPECIFIC 0 +#define MAJOR_VERSION_SPECIFIC 1 +#define MINOR_VERSION_SPECIFIC 2 +#define RELEASE_VERSION_SPECIFIC 3 +#define EXTRA_VERSION_SPECIFIC 4 +/* Maximum version specificness for for() loops. */ +#define MAX_VERSION_SPECIFIC 4 void UpdateIniFromRegistry(char *path TSRMLS_DC); -char *GetIniPathFromRegistry(); +/* RAQ : Allow for version specificness */ +char *GetIniPathFromRegistry(int version_specific); #endif /* PHP_REGISTRY_H */ Index: win32/registry.c =================================================================== RCS file: /repository/php-src/win32/registry.c,v retrieving revision 1.16 diff -u -r1.16 registry.c --- win32/registry.c 14 Mar 2005 12:42:05 -0000 1.16 +++ win32/registry.c 18 Jul 2006 08:36:34 -0000 @@ -3,15 +3,66 @@ #define PHP_REGISTRY_KEY "SOFTWARE\\PHP" +#include "php_registry.h" + void UpdateIniFromRegistry(char *path TSRMLS_DC) { char *p, *orig_path; HKEY MainKey; char *strtok_buf = NULL; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY "\\Per Directory Values", 0, KEY_READ, &MainKey)!=ERROR_SUCCESS) { - return; - } + /* RAQ : Version specificness */ + int version_specific; + char * reg_key; + + /* RAQ : Get default and then version specific entries. */ + /** + version_specific has the following meanings + 0 = No additional subkeys - SOFTWARE\\PHP\\Per Directory Values + 1 = PHP_MAJOR_VERSION added - SOFTWARE\\PHP\\V99\\Per Directory Values + 2 = PHP_MINOR_VERSION added - SOFTWARE\\PHP\\V99.99\\Per Directory Values + 3 = PHP_RELEASE_VERSION added - SOFTWARE\\PHPV99.99.99\\Per Directory Values + 4 = PHP_EXTRA_VERSION added - SOFTWARE\\PHP\\V99.99.99-dev\\Per Directory Values - Actually uses the full PHP_VERSION. + **/ + for (version_specific = NOT_VERSION_SPECIFIC ; version_specific <= MAX_VERSION_SPECIFIC ; ++version_specific) + { + /* RAQ : Build key which may include version specificness */ + switch(version_specific) + { + case MAJOR_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99\\Per Directory Values")); + sprintf(reg_key, "%s\\V%d\\Per Directory Values", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION); + break; + case MINOR_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99\\Per Directory Values")); + sprintf(reg_key, "%s\\V%d.%d\\Per Directory Values", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION, PHP_MINOR_VERSION); + break; + case RELEASE_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99.99\\Per Directory Values")); + sprintf(reg_key, "%s\\V%d.%d.%d\\Per Directory Values", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION); + break; + case EXTRA_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V\\Per Directory Values") + strlen(PHP_VERSION)); + sprintf(reg_key, "%s\\V%s\\Per Directory Values", + PHP_REGISTRY_KEY, + PHP_VERSION); + break; + default : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\Per Directory Values")); + sprintf(reg_key, "%s\\Per Directory Values", PHP_REGISTRY_KEY); + break; + } + /* RAQ END : Continue with appropriate key. */ + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_READ, &MainKey)!=ERROR_SUCCESS) { + return; + } orig_path = path = estrdup(path); @@ -55,7 +106,7 @@ HKEY hKey; DWORD lType; DWORD values = 0, max_name = 0, max_value = 0, i = 0; - + if (p>path) { *(p-1) = '\\'; /* restore the slash */ } @@ -91,16 +142,53 @@ } RegCloseKey(MainKey); efree(orig_path); + } /* RAQ : End of version specificness loop */ } #define PHPRC_REGISTRY_NAME "IniFilePath" -char *GetIniPathFromRegistry() +char *GetIniPathFromRegistry(int version_specific) { char *reg_location = NULL; HKEY hKey; - - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + char *reg_key = NULL; + + // RAQ : Determine which key to use - may include version specificiness. + switch(version_specific) + { + case MAJOR_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99")); + sprintf(reg_key, "%s\\V%d", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION); + break; + case MINOR_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99")); + sprintf(reg_key, "%s\\V%d.%d", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION, PHP_MINOR_VERSION); + break; + case RELEASE_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99.99")); + sprintf(reg_key, "%s\\V%d.%d.%d", + PHP_REGISTRY_KEY, + PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION); + break; + case EXTRA_VERSION_SPECIFIC : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V") + strlen(PHP_VERSION)); + sprintf(reg_key, "%s\\V%s", + PHP_REGISTRY_KEY, + PHP_VERSION); + break; + default : + reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY)); + sprintf(reg_key, "%s", PHP_REGISTRY_KEY); + break; + } + /* RAQ END : Continue with appropriate key. */ + + /* RAQ : Use potentially version specific registry key : if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {*/ + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { DWORD buflen = MAXPATHLEN; reg_location = emalloc(MAXPATHLEN+1); if(RegQueryValueEx(hKey, PHPRC_REGISTRY_NAME, 0, NULL, reg_location, &buflen) != ERROR_SUCCESS) {
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php