mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 20:47:44 +00:00
291 lines
7.9 KiB
C
291 lines
7.9 KiB
C
|
/*
|
||
|
* @(#)jre_md.c 1.6 97/05/15 David Connelly
|
||
|
*
|
||
|
* Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
|
||
|
* modify and redistribute this software in source and binary code form,
|
||
|
* provided that i) this copyright notice and license appear on all copies of
|
||
|
* the software; and ii) Licensee does not utilize the software in a manner
|
||
|
* which is disparaging to Sun.
|
||
|
*
|
||
|
* This software is provided "AS IS," without a warranty of any kind. ALL
|
||
|
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
|
||
|
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||
|
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
|
||
|
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||
|
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
|
||
|
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
|
||
|
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
|
||
|
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
|
||
|
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
|
||
|
* POSSIBILITY OF SUCH DAMAGES.
|
||
|
*
|
||
|
* This software is not designed or intended for use in on-line control of
|
||
|
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
|
||
|
* the design, construction, operation or maintenance of any nuclear
|
||
|
* facility. Licensee represents and warrants that it will not use or
|
||
|
* redistribute the Software for such purposes.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Win32 specific JRE support functions
|
||
|
*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <jni.h>
|
||
|
#include "jre.h"
|
||
|
|
||
|
#define JRE_KEY "Software\\JavaSoft\\Java Runtime Environment"
|
||
|
#define JDK_KEY "Software\\JavaSoft\\Java Development Kit"
|
||
|
|
||
|
#define RUNTIME_LIB "javai.dll"
|
||
|
|
||
|
/* From jre_main.c */
|
||
|
extern jboolean debug;
|
||
|
|
||
|
/* Forward Declarations */
|
||
|
jint LoadSettings(JRESettings *set, HKEY key);
|
||
|
jint GetSettings(JRESettings *set, const char *version, const char *keyname);
|
||
|
char *GetStringValue(HKEY key, const char *name);
|
||
|
|
||
|
/*
|
||
|
* Retrieve settings from registry for current runtime version. Returns
|
||
|
* 0 if successful otherwise returns -1 if no installed runtime was found
|
||
|
* or the registry data was invalid.
|
||
|
*/
|
||
|
jint
|
||
|
JRE_GetCurrentSettings(JRESettings *set)
|
||
|
{
|
||
|
jint r = -1;
|
||
|
HKEY key;
|
||
|
|
||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, JRE_KEY, 0, KEY_READ, &key) == 0) {
|
||
|
char *ver = GetStringValue(key, "CurrentVersion");
|
||
|
if (ver != 0) {
|
||
|
r = JRE_GetSettings(set, ver);
|
||
|
}
|
||
|
free(ver);
|
||
|
RegCloseKey(key);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Retrieves settings from registry for specified runtime version.
|
||
|
* Searches for either installed JRE and JDK runtimes. Returns 0 if
|
||
|
* successful otherwise returns -1 if requested version of runtime
|
||
|
* could not be found.
|
||
|
*/
|
||
|
jint
|
||
|
JRE_GetSettings(JRESettings *set, const char *version)
|
||
|
{
|
||
|
if (GetSettings(set, version, JRE_KEY) != 0) {
|
||
|
return GetSettings(set, version, JDK_KEY);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
jint
|
||
|
GetSettings(JRESettings *set, const char *version, const char *keyname)
|
||
|
{
|
||
|
HKEY key;
|
||
|
int r = -1;
|
||
|
|
||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_READ, &key) == 0) {
|
||
|
char *major, *minor, *micro = 0;
|
||
|
if (JRE_ParseVersion(version, &major, &minor, µ) == 0) {
|
||
|
HKEY subkey;
|
||
|
char *ver = JRE_MakeVersion(major, minor, 0);
|
||
|
set->majorVersion = major;
|
||
|
set->minorVersion = minor;
|
||
|
if (RegOpenKeyEx(key, ver, 0, KEY_READ, &subkey) == 0) {
|
||
|
if ((r = LoadSettings(set, subkey)) == 0) {
|
||
|
if (micro != 0) {
|
||
|
if (set->microVersion == 0 ||
|
||
|
strcmp(micro, set->microVersion) != 0) {
|
||
|
r = -1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
RegCloseKey(subkey);
|
||
|
}
|
||
|
free(ver);
|
||
|
}
|
||
|
RegCloseKey(key);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Load runtime settings from specified registry key. Returns 0 if
|
||
|
* successful otherwise -1 if the registry data was invalid.
|
||
|
*/
|
||
|
static jint
|
||
|
LoadSettings(JRESettings *set, HKEY key)
|
||
|
{
|
||
|
/* Full path name of JRE home directory (required) */
|
||
|
set->javaHome = GetStringValue(key, "JavaHome");
|
||
|
if (set->javaHome == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
/* Full path name of JRE runtime DLL */
|
||
|
set->runtimeLib = GetStringValue(key, "RuntimeLib");
|
||
|
if (set->runtimeLib == 0) {
|
||
|
set->runtimeLib = JRE_GetDefaultRuntimeLib(set->javaHome);
|
||
|
}
|
||
|
/* Class path setting to override default */
|
||
|
set->classPath = GetStringValue(key, "ClassPath");
|
||
|
if (set->classPath == 0) {
|
||
|
set->classPath = JRE_GetDefaultClassPath(set->javaHome);
|
||
|
}
|
||
|
/* Optional JIT compiler library name */
|
||
|
set->compiler = GetStringValue(key, "Compiler");
|
||
|
/* Release micro-version */
|
||
|
set->microVersion = GetStringValue(key, "MicroVersion");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Returns string data for the specified registry value name, or
|
||
|
* NULL if not found.
|
||
|
*/
|
||
|
static char *
|
||
|
GetStringValue(HKEY key, const char *name)
|
||
|
{
|
||
|
DWORD type, size;
|
||
|
char *value = 0;
|
||
|
|
||
|
if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0 &&
|
||
|
type == REG_SZ ) {
|
||
|
value = JRE_Malloc(size);
|
||
|
if (RegQueryValueEx(key, name, 0, 0, value, &size) != 0) {
|
||
|
free(value);
|
||
|
value = 0;
|
||
|
}
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Returns default runtime settings based on location of this program.
|
||
|
* Makes best attempt at determining location of runtime. Returns 0
|
||
|
* if successful or -1 if a runtime could not be found.
|
||
|
*/
|
||
|
jint
|
||
|
JRE_GetDefaultSettings(JRESettings *set)
|
||
|
{
|
||
|
char buf[MAX_PATH], *bp;
|
||
|
int n;
|
||
|
|
||
|
// Try to obtain default value for Java home directory based on
|
||
|
// location of this executable.
|
||
|
|
||
|
if ((n = GetModuleFileName(0, buf, MAX_PATH)) == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
bp = buf + n;
|
||
|
while (*--bp != '\\') ;
|
||
|
bp -= 4;
|
||
|
if (bp < buf || strnicmp(bp, "\\bin", 4) != 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
*bp = '\0';
|
||
|
set->javaHome = strdup(buf);
|
||
|
|
||
|
// Get default runtime library
|
||
|
set->runtimeLib = JRE_GetDefaultRuntimeLib(set->javaHome);
|
||
|
|
||
|
// Get default class path
|
||
|
set->classPath = JRE_GetDefaultClassPath(set->javaHome);
|
||
|
|
||
|
// Reset other fields since these are unknown
|
||
|
set->compiler = 0;
|
||
|
set->majorVersion = 0;
|
||
|
set->minorVersion = 0;
|
||
|
set->microVersion = 0;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Return default runtime library for specified Java home directory.
|
||
|
*/
|
||
|
char *
|
||
|
JRE_GetDefaultRuntimeLib(const char *dir)
|
||
|
{
|
||
|
char *cp = JRE_Malloc(strlen(dir) + sizeof(RUNTIME_LIB) + 8);
|
||
|
sprintf(cp, "%s\\bin\\" RUNTIME_LIB, dir);
|
||
|
return cp;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Return default class path for specified Java home directory.
|
||
|
*/
|
||
|
char *
|
||
|
JRE_GetDefaultClassPath(const char *dir)
|
||
|
{
|
||
|
char *cp = JRE_Malloc(strlen(dir) * 4 + 64);
|
||
|
sprintf(cp, "%s\\lib\\rt.jar;%s\\lib\\i18n.jar;%s\\lib\\classes.zip;"
|
||
|
"%s\\classes", dir, dir, dir, dir);
|
||
|
return cp;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Loads the runtime library corresponding to 'libname' and returns
|
||
|
* an opaque handle to the library.
|
||
|
*/
|
||
|
void *
|
||
|
JRE_LoadLibrary(const char *path)
|
||
|
{
|
||
|
return (void *)LoadLibrary(path);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Unloads the runtime library associated with handle.
|
||
|
*/
|
||
|
void
|
||
|
JRE_UnloadLibrary(void *handle)
|
||
|
{
|
||
|
FreeLibrary(handle);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Loads default VM args for the specified runtime library handle.
|
||
|
*/
|
||
|
jint
|
||
|
JRE_GetDefaultJavaVMInitArgs(void *handle, void *vmargs)
|
||
|
{
|
||
|
FARPROC proc = GetProcAddress(handle, "JNI_GetDefaultJavaVMInitArgs");
|
||
|
return proc != 0 ? ((*proc)(vmargs), 0) : -1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Creates a Java VM for the specified runtime library handle.
|
||
|
*/
|
||
|
jint
|
||
|
JRE_CreateJavaVM(void *handle, JavaVM **vmp, JNIEnv **envp, void *vmargs)
|
||
|
{
|
||
|
FARPROC proc = GetProcAddress(handle, "JNI_CreateJavaVM");
|
||
|
return proc != 0 ? (*proc)(vmp, envp, vmargs) : -1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Entry point for JREW (Windows-only) version of the runtime loader.
|
||
|
* This entry point is called when the '-subsystem:windows' linker
|
||
|
* option is used, and will cause the resulting executable to run
|
||
|
* detached from the console.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* int WINAPI
|
||
|
* WinMain(HINSTANCE inst, HINSTANCE prevInst, LPSTR cmdLine, int cmdShow)
|
||
|
* {
|
||
|
* __declspec(dllimport) char **__initenv;
|
||
|
*
|
||
|
* __initenv = _environ;
|
||
|
* exit(main(__argc, __argv));
|
||
|
* }
|
||
|
*/
|