hotspot/src/os/windows/launcher/java_md.c
author sla
Thu, 02 Dec 2010 05:45:54 -0800
changeset 7410 f5b282e7a7a6
child 7452 b3fa838286de
permissions -rw-r--r--
6981484: Update development launcher Summary: Add new development launcher called hotspot(.exe) Reviewed-by: coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7410
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     1
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     4
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     8
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    13
 * accompanied this code).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    14
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    18
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    21
 * questions.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    22
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    23
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    24
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    25
#include <windows.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    26
#include <io.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    27
#include <process.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    28
#include <stdlib.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    29
#include <stdio.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    30
#include <string.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    31
#include <sys/types.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    32
#include <sys/stat.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    33
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    34
#include <jni.h>
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    35
#include "java.h"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    36
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    37
#include "version_comp.h"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    38
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    39
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    40
#define JVM_DLL "jvm.dll"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    41
#define JAVA_DLL "java.dll"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    42
#define CRT_DLL "msvcr71.dll"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    43
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    44
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    45
 * Prototypes.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    46
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    47
static jboolean GetPublicJREHome(char *path, jint pathsize);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    48
static jboolean GetJVMPath(const char *jrepath, const char *jvmtype,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    49
                           char *jvmpath, jint jvmpathsize);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    50
static jboolean GetJREPath(char *path, jint pathsize);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    51
static void EnsureJreInstallation(const char *jrepath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    52
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    53
/* We supports warmup for UI stack that is performed in parallel
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    54
 * to VM initialization.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    55
 * This helps to improve startup of UI application as warmup phase
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    56
 * might be long due to initialization of OS or hardware resources.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    57
 * It is not CPU bound and therefore it does not interfere with VM init.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    58
 * Obviously such warmup only has sense for UI apps and therefore it needs
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    59
 * to be explicitly requested by passing -Dsun.awt.warmup=true property
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    60
 * (this is always the case for plugin/javaws).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    61
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    62
 * Implementation launches new thread after VM starts and use it to perform
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    63
 * warmup code (platform dependent).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    64
 * This thread is later reused as AWT toolkit thread as graphics toolkit
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    65
 * often assume that they are used from the same thread they were launched on.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    66
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    67
 * At the moment we only support warmup for D3D. It only possible on windows
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    68
 * and only if other flags do not prohibit this (e.g. OpenGL support requested).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    69
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    70
#undef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    71
#ifndef JAVA_ARGS /* turn off AWT preloading for javac, jar, etc */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    72
  #ifdef _X86_ /* for now disable AWT preloading for 64bit */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    73
    #define ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    74
  #endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    75
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    76
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    77
#ifdef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    78
/* "AWT was preloaded" flag;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    79
 * Turned on by AWTPreload().
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    80
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    81
int awtPreloaded = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    82
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    83
/* Calls a function with the name specified.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    84
 * The function must be int(*fn)(void).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    85
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    86
int AWTPreload(const char *funcName);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    87
/* Stops AWT preloading. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    88
void AWTPreloadStop();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    89
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    90
/* D3D preloading */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    91
/* -1: not initialized; 0: OFF, 1: ON */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    92
int awtPreloadD3D = -1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    93
/* Command line parameter to swith D3D preloading on. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    94
#define PARAM_PRELOAD_D3D "-Dsun.awt.warmup"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    95
/* D3D/OpenGL management parameters (may disable D3D preloading) */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    96
#define PARAM_NODDRAW "-Dsun.java2d.noddraw"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    97
#define PARAM_D3D "-Dsun.java2d.d3d"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    98
#define PARAM_OPENGL "-Dsun.java2d.opengl"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
    99
/* funtion in awt.dll (src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp) */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   100
#define D3D_PRELOAD_FUNC "preloadD3D"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   101
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   102
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   103
/* Extracts value of a parameter with the specified name
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   104
 * from command line argument (returns pointer in the argument).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   105
 * Returns NULL if the argument does not contains the parameter.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   106
 * e.g.:
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   107
 * GetParamValue("theParam", "theParam=value") returns pointer to "value".
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   108
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   109
const char * GetParamValue(const char *paramName, const char *arg) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   110
    int nameLen = strlen(paramName);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   111
    if (strncmp(paramName, arg, nameLen) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   112
        // arg[nameLen] is valid (may contain final NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   113
        if (arg[nameLen] == '=') {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   114
            return arg + nameLen + 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   115
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   116
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   117
    return NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   118
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   119
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   120
/* Checks if commandline argument contains property specified
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   121
 * and analyze it as boolean property (true/false).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   122
 * Returns -1 if the argument does not contain the parameter;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   123
 * Returns 1 if the argument contains the parameter and its value is "true";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   124
 * Returns 0 if the argument contains the parameter and its value is "false".
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   125
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   126
int GetBoolParamValue(const char *paramName, const char *arg) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   127
    const char * paramValue = GetParamValue(paramName, arg);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   128
    if (paramValue != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   129
        if (stricmp(paramValue, "true") == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   130
            return 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   131
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   132
        if (stricmp(paramValue, "false") == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   133
            return 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   134
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   135
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   136
    return -1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   137
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   138
#endif /* ENABLE_AWT_PRELOAD */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   139
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   140
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   141
const char *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   142
GetArch()
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   143
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   144
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   145
#ifdef _M_AMD64
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   146
    return "amd64";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   147
#elif defined(_M_IA64)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   148
    return "ia64";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   149
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   150
    return "i386";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   151
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   152
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   153
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   154
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   155
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   156
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   157
void
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   158
CreateExecutionEnvironment(int *_argc,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   159
                           char ***_argv,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   160
                           char jrepath[],
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   161
                           jint so_jrepath,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   162
                           char jvmpath[],
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   163
                           jint so_jvmpath,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   164
                           char **original_argv) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   165
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   166
   char * jvmtype;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   167
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   168
    /* Find out where the JRE is that we will be using. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   169
    if (!GetJREPath(jrepath, so_jrepath)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   170
        ReportErrorMessage("Error: could not find Java SE Runtime Environment.",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   171
                           JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   172
        exit(2);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   173
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   174
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   175
    /* Do this before we read jvm.cfg */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   176
    EnsureJreInstallation(jrepath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   177
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   178
    /* Find the specified JVM type */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   179
    if (ReadKnownVMs(jrepath, (char*)GetArch(), JNI_FALSE) < 1) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   180
        ReportErrorMessage("Error: no known VMs. (check for corrupt jvm.cfg file)",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   181
                           JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   182
        exit(1);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   183
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   184
    jvmtype = CheckJvmType(_argc, _argv, JNI_FALSE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   185
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   186
    jvmpath[0] = '\0';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   187
    if (!GetJVMPath(jrepath, jvmtype, jvmpath, so_jvmpath)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   188
        char * message=NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   189
        const char * format = "Error: no `%s' JVM at `%s'.";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   190
        message = (char *)JLI_MemAlloc((strlen(format)+strlen(jvmtype)+
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   191
                                    strlen(jvmpath)) * sizeof(char));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   192
        sprintf(message,format, jvmtype, jvmpath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   193
        ReportErrorMessage(message, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   194
        exit(4);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   195
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   196
    /* If we got here, jvmpath has been correctly initialized. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   197
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   198
#else  /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   199
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   200
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   201
     * gamma launcher is simpler in that it doesn't handle VM flavors, data
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   202
     * model, etc. Assuming everything is set-up correctly
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   203
     * all we need to do here is to return correct path names. See also
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   204
     * GetJVMPath() and GetApplicationHome().
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   205
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   206
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   207
  {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   208
    if (!GetJREPath(jrepath, so_jrepath) ) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   209
       ReportErrorMessage("Error: could not find Java SE Runtime Environment.",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   210
                          JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   211
       exit(2);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   212
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   213
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   214
    if (!GetJVMPath(jrepath, NULL, jvmpath, so_jvmpath)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   215
       char * message=NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   216
       const char * format = "Error: no JVM at `%s'.";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   217
       message = (char *)JLI_MemAlloc((strlen(format)+
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   218
                                       strlen(jvmpath)) * sizeof(char));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   219
       sprintf(message, format, jvmpath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   220
       ReportErrorMessage(message, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   221
       exit(4);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   222
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   223
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   224
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   225
#endif  /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   226
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   227
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   228
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   229
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   230
static jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   231
LoadMSVCRT()
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   232
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   233
    // Only do this once
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   234
    static int loaded = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   235
    char crtpath[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   236
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   237
    if (!loaded) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   238
        /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   239
         * The Microsoft C Runtime Library needs to be loaded first.  A copy is
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   240
         * assumed to be present in the "JRE path" directory.  If it is not found
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   241
         * there (or "JRE path" fails to resolve), skip the explicit load and let
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   242
         * nature take its course, which is likely to be a failure to execute.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   243
         */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   244
        if (GetJREPath(crtpath, MAXPATHLEN)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   245
            (void)strcat(crtpath, "\\bin\\" CRT_DLL);   /* Add crt dll */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   246
            if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   247
                printf("CRT path is %s\n", crtpath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   248
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   249
            if (_access(crtpath, 0) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   250
                if (LoadLibrary(crtpath) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   251
                    ReportErrorMessage2("Error loading: %s", crtpath, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   252
                    return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   253
                }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   254
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   255
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   256
        loaded = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   257
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   258
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   259
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   260
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   261
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   262
 * The preJVMStart is a function in the jkernel.dll, which
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   263
 * performs the final step of synthesizing back the decomposed
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   264
 * modules  (partial install) to the full JRE. Any tool which
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   265
 * uses the  JRE must peform this step to ensure the complete synthesis.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   266
 * The EnsureJreInstallation function calls preJVMStart based on
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   267
 * the conditions outlined below, noting that the operation
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   268
 * will fail silently if any of conditions are not met.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   269
 * NOTE: this call must be made before jvm.dll is loaded, or jvm.cfg
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   270
 * is read, since jvm.cfg will be modified by the preJVMStart.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   271
 * 1. Are we on a supported platform.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   272
 * 2. Find the location of the JRE or the Kernel JRE.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   273
 * 3. check existence of JREHOME/lib/bundles
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   274
 * 4. check jkernel.dll and invoke the entry-point
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   275
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   276
typedef VOID (WINAPI *PREJVMSTART)();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   277
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   278
static void
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   279
EnsureJreInstallation(const char* jrepath)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   280
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   281
    HINSTANCE handle;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   282
    char tmpbuf[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   283
    PREJVMSTART PreJVMStart;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   284
    struct stat s;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   285
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   286
    /* 32 bit windows only please */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   287
    if (strcmp(GetArch(), "i386") != 0 ) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   288
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   289
            printf("EnsureJreInstallation:unsupported platform\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   290
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   291
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   292
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   293
    /* Does our bundle directory exist ? */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   294
    strcpy(tmpbuf, jrepath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   295
    strcat(tmpbuf, "\\lib\\bundles");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   296
    if (stat(tmpbuf, &s) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   297
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   298
            printf("EnsureJreInstallation:<%s>:not found\n", tmpbuf);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   299
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   300
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   301
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   302
    /* Does our jkernel dll exist ? */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   303
    strcpy(tmpbuf, jrepath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   304
    strcat(tmpbuf, "\\bin\\jkernel.dll");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   305
    if (stat(tmpbuf, &s) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   306
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   307
            printf("EnsureJreInstallation:<%s>:not found\n", tmpbuf);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   308
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   309
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   310
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   311
    /* The Microsoft C Runtime Library needs to be loaded first. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   312
    if (!LoadMSVCRT()) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   313
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   314
            printf("EnsureJreInstallation:could not load C runtime DLL\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   315
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   316
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   317
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   318
    /* Load the jkernel.dll */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   319
    if ((handle = LoadLibrary(tmpbuf)) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   320
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   321
            printf("EnsureJreInstallation:%s:load failed\n", tmpbuf);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   322
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   323
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   324
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   325
    /* Get the function address */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   326
    PreJVMStart = (PREJVMSTART)GetProcAddress(handle, "preJVMStart");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   327
    if (PreJVMStart == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   328
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   329
            printf("EnsureJreInstallation:preJVMStart:function lookup failed\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   330
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   331
        FreeLibrary(handle);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   332
        return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   333
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   334
    PreJVMStart();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   335
    if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   336
        printf("EnsureJreInstallation:preJVMStart:called\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   337
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   338
    FreeLibrary(handle);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   339
    return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   340
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   341
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   342
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   343
 * Find path to JRE based on .exe's location or registry settings.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   344
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   345
jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   346
GetJREPath(char *path, jint pathsize)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   347
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   348
    char javadll[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   349
    struct stat s;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   350
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   351
    if (GetApplicationHome(path, pathsize)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   352
        /* Is JRE co-located with the application? */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   353
        sprintf(javadll, "%s\\bin\\" JAVA_DLL, path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   354
        if (stat(javadll, &s) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   355
            goto found;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   356
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   357
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   358
        /* Does this app ship a private JRE in <apphome>\jre directory? */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   359
        sprintf(javadll, "%s\\jre\\bin\\" JAVA_DLL, path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   360
        if (stat(javadll, &s) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   361
            strcat(path, "\\jre");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   362
            goto found;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   363
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   364
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   365
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   366
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   367
    /* Look for a public JRE on this machine. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   368
    if (GetPublicJREHome(path, pathsize)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   369
        goto found;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   370
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   371
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   372
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   373
    fprintf(stderr, "Error: could not find " JAVA_DLL "\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   374
    return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   375
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   376
 found:
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   377
    if (_launcher_debug)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   378
      printf("JRE path is %s\n", path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   379
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   380
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   381
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   382
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   383
 * Given a JRE location and a JVM type, construct what the name the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   384
 * JVM shared library will be.  Return true, if such a library
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   385
 * exists, false otherwise.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   386
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   387
static jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   388
GetJVMPath(const char *jrepath, const char *jvmtype,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   389
           char *jvmpath, jint jvmpathsize)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   390
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   391
    struct stat s;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   392
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   393
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   394
    if (strchr(jvmtype, '/') || strchr(jvmtype, '\\')) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   395
        sprintf(jvmpath, "%s\\" JVM_DLL, jvmtype);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   396
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   397
        sprintf(jvmpath, "%s\\bin\\%s\\" JVM_DLL, jrepath, jvmtype);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   398
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   399
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   400
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   401
     * For gamma launcher, JVM is either built-in or in the same directory.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   402
     * Either way we return "<exe_path>/jvm.dll" where <exe_path> is the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   403
     * directory where gamma launcher is located.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   404
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   405
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   406
    char *p;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   407
    GetModuleFileName(0, jvmpath, jvmpathsize);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   408
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   409
    p = strrchr(jvmpath, '\\');
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   410
    if (p) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   411
       /* replace executable name with libjvm.so */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   412
       snprintf(p + 1, jvmpathsize - (p + 1 - jvmpath), "%s", JVM_DLL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   413
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   414
       /* this case shouldn't happen */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   415
       snprintf(jvmpath, jvmpathsize, "%s", JVM_DLL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   416
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   417
#endif /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   418
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   419
    if (stat(jvmpath, &s) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   420
        return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   421
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   422
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   423
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   424
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   425
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   426
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   427
 * Load a jvm from "jvmpath" and initialize the invocation functions.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   428
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   429
jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   430
LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   431
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   432
#ifdef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   433
    /* JVM is directly linked with gamma launcher; no Loadlibrary() */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   434
    ifn->CreateJavaVM = JNI_CreateJavaVM;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   435
    ifn->GetDefaultJavaVMInitArgs = JNI_GetDefaultJavaVMInitArgs;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   436
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   437
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   438
    HINSTANCE handle;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   439
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   440
    if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   441
        printf("JVM path is %s\n", jvmpath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   442
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   443
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   444
    /* The Microsoft C Runtime Library needs to be loaded first. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   445
    LoadMSVCRT();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   446
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   447
    /* Load the Java VM DLL */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   448
    if ((handle = LoadLibrary(jvmpath)) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   449
        ReportErrorMessage2("Error loading: %s", (char *)jvmpath, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   450
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   451
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   452
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   453
    /* Now get the function addresses */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   454
    ifn->CreateJavaVM =
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   455
        (void *)GetProcAddress(handle, "JNI_CreateJavaVM");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   456
    ifn->GetDefaultJavaVMInitArgs =
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   457
        (void *)GetProcAddress(handle, "JNI_GetDefaultJavaVMInitArgs");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   458
    if (ifn->CreateJavaVM == 0 || ifn->GetDefaultJavaVMInitArgs == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   459
        ReportErrorMessage2("Error: can't find JNI interfaces in: %s",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   460
                            (char *)jvmpath, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   461
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   462
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   463
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   464
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   465
#endif /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   466
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   467
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   468
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   469
 * If app is "c:\foo\bin\javac", then put "c:\foo" into buf.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   470
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   471
jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   472
GetApplicationHome(char *buf, jint bufsize)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   473
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   474
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   475
    char *cp;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   476
    GetModuleFileName(0, buf, bufsize);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   477
    *strrchr(buf, '\\') = '\0'; /* remove .exe file name */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   478
    if ((cp = strrchr(buf, '\\')) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   479
        /* This happens if the application is in a drive root, and
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   480
         * there is no bin directory. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   481
        buf[0] = '\0';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   482
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   483
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   484
    *cp = '\0';  /* remove the bin\ part */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   485
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   486
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   487
#else /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   488
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   489
    /* gamma launcher uses JAVA_HOME or ALT_JAVA_HOME environment variable to find JDK/JRE */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   490
    char* java_home_var = getenv("ALT_JAVA_HOME");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   491
    if (java_home_var == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   492
       java_home_var = getenv("JAVA_HOME");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   493
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   494
    if (java_home_var == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   495
       printf("JAVA_HOME or ALT_JAVA_HOME must point to a valid JDK/JRE to run gamma\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   496
       return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   497
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   498
    snprintf(buf, bufsize, "%s", java_home_var);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   499
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   500
#endif /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   501
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   502
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   503
#ifdef JAVAW
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   504
__declspec(dllimport) char **__initenv;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   505
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   506
int WINAPI
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   507
WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   508
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   509
    int   ret;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   510
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   511
    __initenv = _environ;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   512
    ret = main(__argc, __argv);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   513
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   514
    return ret;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   515
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   516
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   517
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   518
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   519
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   520
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   521
 * Helpers to look in the registry for a public JRE.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   522
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   523
                    /* Same for 1.5.0, 1.5.1, 1.5.2 etc. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   524
#define DOTRELEASE  JDK_MAJOR_VERSION "." JDK_MINOR_VERSION
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   525
#define JRE_KEY     "Software\\JavaSoft\\Java Runtime Environment"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   526
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   527
static jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   528
GetStringFromRegistry(HKEY key, const char *name, char *buf, jint bufsize)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   529
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   530
    DWORD type, size;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   531
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   532
    if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   533
        && type == REG_SZ
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   534
        && (size < (unsigned int)bufsize)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   535
        if (RegQueryValueEx(key, name, 0, 0, buf, &size) == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   536
            return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   537
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   538
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   539
    return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   540
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   541
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   542
static jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   543
GetPublicJREHome(char *buf, jint bufsize)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   544
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   545
    HKEY key, subkey;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   546
    char version[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   547
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   548
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   549
     * Note: There is a very similar implementation of the following
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   550
     * registry reading code in the Windows java control panel (javacp.cpl).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   551
     * If there are bugs here, a similar bug probably exists there.  Hence,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   552
     * changes here require inspection there.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   553
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   554
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   555
    /* Find the current version of the JRE */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   556
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, JRE_KEY, 0, KEY_READ, &key) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   557
        fprintf(stderr, "Error opening registry key '" JRE_KEY "'\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   558
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   559
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   560
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   561
    if (!GetStringFromRegistry(key, "CurrentVersion",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   562
                               version, sizeof(version))) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   563
        fprintf(stderr, "Failed reading value of registry key:\n\t"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   564
                JRE_KEY "\\CurrentVersion\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   565
        RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   566
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   567
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   568
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   569
    if (strcmp(version, DOTRELEASE) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   570
        fprintf(stderr, "Registry key '" JRE_KEY "\\CurrentVersion'\nhas "
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   571
                "value '%s', but '" DOTRELEASE "' is required.\n", version);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   572
        RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   573
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   574
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   575
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   576
    /* Find directory where the current version is installed. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   577
    if (RegOpenKeyEx(key, version, 0, KEY_READ, &subkey) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   578
        fprintf(stderr, "Error opening registry key '"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   579
                JRE_KEY "\\%s'\n", version);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   580
        RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   581
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   582
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   583
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   584
    if (!GetStringFromRegistry(subkey, "JavaHome", buf, bufsize)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   585
        fprintf(stderr, "Failed reading value of registry key:\n\t"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   586
                JRE_KEY "\\%s\\JavaHome\n", version);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   587
        RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   588
        RegCloseKey(subkey);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   589
        return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   590
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   591
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   592
    if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   593
        char micro[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   594
        if (!GetStringFromRegistry(subkey, "MicroVersion", micro,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   595
                                   sizeof(micro))) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   596
            printf("Warning: Can't read MicroVersion\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   597
            micro[0] = '\0';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   598
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   599
        printf("Version major.minor.micro = %s.%s\n", version, micro);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   600
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   601
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   602
    RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   603
    RegCloseKey(subkey);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   604
    return JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   605
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   606
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   607
#endif /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   608
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   609
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   610
 * Support for doing cheap, accurate interval timing.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   611
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   612
static jboolean counterAvailable = JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   613
static jboolean counterInitialized = JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   614
static LARGE_INTEGER counterFrequency;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   615
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   616
jlong CounterGet()
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   617
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   618
    LARGE_INTEGER count;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   619
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   620
    if (!counterInitialized) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   621
        counterAvailable = QueryPerformanceFrequency(&counterFrequency);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   622
        counterInitialized = JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   623
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   624
    if (!counterAvailable) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   625
        return 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   626
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   627
    QueryPerformanceCounter(&count);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   628
    return (jlong)(count.QuadPart);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   629
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   630
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   631
jlong Counter2Micros(jlong counts)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   632
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   633
    if (!counterAvailable || !counterInitialized) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   634
        return 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   635
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   636
    return (counts * 1000 * 1000)/counterFrequency.QuadPart;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   637
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   638
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   639
void ReportErrorMessage(char * message, jboolean always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   640
#ifdef JAVAW
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   641
  if (message != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   642
    MessageBox(NULL, message, "Java Virtual Machine Launcher",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   643
               (MB_OK|MB_ICONSTOP|MB_APPLMODAL));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   644
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   645
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   646
  if (always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   647
    fprintf(stderr, "%s\n", message);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   648
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   649
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   650
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   651
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   652
void ReportErrorMessage2(char * format, char * string, jboolean always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   653
  /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   654
   * The format argument must be a printf format string with one %s
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   655
   * argument, which is passed the string argument.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   656
   */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   657
#ifdef JAVAW
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   658
  size_t size;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   659
  char * message;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   660
  size = strlen(format) + strlen(string);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   661
  message = (char*)JLI_MemAlloc(size*sizeof(char));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   662
  sprintf(message, (const char *)format, string);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   663
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   664
  if (message != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   665
    MessageBox(NULL, message, "Java Virtual Machine Launcher",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   666
               (MB_OK|MB_ICONSTOP|MB_APPLMODAL));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   667
    JLI_MemFree(message);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   668
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   669
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   670
  if (always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   671
    fprintf(stderr, (const char *)format, string);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   672
    fprintf(stderr, "\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   673
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   674
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   675
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   676
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   677
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   678
 * As ReportErrorMessage2 (above) except the system message (if any)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   679
 * associated with this error is written to a second %s format specifier
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   680
 * in the format argument.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   681
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   682
void ReportSysErrorMessage2(char * format, char * string, jboolean always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   683
  int   save_errno = errno;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   684
  DWORD errval;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   685
  int   freeit = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   686
  char  *errtext = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   687
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   688
  if ((errval = GetLastError()) != 0) {         /* Platform SDK / DOS Error */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   689
    int n = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   690
      FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   691
      NULL, errval, 0, (LPTSTR)&errtext, 0, NULL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   692
    if (errtext == NULL || n == 0) {            /* Paranoia check */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   693
      errtext = "";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   694
      n = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   695
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   696
      freeit = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   697
      if (n > 2) {                              /* Drop final CR, LF */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   698
        if (errtext[n - 1] == '\n') n--;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   699
        if (errtext[n - 1] == '\r') n--;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   700
        errtext[n] = '\0';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   701
      }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   702
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   703
  } else        /* C runtime error that has no corresponding DOS error code */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   704
    errtext = strerror(save_errno);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   705
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   706
#ifdef JAVAW
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   707
  {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   708
    size_t size;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   709
    char * message;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   710
    size = strlen(format) + strlen(string) + strlen(errtext);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   711
    message = (char*)JLI_MemAlloc(size*sizeof(char));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   712
    sprintf(message, (const char *)format, string, errtext);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   713
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   714
    if (message != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   715
      MessageBox(NULL, message, "Java Virtual Machine Launcher",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   716
               (MB_OK|MB_ICONSTOP|MB_APPLMODAL));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   717
      JLI_MemFree(message);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   718
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   719
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   720
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   721
  if (always) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   722
    fprintf(stderr, (const char *)format, string, errtext);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   723
    fprintf(stderr, "\n");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   724
  }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   725
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   726
  if (freeit)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   727
    (void)LocalFree((HLOCAL)errtext);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   728
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   729
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   730
void  ReportExceptionDescription(JNIEnv * env) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   731
#ifdef JAVAW
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   732
  /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   733
   * This code should be replaced by code which opens a window with
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   734
   * the exception detail message.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   735
   */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   736
  (*env)->ExceptionDescribe(env);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   737
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   738
  (*env)->ExceptionDescribe(env);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   739
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   740
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   741
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   742
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   743
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   744
 * Return JNI_TRUE for an option string that has no effect but should
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   745
 * _not_ be passed on to the vm; return JNI_FALSE otherwise. On
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   746
 * windows, there are no options that should be screened in this
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   747
 * manner.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   748
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   749
jboolean RemovableMachineDependentOption(char * option) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   750
#ifdef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   751
    if (awtPreloadD3D < 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   752
        /* Tests the command line parameter only if not set yet. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   753
        if (GetBoolParamValue(PARAM_PRELOAD_D3D, option) == 1) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   754
            awtPreloadD3D = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   755
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   756
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   757
    if (awtPreloadD3D != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   758
        /* Don't test the command line parameters if already disabled. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   759
        if (GetBoolParamValue(PARAM_NODDRAW, option) == 1
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   760
            || GetBoolParamValue(PARAM_D3D, option) == 0
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   761
            || GetBoolParamValue(PARAM_OPENGL, option) == 1)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   762
        {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   763
            awtPreloadD3D = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   764
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   765
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   766
#endif /* ENABLE_AWT_PRELOAD */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   767
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   768
    return JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   769
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   770
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   771
void PrintMachineDependentOptions() {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   772
  return;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   773
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   774
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   775
#ifndef GAMMA
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   776
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   777
jboolean
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   778
ServerClassMachine() {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   779
  jboolean result = JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   780
#if   defined(NEVER_ACT_AS_SERVER_CLASS_MACHINE)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   781
  result = JNI_FALSE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   782
#elif defined(ALWAYS_ACT_AS_SERVER_CLASS_MACHINE)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   783
  result = JNI_TRUE;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   784
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   785
  return result;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   786
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   787
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   788
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   789
 * Determine if there is an acceptable JRE in the registry directory top_key.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   790
 * Upon locating the "best" one, return a fully qualified path to it.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   791
 * "Best" is defined as the most advanced JRE meeting the constraints
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   792
 * contained in the manifest_info. If no JRE in this directory meets the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   793
 * constraints, return NULL.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   794
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   795
 * It doesn't matter if we get an error reading the registry, or we just
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   796
 * don't find anything interesting in the directory.  We just return NULL
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   797
 * in either case.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   798
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   799
static char *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   800
ProcessDir(manifest_info* info, HKEY top_key) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   801
    DWORD   index = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   802
    HKEY    ver_key;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   803
    char    name[MAXNAMELEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   804
    int     len;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   805
    char    *best = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   806
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   807
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   808
     * Enumerate "<top_key>/SOFTWARE/JavaSoft/Java Runtime Environment"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   809
     * searching for the best available version.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   810
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   811
    while (RegEnumKey(top_key, index, name, MAXNAMELEN) == ERROR_SUCCESS) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   812
        index++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   813
        if (JLI_AcceptableRelease(name, info->jre_version))
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   814
            if ((best == NULL) || (JLI_ExactVersionId(name, best) > 0)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   815
                if (best != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   816
                    JLI_MemFree(best);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   817
                best = JLI_StringDup(name);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   818
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   819
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   820
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   821
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   822
     * Extract "JavaHome" from the "best" registry directory and return
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   823
     * that path.  If no appropriate version was located, or there is an
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   824
     * error in extracting the "JavaHome" string, return null.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   825
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   826
    if (best == NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   827
        return (NULL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   828
    else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   829
        if (RegOpenKeyEx(top_key, best, 0, KEY_READ, &ver_key)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   830
          != ERROR_SUCCESS) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   831
            JLI_MemFree(best);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   832
            if (ver_key != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   833
                RegCloseKey(ver_key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   834
            return (NULL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   835
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   836
        JLI_MemFree(best);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   837
        len = MAXNAMELEN;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   838
        if (RegQueryValueEx(ver_key, "JavaHome", NULL, NULL, (LPBYTE)name, &len)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   839
          != ERROR_SUCCESS) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   840
            if (ver_key != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   841
                RegCloseKey(ver_key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   842
            return (NULL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   843
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   844
        if (ver_key != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   845
            RegCloseKey(ver_key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   846
        return (JLI_StringDup(name));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   847
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   848
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   849
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   850
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   851
 * This is the global entry point. It examines the host for the optimal
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   852
 * JRE to be used by scanning a set of registry entries.  This set of entries
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   853
 * is hardwired on Windows as "Software\JavaSoft\Java Runtime Environment"
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   854
 * under the set of roots "{ HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }".
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   855
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   856
 * This routine simply opens each of these registry directories before passing
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   857
 * control onto ProcessDir().
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   858
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   859
char *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   860
LocateJRE(manifest_info* info) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   861
    HKEY    key = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   862
    char    *path;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   863
    int     key_index;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   864
    HKEY    root_keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   865
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   866
    for (key_index = 0; key_index <= 1; key_index++) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   867
        if (RegOpenKeyEx(root_keys[key_index], JRE_KEY, 0, KEY_READ, &key)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   868
          == ERROR_SUCCESS)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   869
            if ((path = ProcessDir(info, key)) != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   870
                if (key != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   871
                    RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   872
                return (path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   873
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   874
        if (key != NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   875
            RegCloseKey(key);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   876
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   877
    return NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   878
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   879
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   880
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   881
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   882
 * Local helper routine to isolate a single token (option or argument)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   883
 * from the command line.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   884
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   885
 * This routine accepts a pointer to a character pointer.  The first
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   886
 * token (as defined by MSDN command-line argument syntax) is isolated
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   887
 * from that string.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   888
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   889
 * Upon return, the input character pointer pointed to by the parameter s
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   890
 * is updated to point to the remainding, unscanned, portion of the string,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   891
 * or to a null character if the entire string has been consummed.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   892
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   893
 * This function returns a pointer to a null-terminated string which
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   894
 * contains the isolated first token, or to the null character if no
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   895
 * token could be isolated.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   896
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   897
 * Note the side effect of modifying the input string s by the insertion
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   898
 * of a null character, making it two strings.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   899
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   900
 * See "Parsing C Command-Line Arguments" in the MSDN Library for the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   901
 * parsing rule details.  The rule summary from that specification is:
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   902
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   903
 *  * Arguments are delimited by white space, which is either a space or a tab.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   904
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   905
 *  * A string surrounded by double quotation marks is interpreted as a single
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   906
 *    argument, regardless of white space contained within. A quoted string can
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   907
 *    be embedded in an argument. Note that the caret (^) is not recognized as
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   908
 *    an escape character or delimiter.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   909
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   910
 *  * A double quotation mark preceded by a backslash, \", is interpreted as a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   911
 *    literal double quotation mark (").
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   912
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   913
 *  * Backslashes are interpreted literally, unless they immediately precede a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   914
 *    double quotation mark.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   915
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   916
 *  * If an even number of backslashes is followed by a double quotation mark,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   917
 *    then one backslash (\) is placed in the argv array for every pair of
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   918
 *    backslashes (\\), and the double quotation mark (") is interpreted as a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   919
 *    string delimiter.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   920
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   921
 *  * If an odd number of backslashes is followed by a double quotation mark,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   922
 *    then one backslash (\) is placed in the argv array for every pair of
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   923
 *    backslashes (\\) and the double quotation mark is interpreted as an
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   924
 *    escape sequence by the remaining backslash, causing a literal double
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   925
 *    quotation mark (") to be placed in argv.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   926
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   927
static char*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   928
nextarg(char** s) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   929
    char    *p = *s;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   930
    char    *head;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   931
    int     slashes = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   932
    int     inquote = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   933
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   934
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   935
     * Strip leading whitespace, which MSDN defines as only space or tab.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   936
     * (Hence, no locale specific "isspace" here.)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   937
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   938
    while (*p != (char)0 && (*p == ' ' || *p == '\t'))
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   939
        p++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   940
    head = p;                   /* Save the start of the token to return */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   941
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   942
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   943
     * Isolate a token from the command line.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   944
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   945
    while (*p != (char)0 && (inquote || !(*p == ' ' || *p == '\t'))) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   946
        if (*p == '\\' && *(p+1) == '"' && slashes % 2 == 0)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   947
            p++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   948
        else if (*p == '"')
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   949
            inquote = !inquote;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   950
        slashes = (*p++ == '\\') ? slashes + 1 : 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   951
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   952
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   953
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   954
     * If the token isolated isn't already terminated in a "char zero",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   955
     * then replace the whitespace character with one and move to the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   956
     * next character.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   957
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   958
    if (*p != (char)0)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   959
        *p++ = (char)0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   960
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   961
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   962
     * Update the parameter to point to the head of the remaining string
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   963
     * reflecting the command line and return a pointer to the leading
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   964
     * token which was isolated from the command line.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   965
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   966
    *s = p;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   967
    return (head);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   968
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   969
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   970
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   971
 * Local helper routine to return a string equivalent to the input string
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   972
 * s, but with quotes removed so the result is a string as would be found
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   973
 * in argv[].  The returned string should be freed by a call to JLI_MemFree().
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   974
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   975
 * The rules for quoting (and escaped quotes) are:
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   976
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   977
 *  1 A double quotation mark preceded by a backslash, \", is interpreted as a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   978
 *    literal double quotation mark (").
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   979
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   980
 *  2 Backslashes are interpreted literally, unless they immediately precede a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   981
 *    double quotation mark.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   982
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   983
 *  3 If an even number of backslashes is followed by a double quotation mark,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   984
 *    then one backslash (\) is placed in the argv array for every pair of
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   985
 *    backslashes (\\), and the double quotation mark (") is interpreted as a
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   986
 *    string delimiter.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   987
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   988
 *  4 If an odd number of backslashes is followed by a double quotation mark,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   989
 *    then one backslash (\) is placed in the argv array for every pair of
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   990
 *    backslashes (\\) and the double quotation mark is interpreted as an
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   991
 *    escape sequence by the remaining backslash, causing a literal double
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   992
 *    quotation mark (") to be placed in argv.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   993
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   994
static char*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   995
unquote(const char *s) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   996
    const char *p = s;          /* Pointer to the tail of the original string */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   997
    char *un = (char*)JLI_MemAlloc(strlen(s) + 1);  /* Ptr to unquoted string */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   998
    char *pun = un;             /* Pointer to the tail of the unquoted string */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
   999
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1000
    while (*p != '\0') {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1001
        if (*p == '"') {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1002
            p++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1003
        } else if (*p == '\\') {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1004
            const char *q = p + strspn(p,"\\");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1005
            if (*q == '"')
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1006
                do {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1007
                    *pun++ = '\\';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1008
                    p += 2;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1009
                 } while (*p == '\\' && p < q);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1010
            else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1011
                while (p < q)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1012
                    *pun++ = *p++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1013
        } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1014
            *pun++ = *p++;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1015
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1016
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1017
    *pun = '\0';
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1018
    return un;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1019
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1020
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1021
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1022
 * Given a path to a jre to execute, this routine checks if this process
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1023
 * is indeed that jre.  If not, it exec's that jre.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1024
 *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1025
 * We want to actually check the paths rather than just the version string
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1026
 * built into the executable, so that given version specification will yield
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1027
 * the exact same Java environment, regardless of the version of the arbitrary
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1028
 * launcher we start with.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1029
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1030
void
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1031
ExecJRE(char *jre, char **argv) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1032
    int     len;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1033
    char    *progname;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1034
    char    path[MAXPATHLEN + 1];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1035
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1036
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1037
     * Determine the executable we are building (or in the rare case, running).
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1038
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1039
#ifdef JAVA_ARGS  /* javac, jar and friends. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1040
    progname = "java";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1041
#else             /* java, oldjava, javaw and friends */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1042
#ifdef PROGNAME
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1043
    progname = PROGNAME;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1044
#else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1045
    {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1046
        char *s;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1047
        progname = *argv;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1048
        if ((s = strrchr(progname, FILE_SEPARATOR)) != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1049
            progname = s + 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1050
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1051
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1052
#endif /* PROGNAME */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1053
#endif /* JAVA_ARGS */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1054
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1055
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1056
     * Resolve the real path to the currently running launcher.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1057
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1058
    len = GetModuleFileName(NULL, path, MAXPATHLEN + 1);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1059
    if (len == 0 || len > MAXPATHLEN) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1060
        ReportSysErrorMessage2(
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1061
          "Unable to resolve path to current %s executable: %s",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1062
          progname, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1063
        exit(1);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1064
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1065
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1066
    if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1067
        printf("ExecJRE: old: %s\n", path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1068
        printf("ExecJRE: new: %s\n", jre);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1069
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1070
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1071
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1072
     * If the path to the selected JRE directory is a match to the initial
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1073
     * portion of the path to the currently executing JRE, we have a winner!
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1074
     * If so, just return. (strnicmp() is the Windows equiv. of strncasecmp().)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1075
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1076
    if (strnicmp(jre, path, strlen(jre)) == 0)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1077
        return;                 /* I am the droid you were looking for */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1078
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1079
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1080
     * If this isn't the selected version, exec the selected version.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1081
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1082
    (void)strcat(strcat(strcpy(path, jre), "\\bin\\"), progname);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1083
    (void)strcat(path, ".exe");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1084
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1085
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1086
     * Although Windows has an execv() entrypoint, it doesn't actually
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1087
     * overlay a process: it can only create a new process and terminate
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1088
     * the old process.  Therefore, any processes waiting on the initial
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1089
     * process wake up and they shouldn't.  Hence, a chain of pseudo-zombie
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1090
     * processes must be retained to maintain the proper wait semantics.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1091
     * Fortunately the image size of the launcher isn't too large at this
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1092
     * time.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1093
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1094
     * If it weren't for this semantic flaw, the code below would be ...
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1095
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1096
     *     execv(path, argv);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1097
     *     ReportErrorMessage2("Exec of %s failed\n", path, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1098
     *     exit(1);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1099
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1100
     * The incorrect exec semantics could be addressed by:
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1101
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1102
     *     exit((int)spawnv(_P_WAIT, path, argv));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1103
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1104
     * Unfortunately, a bug in Windows spawn/exec impementation prevents
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1105
     * this from completely working.  All the Windows POSIX process creation
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1106
     * interfaces are implemented as wrappers around the native Windows
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1107
     * function CreateProcess().  CreateProcess() takes a single string
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1108
     * to specify command line options and arguments, so the POSIX routine
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1109
     * wrappers build a single string from the argv[] array and in the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1110
     * process, any quoting information is lost.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1111
     *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1112
     * The solution to this to get the original command line, to process it
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1113
     * to remove the new multiple JRE options (if any) as was done for argv
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1114
     * in the common SelectVersion() routine and finally to pass it directly
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1115
     * to the native CreateProcess() Windows process control interface.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1116
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1117
    {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1118
        char    *cmdline;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1119
        char    *p;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1120
        char    *np;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1121
        char    *ocl;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1122
        char    *ccl;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1123
        char    *unquoted;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1124
        DWORD   exitCode;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1125
        STARTUPINFO si;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1126
        PROCESS_INFORMATION pi;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1127
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1128
        /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1129
         * The following code block gets and processes the original command
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1130
         * line, replacing the argv[0] equivalent in the command line with
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1131
         * the path to the new executable and removing the appropriate
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1132
         * Multiple JRE support options. Note that similar logic exists
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1133
         * in the platform independent SelectVersion routine, but is
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1134
         * replicated here due to the syntax of CreateProcess().
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1135
         *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1136
         * The magic "+ 4" characters added to the command line length are
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1137
         * 2 possible quotes around the path (argv[0]), a space after the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1138
         * path and a terminating null character.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1139
         */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1140
        ocl = GetCommandLine();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1141
        np = ccl = JLI_StringDup(ocl);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1142
        p = nextarg(&np);               /* Discard argv[0] */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1143
        cmdline = (char *)JLI_MemAlloc(strlen(path) + strlen(np) + 4);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1144
        if (strchr(path, (int)' ') == NULL && strchr(path, (int)'\t') == NULL)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1145
            cmdline = strcpy(cmdline, path);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1146
        else
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1147
            cmdline = strcat(strcat(strcpy(cmdline, "\""), path), "\"");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1148
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1149
        while (*np != (char)0) {                /* While more command-line */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1150
            p = nextarg(&np);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1151
            if (*p != (char)0) {                /* If a token was isolated */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1152
                unquoted = unquote(p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1153
                if (*unquoted == '-') {         /* Looks like an option */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1154
                    if (strcmp(unquoted, "-classpath") == 0 ||
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1155
                      strcmp(unquoted, "-cp") == 0) {   /* Unique cp syntax */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1156
                        cmdline = strcat(strcat(cmdline, " "), p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1157
                        p = nextarg(&np);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1158
                        if (*p != (char)0)      /* If a token was isolated */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1159
                            cmdline = strcat(strcat(cmdline, " "), p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1160
                    } else if (strncmp(unquoted, "-version:", 9) != 0 &&
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1161
                      strcmp(unquoted, "-jre-restrict-search") != 0 &&
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1162
                      strcmp(unquoted, "-no-jre-restrict-search") != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1163
                        cmdline = strcat(strcat(cmdline, " "), p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1164
                    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1165
                } else {                        /* End of options */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1166
                    cmdline = strcat(strcat(cmdline, " "), p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1167
                    cmdline = strcat(strcat(cmdline, " "), np);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1168
                    JLI_MemFree((void *)unquoted);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1169
                    break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1170
                }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1171
                JLI_MemFree((void *)unquoted);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1172
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1173
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1174
        JLI_MemFree((void *)ccl);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1175
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1176
        if (_launcher_debug) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1177
            np = ccl = JLI_StringDup(cmdline);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1178
            p = nextarg(&np);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1179
            printf("ReExec Command: %s (%s)\n", path, p);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1180
            printf("ReExec Args: %s\n", np);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1181
            JLI_MemFree((void *)ccl);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1182
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1183
        (void)fflush(stdout);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1184
        (void)fflush(stderr);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1185
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1186
        /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1187
         * The following code is modeled after a model presented in the
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1188
         * Microsoft Technical Article "Moving Unix Applications to
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1189
         * Windows NT" (March 6, 1994) and "Creating Processes" on MSDN
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1190
         * (Februrary 2005).  It approximates UNIX spawn semantics with
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1191
         * the parent waiting for termination of the child.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1192
         */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1193
        memset(&si, 0, sizeof(si));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1194
        si.cb =sizeof(STARTUPINFO);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1195
        memset(&pi, 0, sizeof(pi));
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1196
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1197
        if (!CreateProcess((LPCTSTR)path,       /* executable name */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1198
          (LPTSTR)cmdline,                      /* command line */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1199
          (LPSECURITY_ATTRIBUTES)NULL,          /* process security attr. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1200
          (LPSECURITY_ATTRIBUTES)NULL,          /* thread security attr. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1201
          (BOOL)TRUE,                           /* inherits system handles */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1202
          (DWORD)0,                             /* creation flags */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1203
          (LPVOID)NULL,                         /* environment block */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1204
          (LPCTSTR)NULL,                        /* current directory */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1205
          (LPSTARTUPINFO)&si,                   /* (in) startup information */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1206
          (LPPROCESS_INFORMATION)&pi)) {        /* (out) process information */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1207
            ReportSysErrorMessage2("CreateProcess(%s, ...) failed: %s",
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1208
              path, JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1209
              exit(1);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1210
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1211
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1212
        if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_FAILED) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1213
            if (GetExitCodeProcess(pi.hProcess, &exitCode) == FALSE)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1214
                exitCode = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1215
        } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1216
            ReportErrorMessage("WaitForSingleObject() failed.", JNI_TRUE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1217
            exitCode = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1218
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1219
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1220
        CloseHandle(pi.hThread);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1221
        CloseHandle(pi.hProcess);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1222
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1223
        exit(exitCode);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1224
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1225
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1226
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1227
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1228
#endif /* ifndef GAMMA */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1229
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1230
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1231
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1232
 * Wrapper for platform dependent unsetenv function.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1233
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1234
int
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1235
UnsetEnv(char *name)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1236
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1237
    int ret;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1238
    char *buf = JLI_MemAlloc(strlen(name) + 2);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1239
    buf = strcat(strcpy(buf, name), "=");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1240
    ret = _putenv(buf);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1241
    JLI_MemFree(buf);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1242
    return (ret);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1243
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1244
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1245
/* --- Splash Screen shared library support --- */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1246
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1247
static const char* SPLASHSCREEN_SO = "\\bin\\splashscreen.dll";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1248
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1249
static HMODULE hSplashLib = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1250
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1251
void* SplashProcAddress(const char* name) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1252
    char libraryPath[MAXPATHLEN]; /* some extra space for strcat'ing SPLASHSCREEN_SO */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1253
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1254
    if (!GetJREPath(libraryPath, MAXPATHLEN)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1255
        return NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1256
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1257
    if (strlen(libraryPath)+strlen(SPLASHSCREEN_SO) >= MAXPATHLEN) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1258
        return NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1259
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1260
    strcat(libraryPath, SPLASHSCREEN_SO);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1261
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1262
    if (!hSplashLib) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1263
        hSplashLib = LoadLibrary(libraryPath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1264
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1265
    if (hSplashLib) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1266
        return GetProcAddress(hSplashLib, name);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1267
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1268
        return NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1269
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1270
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1271
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1272
void SplashFreeLibrary() {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1273
    if (hSplashLib) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1274
        FreeLibrary(hSplashLib);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1275
        hSplashLib = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1276
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1277
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1278
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1279
const char *
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1280
jlong_format_specifier() {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1281
    return "%I64d";
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1282
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1283
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1284
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1285
 * Block current thread and continue execution in a new thread
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1286
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1287
int
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1288
ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1289
    int rslt = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1290
    unsigned thread_id;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1291
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1292
#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1293
#define STACK_SIZE_PARAM_IS_A_RESERVATION  (0x10000)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1294
#endif
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1295
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1296
    /*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1297
     * STACK_SIZE_PARAM_IS_A_RESERVATION is what we want, but it's not
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1298
     * supported on older version of Windows. Try first with the flag; and
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1299
     * if that fails try again without the flag. See MSDN document or HotSpot
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1300
     * source (os_win32.cpp) for details.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1301
     */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1302
    HANDLE thread_handle =
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1303
      (HANDLE)_beginthreadex(NULL,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1304
                             (unsigned)stack_size,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1305
                             continuation,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1306
                             args,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1307
                             STACK_SIZE_PARAM_IS_A_RESERVATION,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1308
                             &thread_id);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1309
    if (thread_handle == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1310
      thread_handle =
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1311
      (HANDLE)_beginthreadex(NULL,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1312
                             (unsigned)stack_size,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1313
                             continuation,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1314
                             args,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1315
                             0,
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1316
                             &thread_id);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1317
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1318
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1319
    /* AWT preloading (AFTER main thread start) */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1320
#ifdef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1321
    /* D3D preloading */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1322
    if (awtPreloadD3D != 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1323
        char *envValue;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1324
        /* D3D routines checks env.var J2D_D3D if no appropriate
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1325
         * command line params was specified
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1326
         */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1327
        envValue = getenv("J2D_D3D");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1328
        if (envValue != NULL && stricmp(envValue, "false") == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1329
            awtPreloadD3D = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1330
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1331
        /* Test that AWT preloading isn't disabled by J2D_D3D_PRELOAD env.var */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1332
        envValue = getenv("J2D_D3D_PRELOAD");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1333
        if (envValue != NULL && stricmp(envValue, "false") == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1334
            awtPreloadD3D = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1335
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1336
        if (awtPreloadD3D < 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1337
            /* If awtPreloadD3D is still undefined (-1), test
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1338
             * if it is turned on by J2D_D3D_PRELOAD env.var.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1339
             * By default it's turned OFF.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1340
             */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1341
            awtPreloadD3D = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1342
            if (envValue != NULL && stricmp(envValue, "true") == 0) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1343
                awtPreloadD3D = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1344
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1345
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1346
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1347
    if (awtPreloadD3D) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1348
        AWTPreload(D3D_PRELOAD_FUNC);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1349
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1350
#endif /* ENABLE_AWT_PRELOAD */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1351
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1352
    if (thread_handle) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1353
      WaitForSingleObject(thread_handle, INFINITE);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1354
      GetExitCodeThread(thread_handle, &rslt);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1355
      CloseHandle(thread_handle);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1356
    } else {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1357
      rslt = continuation(args);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1358
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1359
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1360
#ifdef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1361
    if (awtPreloaded) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1362
        AWTPreloadStop();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1363
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1364
#endif /* ENABLE_AWT_PRELOAD */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1365
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1366
    return rslt;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1367
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1368
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1369
/* Linux only, empty on windows. */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1370
void SetJavaLauncherPlatformProps() {}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1371
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1372
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1373
//==============================
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1374
// AWT preloading
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1375
#ifdef ENABLE_AWT_PRELOAD
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1376
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1377
typedef int FnPreloadStart(void);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1378
typedef void FnPreloadStop(void);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1379
static FnPreloadStop *fnPreloadStop = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1380
static HMODULE hPreloadAwt = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1381
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1382
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1383
 * Starts AWT preloading
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1384
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1385
int AWTPreload(const char *funcName)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1386
{
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1387
    int result = -1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1388
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1389
    // load AWT library once (if several preload function should be called)
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1390
    if (hPreloadAwt == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1391
        // awt.dll is not loaded yet
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1392
        char libraryPath[MAXPATHLEN];
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1393
        int jrePathLen = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1394
        HMODULE hJava = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1395
        HMODULE hVerify = NULL;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1396
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1397
        while (1) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1398
            // awt.dll depends on jvm.dll & java.dll;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1399
            // jvm.dll is already loaded, so we need only java.dll;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1400
            // java.dll depends on MSVCRT lib & verify.dll.
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1401
            if (!GetJREPath(libraryPath, MAXPATHLEN)) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1402
                break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1403
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1404
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1405
            // save path length
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1406
            jrePathLen = strlen(libraryPath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1407
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1408
            // load msvcrt 1st
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1409
            LoadMSVCRT();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1410
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1411
            // load verify.dll
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1412
            strcat(libraryPath, "\\bin\\verify.dll");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1413
            hVerify = LoadLibrary(libraryPath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1414
            if (hVerify == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1415
                break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1416
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1417
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1418
            // restore jrePath
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1419
            libraryPath[jrePathLen] = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1420
            // load java.dll
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1421
            strcat(libraryPath, "\\bin\\" JAVA_DLL);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1422
            hJava = LoadLibrary(libraryPath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1423
            if (hJava == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1424
                break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1425
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1426
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1427
            // restore jrePath
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1428
            libraryPath[jrePathLen] = 0;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1429
            // load awt.dll
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1430
            strcat(libraryPath, "\\bin\\awt.dll");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1431
            hPreloadAwt = LoadLibrary(libraryPath);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1432
            if (hPreloadAwt == NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1433
                break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1434
            }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1435
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1436
            // get "preloadStop" func ptr
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1437
            fnPreloadStop = (FnPreloadStop *)GetProcAddress(hPreloadAwt, "preloadStop");
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1438
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1439
            break;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1440
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1441
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1442
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1443
    if (hPreloadAwt != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1444
        FnPreloadStart *fnInit = (FnPreloadStart *)GetProcAddress(hPreloadAwt, funcName);
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1445
        if (fnInit != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1446
            // don't forget to stop preloading
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1447
            awtPreloaded = 1;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1448
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1449
            result = fnInit();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1450
        }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1451
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1452
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1453
    return result;
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1454
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1455
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1456
/*
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1457
 * Terminates AWT preloading
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1458
 */
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1459
void AWTPreloadStop() {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1460
    if (fnPreloadStop != NULL) {
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1461
        fnPreloadStop();
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1462
    }
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1463
}
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1464
f5b282e7a7a6 6981484: Update development launcher
sla
parents:
diff changeset
  1465
#endif /* ENABLE_AWT_PRELOAD */