Author: markt
Date: Tue Oct 31 17:25:30 2017
New Revision: 1813916
URL: http://svn.apache.org/viewvc?rev=1813916&view=rev
Log:
Fix DAEMON-376 and DAEMON-311. When checking the registry for JVM locations,
add checks for the Java 9 locations and the IBM locations.
Modified:
commons/proper/daemon/trunk/src/changes/changes.xml
commons/proper/daemon/trunk/src/native/windows/src/registry.c
Modified: commons/proper/daemon/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/changes/changes.xml?rev=1813916&r1=1813915&r2=1813916&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/changes/changes.xml (original)
+++ commons/proper/daemon/trunk/src/changes/changes.xml Tue Oct 31 17:25:30 2017
@@ -115,6 +115,18 @@
Ensure that the //MQ command closes the prunmgr process even if the
configuration dialog is open when the //MQ command is used.
</action>
+ <action issue="DAEMON-311" type="fix" dev="markt">
+ When looking in the Windows registry for JRE and JDK installation
+ locations, additionally check the registry keys used by IBM provided
+ JREs and JDKs. Do this after checking the keys used by Oracle provided
+ JREs and JDKs.
+ </action>
+ <action issue="DAEMON-376" type="fix" dev="markt">
+ When looking in the Windows registry for JRE and JDK installation
+ locations, additionally check the registry keys used by Oracle provided
+ Java 9 and later JREs and JDKs. Do this after checking the keys used by
+ Oracle provided Java 8 and earlier JREs and JDKs.
+ </action>
</release>
</body>
</document>
Modified: commons/proper/daemon/trunk/src/native/windows/src/registry.c
URL:
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/registry.c?rev=1813916&r1=1813915&r2=1813916&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/registry.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/registry.c Tue Oct 31
17:25:30 2017
@@ -25,9 +25,21 @@ static LPCWSTR REGPARAMS = L"Para
static LPCWSTR REGDESCRIPTION = L"Description";
static LPCWSTR REGSEPARATOR = L"\\";
static LPCWSTR REGAPACHE_ROOT = L"Apache Software Foundation";
-/* predefined Java keys */
-static LPCWSTR JRE_REGKEY = L"SOFTWARE\\JavaSoft\\Java Runtime
Environment\\";
-static LPCWSTR JDK_REGKEY = L"SOFTWARE\\JavaSoft\\Java Development
Kit\\";
+/* Predefined Java keys
+ * The code below assumes the JRE and JDK arrays are the same length
+ */
+static LPCWSTR JRE_REGKEYS[] = {
+ L"SOFTWARE\\JavaSoft\\JRE\\", /* Oracle Java 8 and
earlier */
+ L"SOFTWARE\\JavaSoft\\Java Runtime Environment\\", /* Oracle Java 9 (and
hopefully later) */
+ L"SOFTWARE\\IBM\\Java2 Runtime Environment\\", /* IBM */
+ NULL
+};
+static LPCWSTR JDK_REGKEYS[] = {
+ L"SOFTWARE\\JavaSoft\\JDK\\", /* Oracle Java 8 and
ealier */
+ L"SOFTWARE\\JavaSoft\\Java Development Kit\\", /* Oracle Java 9 (and
hopefully later) */
+ L"SOFTWARE\\IBM\\Java2 Development Kit\\", /* IBM */
+ NULL
+};
static LPCWSTR JAVA_CURRENT = L"CurrentVersion";
static LPCWSTR JAVA_RUNTIME = L"RuntimeLib";
static LPCWSTR JAVA_HOME = L"JAVA_HOME";
@@ -925,76 +937,89 @@ apxDeleteRegistryA(LPCSTR szRoot,
LPWSTR apxGetJavaSoftHome(APXHANDLE hPool, BOOL bPreferJre)
{
LPWSTR wsJhome, off;
- DWORD err, dwLen;
+ DWORD err, dwLen, dwRegKey = 0;
HKEY hKey;
WCHAR wsBuf[SIZ_BUFLEN];
WCHAR wsKey[SIZ_RESLEN];
+
#if 1 /* XXX: Add that customizable using function call arg */
if (!bPreferJre && (wsJhome = __apxGetEnvironmentVariableW(hPool,
JAVA_HOME)))
return wsJhome;
#endif
- lstrcpyW(wsKey, JAVA_CURRENT);
- if (bPreferJre)
- lstrcpyW(wsBuf, JRE_REGKEY);
- else
- lstrcpyW(wsBuf, JDK_REGKEY);
- dwLen = lstrlenW(wsBuf);
- off = &wsBuf[dwLen];
- dwLen = SIZ_RESMAX;
- if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
- 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
- return NULL;
- }
- if ((err = RegQueryValueExW(hKey, JAVA_CURRENT, NULL, NULL,
- (LPBYTE)off,
- &dwLen)) != ERROR_SUCCESS) {
+
+ while (JRE_REGKEYS[dwRegKey]) {
+ lstrcpyW(wsKey, JAVA_CURRENT);
+ if (bPreferJre)
+ lstrcpyW(wsBuf, JRE_REGKEYS[dwRegKey]);
+ else
+ lstrcpyW(wsBuf, JDK_REGKEYS[dwRegKey]);
+ dwRegKey = dwRegKey++;
+ dwLen = lstrlenW(wsBuf);
+ off = &wsBuf[dwLen];
+ dwLen = SIZ_RESMAX;
+ if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
+ 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
+ continue;
+ }
+ if ((err = RegQueryValueExW(hKey, JAVA_CURRENT, NULL, NULL,
+ (LPBYTE)off,
+ &dwLen)) != ERROR_SUCCESS) {
+ RegCloseKey(hKey);
+ continue;
+ }
RegCloseKey(hKey);
- return NULL;
- }
- RegCloseKey(hKey);
- if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
- 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
- return NULL;
+ if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
+ 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
+ continue;
+ }
+ wsJhome = __apxGetRegistrySzW(hPool, hKey, JAVAHOME);
+ if (wsJhome)
+ SetEnvironmentVariableW(JAVA_HOME, wsJhome);
+ RegCloseKey(hKey);
+
+ return wsJhome;
}
- wsJhome = __apxGetRegistrySzW(hPool, hKey, JAVAHOME);
- if (wsJhome)
- SetEnvironmentVariableW(JAVA_HOME, wsJhome);
- RegCloseKey(hKey);
- return wsJhome;
+ return NULL;
}
LPWSTR apxGetJavaSoftRuntimeLib(APXHANDLE hPool)
{
LPWSTR wsRtlib, off;
- DWORD err, dwLen = SIZ_RESLEN;
+ DWORD err, dwLen = SIZ_RESLEN, dwRegKey = 0;
HKEY hKey;
WCHAR wsBuf[SIZ_BUFLEN];
- lstrcpyW(wsBuf, JRE_REGKEY);
- dwLen = lstrlenW(wsBuf);
- off = &wsBuf[dwLen];
- dwLen = SIZ_RESLEN;
- if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
- 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
- return NULL;
- }
- if ((err = RegQueryValueExW(hKey, JAVA_CURRENT, NULL, NULL,
- (LPBYTE)off,
- &dwLen)) != ERROR_SUCCESS) {
+ while(JRE_REGKEYS[dwRegKey]) {
+ lstrcpyW(wsBuf, JRE_REGKEYS[dwRegKey]);
+ dwRegKey = dwRegKey++;
+
+ dwLen = lstrlenW(wsBuf);
+ off = &wsBuf[dwLen];
+ dwLen = SIZ_RESLEN;
+ if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
+ 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
+ continue;
+ }
+ if ((err = RegQueryValueExW(hKey, JAVA_CURRENT, NULL, NULL,
+ (LPBYTE)off,
+ &dwLen)) != ERROR_SUCCESS) {
+ RegCloseKey(hKey);
+ continue;
+ }
RegCloseKey(hKey);
- return NULL;
- }
- RegCloseKey(hKey);
- if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
- 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
- return NULL;
+ if ((err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wsBuf,
+ 0, KEY_READ, &hKey)) != ERROR_SUCCESS) {
+ continue;
+ }
+ wsRtlib = __apxGetRegistrySzW(hPool, hKey, JAVA_RUNTIME);
+ RegCloseKey(hKey);
+
+ return wsRtlib;
}
- wsRtlib = __apxGetRegistrySzW(hPool, hKey, JAVA_RUNTIME);
- RegCloseKey(hKey);
- return wsRtlib;
+ return NULL;
}
/* Service Registry helper functions */