Edit report at http://bugs.php.net/bug.php?id=38162&edit=1
ID: 38162 Updated by: rquadl...@php.net Reported by: RQuadling at GMail dot com Summary: Cannot specify different config files by PHP version -Status: Open +Status: Closed Type: Feature/Change Request -Package: Feature/Change Request +Package: *General Issues Operating System: Windows XP SP2 PHP Version: 5CVS-2006-07-20 (snap) -Assigned To: +Assigned To: rquadling New Comment: PHP now supports full version and SAPI specific configuration files. Previous Comments: ------------------------------------------------------------------------ [2006-07-26 11:52:07] RQuadling at GMail dot com Stupid bloody site! Lost the file. http://rquadling.php1h.com/ini_patch.diff.txt ------------------------------------------------------------------------ [2006-07-22 22:28:20] RQuadling at GMail dot com http://rquadling.phpnet.us/enhance_ini_and_registry__diff.txt ------------------------------------------------------------------------ [2006-07-20 14:55:20] tony2...@php.net Please upload the patch somewhere and put the link here. ------------------------------------------------------------------------ [2006-07-20 14:24:32] RQuadling at GMail dot com Description: ------------ PHP doesn't allow for version specific config files (or registry settings). The following patch will allow this. 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) { Expected result: ---------------- PHP to support version specific configuration files and registry settings. Actual result: -------------- "One size fits all". No ability to distinguish between 1 version and the next. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=38162&edit=1