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

Reply via email to