]> granicus.if.org Git - php/commitdiff
Added version specific registry keys to allow different configurations for different...
authorDmitry Stogov <dmitry@php.net>
Thu, 3 Aug 2006 13:54:20 +0000 (13:54 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 3 Aug 2006 13:54:20 +0000 (13:54 +0000)
win32/registry.c

index 95d142cfa8b5edd251e56c7fb6063d8f25d05e04..2e7a074091b8a02e0eea7700e027888d16af1448 100644 (file)
@@ -1,7 +1,60 @@
 #include "php.h"
 #include "php_ini.h"
 
-#define PHP_REGISTRY_KEY "SOFTWARE\\PHP"
+#define PHP_REGISTRY_KEY              "SOFTWARE\\PHP"
+
+#define PHP_VER1(V1)                  #V1
+#define PHP_VER2(V1,V2)               #V1"."#V2
+#define PHP_VER3(V1,V2,V3)            #V1"."#V2"."#V3
+
+#define PHP_REGISTRY_KEYV(VER)        PHP_REGISTRY_KEY"\\"VER
+#define PHP_REGISTRY_KEY1(V1)         PHP_REGISTRY_KEY"\\"PHP_VER1(V1)
+#define PHP_REGISTRY_KEY2(V1,V2)      PHP_REGISTRY_KEY"\\"PHP_VER2(V1,V2)
+#define PHP_REGISTRY_KEY3(V1,V2,V3)   PHP_REGISTRY_KEY"\\"PHP_VER3(V1,V2,V3)
+
+static const char* registry_keys[] = {
+       PHP_REGISTRY_KEYV(PHP_VERSION),
+       PHP_REGISTRY_KEY3(PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION),
+       PHP_REGISTRY_KEY2(PHP_MAJOR_VERSION, PHP_MINOR_VERSION),
+       PHP_REGISTRY_KEY1(PHP_MAJOR_VERSION),
+       PHP_REGISTRY_KEY,
+       NULL
+};
+
+static int OpenPhpRegistryKey(char* sub_key, HKEY *hKey)
+{
+       const char **key_name = registry_keys;
+
+       if (sub_key) {
+               int main_key_len;
+               int sub_key_len = strlen(sub_key);
+               char *reg_key;
+
+               while (*key_name) {
+                       LONG ret;
+
+                       main_key_len = strlen(*key_name);
+                       reg_key = emalloc(main_key_len + sub_key_len + 1);
+                       memcpy(reg_key, *key_name, main_key_len);
+                       memcpy(reg_key + main_key_len, sub_key, sub_key_len + 1);                       
+                       ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_READ, hKey);
+                       efree(reg_key);
+                       
+                       if (ret == ERROR_SUCCESS) {
+                               return 1;
+                       }
+                       ++key_name;
+               }
+       } else {
+               while (*key_name) {
+                       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, *key_name, 0, KEY_READ, hKey) == ERROR_SUCCESS) {
+                               return 1;
+                       }
+                       ++key_name;
+               }
+       }
+       return 0;
+}
 
 void UpdateIniFromRegistry(char *path TSRMLS_DC)
 {
@@ -9,7 +62,7 @@ void UpdateIniFromRegistry(char *path TSRMLS_DC)
        HKEY MainKey;
        char *strtok_buf = NULL;
 
-       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY "\\Per Directory Values", 0, KEY_READ, &MainKey)!=ERROR_SUCCESS) {
+       if (!OpenPhpRegistryKey("\\Per Directory Values", &MainKey)) {
                return;
        }
 
@@ -100,7 +153,7 @@ char *GetIniPathFromRegistry()
        char *reg_location = NULL;
        HKEY hKey;
        
-       if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
+       if (OpenPhpRegistryKey(NULL, &hKey)) {
                DWORD buflen = MAXPATHLEN;
                reg_location = emalloc(MAXPATHLEN+1);
                if(RegQueryValueEx(hKey, PHPRC_REGISTRY_NAME, 0, NULL, reg_location, &buflen) != ERROR_SUCCESS) {