billbarker 2004/03/28 15:58:51
Modified: daemon/src/native/nt/procrun procrun.c
Log:
Refactor the JAVA_HOME auto-detection logic.
This will make it easier to extend to non-Sun JVMs later.
Also, adding in additional second-try at guessing that will allow procrun to recover
from at least some of the common JVM installation errors.
Finally, adding in support to specify JAVA_HOME via the --Environment configuration
option, so that it is possible to configure different services to use different JVM
installs.
Revision Changes Path
1.16 +110 -84 jakarta-commons/daemon/src/native/nt/procrun/procrun.c
Index: procrun.c
===================================================================
RCS file: /home/cvs/jakarta-commons/daemon/src/native/nt/procrun/procrun.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- procrun.c 18 Mar 2004 04:20:19 -0000 1.15
+++ procrun.c 28 Mar 2004 23:58:51 -0000 1.16
@@ -61,6 +61,7 @@
int report_service_status(DWORD, DWORD, DWORD, process_t *);
int procrun_redirect(char *program, char **envp, procrun_t *env, int starting);
+static char *procrun_find_java(process_t *proc, char *jhome);
static int g_proc_stderr_file = 0;
int g_proc_mode = 0;
@@ -685,6 +686,103 @@
return rv;
}
+/* Locate the default JAVA_HOME from the registry only.
+ */
+static char *procrun_guess_reg_jhome(process_t *proc)
+{
+ HKEY hkjs;
+ char jbin[MAX_PATH+1];
+ char reg[MAX_PATH+1];
+ char *cver;
+ unsigned long err, klen = MAX_PATH;
+ strcpy(reg, JAVASOFT_REGKEY);
+ cver = ®[sizeof(JAVASOFT_REGKEY)-1];
+
+ if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
+ 0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
+ /* No JRE key, so try the JDK */
+ strcpy(reg, JAVAHOME_REGKEY);
+ cver = ®[STRN_SIZE(JAVAHOME_REGKEY)];
+ if((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
+ 0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
+ DBPRINTF0("procrun_guess_reg_jhome() failed to open Registry key\n");
+ return NULL;
+ }
+ }
+ if ((err = RegQueryValueEx(hkjs, "CurrentVersion", NULL, NULL,
+ (unsigned char *)cver,
+ &klen)) != ERROR_SUCCESS) {
+ DBPRINTF0("procrun_guess_jvm() failed obtaining Current Java Version\n");
+ RegCloseKey(hkjs);
+ return NULL;
+ }
+ RegCloseKey(hkjs);
+
+ if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
+ 0, KEY_READ, &hkjs) ) != ERROR_SUCCESS) {
+ DBPRINTF1("procrun_guess_jvm() failed to open Registry key %s\n", reg);
+ return NULL;
+ }
+ klen = MAX_PATH;
+ if ((err = RegQueryValueEx(hkjs, "JavaHome", NULL, NULL,
+ (unsigned char *)jbin,
+ &klen)) != ERROR_SUCCESS) {
+ DBPRINTF0("procrun_guess_jvm() failed obtaining Java path\n");
+ RegCloseKey(hkjs);
+ return NULL;
+ }
+ RegCloseKey(hkjs);
+ return pool_strdup(proc->pool, jbin);
+}
+
+/* Find the value for JAVA_HOME.
+ */
+static char *procrun_guess_javahome(process_t *proc, int *inenv)
+{
+ char *cver = NULL;
+
+ if(proc->service.environment != NULL) {
+ char *env = proc->service.environment;
+ while(*env) {
+ if(STRNI_COMPARE(env, "JAVA_HOME=")) {
+ cver = pool_strdup(proc->pool,env + STRN_SIZE("JAVA_HOME="));
+ if(inenv != NULL)
+ *inenv = 1;
+ break;
+ }
+ env += strlen(env)+1;
+ }
+ }
+ if(cver == NULL) {
+ cver = getenv("JAVA_HOME");
+ if(cver != NULL) {
+ cver = pool_strdup(proc->pool, cver);
+ if(inenv != NULL)
+ *inenv = 1;
+ }
+ }
+ if(cver == NULL) {
+ cver = procrun_guess_reg_jhome(proc);
+ if(inenv != NULL)
+ *inenv = 0;
+ }
+ return cver;
+}
+
+/* Find the default jvm.dll
+ * This function is the fall-back to try well-known locations if
+ * the registry search fails to find it.
+ */
+static char *procrun_guess_jvm2(process_t *proc)
+{
+ char *jhome = procrun_guess_javahome(proc, NULL);
+
+ if(jhome == NULL)
+ return NULL;
+ return procrun_find_java(proc, jhome);
+}
+
+
/* Find the default jvm.dll
* The function scans through registry and finds
* default JRE jvm.dll.
@@ -703,21 +801,21 @@
if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
DBPRINTF0("procrun_guess_jvm() failed to open Registry key\n");
- return NULL;
+ return procrun_guess_jvm2(proc);
}
if ((err = RegQueryValueEx(hkjs, "CurrentVersion", NULL, NULL,
(unsigned char *)cver,
&klen)) != ERROR_SUCCESS) {
DBPRINTF0("procrun_guess_jvm() failed obtaining Current Java Version\n");
RegCloseKey(hkjs);
- return NULL;
+ return procrun_guess_jvm2(proc);
}
RegCloseKey(hkjs);
if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
0, KEY_READ, &hkjs) ) != ERROR_SUCCESS) {
DBPRINTF1("procrun_guess_jvm() failed to open Registry key %s\n", reg);
- return NULL;
+ return procrun_guess_jvm2(proc);
}
klen = MAX_PATH;
if ((err = RegQueryValueEx(hkjs, "RuntimeLib", NULL, NULL,
@@ -725,7 +823,7 @@
&klen)) != ERROR_SUCCESS) {
DBPRINTF0("procrun_guess_jvm() failed obtaining Runtime Library\n");
RegCloseKey(hkjs);
- return NULL;
+ return procrun_guess_jvm2(proc);
}
RegCloseKey(hkjs);
@@ -739,47 +837,10 @@
static char* procrun_guess_java(process_t *proc, const char *image)
{
- HKEY hkjs;
char jbin[MAX_PATH+1];
- char reg[MAX_PATH+1];
- char *cver;
- unsigned long err, klen = MAX_PATH;
+ char *cver = procrun_guess_javahome(proc, NULL);
- if((cver = getenv("JAVA_HOME")) != NULL) {
- strcpy(jbin,cver);
- } else {
- strcpy(reg, JAVASOFT_REGKEY);
- cver = ®[sizeof(JAVASOFT_REGKEY)-1];
-
- if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
- 0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed to open Registry key\n");
- return NULL;
- }
- if ((err = RegQueryValueEx(hkjs, "CurrentVersion", NULL, NULL,
- (unsigned char *)cver,
- &klen)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed obtaining Current Java
Version\n");
- RegCloseKey(hkjs);
- return NULL;
- }
- RegCloseKey(hkjs);
-
- if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
- 0, KEY_READ, &hkjs) ) != ERROR_SUCCESS) {
- DBPRINTF1("procrun_guess_jvm() failed to open Registry key %s\n", reg);
- return NULL;
- }
- klen = MAX_PATH;
- if ((err = RegQueryValueEx(hkjs, "JavaHome", NULL, NULL,
- (unsigned char *)jbin,
- &klen)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed obtaining Java path\n");
- RegCloseKey(hkjs);
- return NULL;
- }
- RegCloseKey(hkjs);
- }
+ strcpy(jbin, cver);
strcat(jbin, "\\bin\\");
strcat(jbin, image);
strcat(jbin, ".exe");
@@ -792,49 +853,14 @@
*/
static char* procrun_guess_java_home(process_t *proc)
{
- HKEY hkjs;
char jbin[MAX_PATH+1];
- char reg[MAX_PATH+1];
- char *cver;
- unsigned long err, klen = MAX_PATH;
-
- if ((cver = getenv("JAVA_HOME")) != NULL) {
- strcpy(jbin, cver);
- strcat(jbin, "\\bin");
- return pool_strdup(proc->pool, jbin);
- }
- strcpy(reg, JAVAHOME_REGKEY);
- cver = ®[sizeof(JAVAHOME_REGKEY)-1];
-
- if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
- 0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed to open Registry key\n");
- return NULL;
- }
- if ((err = RegQueryValueEx(hkjs, "CurrentVersion", NULL, NULL,
- (unsigned char *)cver,
- &klen)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed obtaining Current Java SDK
Version\n");
- RegCloseKey(hkjs);
- return NULL;
- }
- RegCloseKey(hkjs);
+ int inenv = 1;
+ char *cver= procrun_guess_javahome(proc, &inenv);
- if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
- 0, KEY_READ, &hkjs)) != ERROR_SUCCESS) {
- DBPRINTF1("procrun_guess_jvm() failed to open Registry key %s\n", reg);
- return NULL;
- }
- klen = MAX_PATH;
- if ((err = RegQueryValueEx(hkjs, "JavaHome", NULL, NULL,
- (unsigned char *)jbin,
- &klen)) != ERROR_SUCCESS) {
- DBPRINTF0("procrun_guess_jvm() failed obtaining Java Home\n");
- RegCloseKey(hkjs);
- return NULL;
+ strcpy(jbin, cver);
+ if( !inenv ) {
+ procrun_addenv("JAVA_HOME", jbin, 0, proc);
}
- RegCloseKey(hkjs);
- procrun_addenv("JAVA_HOME", jbin, 0, proc);
strcat(jbin, "\\bin");
return pool_strdup(proc->pool, jbin);
}
@@ -1269,7 +1295,7 @@
strclass = (*env)->FindClass(env, "java/lang/String");
if (proc->java.stop_param) {
- char opts[64];
+ char *opts[64];
int nopts = make_array(proc->java.stop_param, opts, 60, proc);
int i;
jargs = (*env)->NewObjectArray(env, nopts, strclass, NULL);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]