php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #38162 Cannot specify different config files by PHP version
Submitted: 2006-07-20 14:24 UTC Modified: 2010-04-12 18:21 UTC
From: RQuadling at GMail dot com Assigned: rquadling (profile)
Status: Closed Package: *General Issues
PHP Version: 5CVS-2006-07-20 (snap) OS: Windows XP SP2
Private report: No CVE-ID: None
 [2006-07-20 14:24 UTC] 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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-07-20 14:55 UTC] tony2001@php.net
Please upload the patch somewhere and put the link here.
 [2006-07-22 22:28 UTC] RQuadling at GMail dot com
http://rquadling.phpnet.us/enhance_ini_and_registry__diff.txt
 [2006-07-26 11:52 UTC] RQuadling at GMail dot com
Stupid bloody site! Lost the file.

http://rquadling.php1h.com/ini_patch.diff.txt
 [2010-04-12 18:21 UTC] rquadling@php.net
-Status: Open +Status: Closed -Package: Feature/Change Request +Package: *General Issues -Assigned To: +Assigned To: rquadling
 [2010-04-12 18:21 UTC] rquadling@php.net
PHP now supports full version and SAPI specific configuration files.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri May 17 04:01:34 2024 UTC