billbarker    2003/12/30 20:43:15

  Modified:    daemon/src/native/nt/procrun procrun.c
  Log:
  1) Allow the --Java to simply be where java is installed, instead of the full
  path to the jvm.dll.
  
  2) When running --Java=java, use the JVM specified in JAVA_HOME over the one
  specified in the registry.
  
  Fix for Bug #25789
  
  Revision  Changes    Path
  1.11      +79 -25    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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- procrun.c 6 Dec 2003 18:10:53 -0000       1.10
  +++ procrun.c 31 Dec 2003 04:43:15 -0000      1.11
  @@ -787,37 +787,41 @@
       char *cver;
       unsigned long err, klen = MAX_PATH;
       
  -    strcpy(reg, JAVASOFT_REGKEY);
  -    cver = &reg[sizeof(JAVASOFT_REGKEY)-1];
  +    if((cver = getenv("JAVA_HOME")) != NULL) {
  +        strcpy(jbin,cver);
  +    } else {
  +        strcpy(reg, JAVASOFT_REGKEY);
  +        cver = &reg[sizeof(JAVASOFT_REGKEY)-1];
   
  -    if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
  +        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, 
  +           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");
  +            DBPRINTF0("procrun_guess_jvm() failed obtaining Current Java 
Version\n");
  +            RegCloseKey(hkjs);
  +            return NULL;
  +        }
           RegCloseKey(hkjs);
  -        return NULL;
  -    }
  -    RegCloseKey(hkjs);
       
  -    if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg,
  +        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, 
  +            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");
  +            DBPRINTF0("procrun_guess_jvm() failed obtaining Java path\n");
  +            RegCloseKey(hkjs);
  +            return NULL;
  +        }
           RegCloseKey(hkjs);
  -        return NULL;
       }
  -    RegCloseKey(hkjs);
       strcat(jbin, "\\bin\\");
       strcat(jbin, image);
       strcat(jbin, ".exe");
  @@ -1950,7 +1954,35 @@
       RegCloseKey(key); 
       return (err != ERROR_SUCCESS);
   }
  -
  +static const char *location_jvm_default[] = {
  +    "\\jre\\bin\\classic\\jvm.dll",           /* Sun JDK 1.3 */
  +    "\\bin\\classic\\jvm.dll",                /* Sun JRE 1.3 */
  +    "\\jre\\bin\\client\\jvm.dll",            /* Sun JDK 1.4 */
  +    "\\bin\\client\\jvm.dll",                 /* Sun JRE 1.4 */
  +    NULL,
  +};
  +  
  +/* 
  + * Attempt to locate the jvm from the installation.
  + */
  +static char *procrun_find_java(process_t *proc, char *jhome)
  +{
  +  char path[MAX_PATH+1];
  +  int x = 0;
  +  HMODULE hm;
  +  for(x=0; location_jvm_default[x] != NULL; x++) {
  +      strcpy(path,jhome);
  +      strcat(path,location_jvm_default[x]);
  +      hm = LoadLibraryEx(path, NULL, 0); 
  +      if(hm != NULL) {
  +          DBPRINTF1("Found library at %s\n",path);
  +          FreeLibrary(hm);
  +          return pool_strdup(proc->pool, path);
  +      }
  +  }
  +  return NULL;
  +}
  +   
   /*
    * Process the arguments and fill the process_t stuct.
    */
  @@ -2027,9 +2059,19 @@
              break; 
           }
       }
  -    if (*java && !strnicmp(*java, "java", 4))
  +    if (*java && !strnicmp(*java, "java", 4)) {
           arglen = strlen(*java) + 1;
  -    else if (proc->service.name)
  +    } else if(*java) {
  +        int jlen = strlen(*java) +1;
  +        if(stricmp(*java+(jlen-5),".dll")) {
  +            /* Assume it is the java installation */
  +            char *njava = procrun_find_java(proc, *java);
  +            DBPRINTF1("Attempting to locate jvm from %s\n",*java);
  +            if(njava != NULL) {
  +              *java = njava;
  +            }
  +        }
  +    } else if (proc->service.name)
           arglen = strlen(proc->service.name) + 1;
       for (n = i; n < argc; n++) {
           arglen += (strlen(argv[n]) + 1);
  @@ -2039,9 +2081,9 @@
       if (arglen) {
           ++arglen;
           proc->argw = (char *)pool_calloc(proc->pool, arglen);
  -        if (*java && !strnicmp(*java, "java", 4))
  +        if (*java && !strnicmp(*java, "java", 4)) 
               strcpy(proc->argw, *java);
  -        else
  +        else 
               strcpy(proc->argw, proc->service.name);
           for (n = i; n < argc; n++) {
               strcat(proc->argw, " ");
  @@ -2378,6 +2420,18 @@
               break;
       }
   
  +    if (java && strnicmp(java, "java", 4)) {
  +        int jlen = strlen(java) + 1;
  +        if(stricmp(java+(jlen-5),".dll")) {
  +            /* Assume it is the java installation */
  +            char *njava = procrun_find_java(proc, java);
  +            DBPRINTF1("Attempting to locate jvm from %s\n",java);
  +            if(njava != NULL) {
  +              java = njava;
  +            }
  +        }
  +    }
  + 
       if (i < argc) {
           if (java && !strnicmp(java, "java", 4))
               arglen = strlen(java) + 1;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to