annotate src/os/posix/launcher/java_md.c @ 3095:d3d00c1ea071

IdealGraphVisualizer: Enhance text view so it can display arbitrary properties from the active graph's group. For diff graphs, it shows the textual difference between the property strings using the NetBeans Diff module.
author Peter Hofer <peter.hofer@jku.at>
date Wed, 29 Jun 2011 17:33:35 +0200
parents e58d06a8037e
children f08d439fab8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1985
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
4 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
7 * published by the Free Software Foundation.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
8 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
13 * accompanied this code).
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
14 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
18 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
21 * questions.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
22 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
23 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
24
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
25
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
26 #include "java.h"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
27 #include <dirent.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
28 #include <dlfcn.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
29 #include <fcntl.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
30 #include <inttypes.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
31 #include <stdio.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
32 #include <string.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
33 #include <stdlib.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
34 #include <limits.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
35 #include <sys/stat.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
36 #include <unistd.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
37 #include <sys/types.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
38
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
39 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
40 #include "manifest_info.h"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
41 #include "version_comp.h"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
42 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
43
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
44 #ifdef __linux__
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
45 #include <pthread.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
46 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
47 #include <thread.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
48 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
49
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
50 #define JVM_DLL "libjvm.so"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
51 #define JAVA_DLL "libjava.so"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
52
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
53 #ifndef GAMMA /* launcher.make defines ARCH */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
54 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
55 * If a processor / os combination has the ability to run binaries of
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
56 * two data models and cohabitation of jre/jdk bits with both data
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
57 * models is supported, then DUAL_MODE is defined. When DUAL_MODE is
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
58 * defined, the architecture names for the narrow and wide version of
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
59 * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
60 * only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
61 * i586/amd64 could be defined as DUAL_MODE but that is not the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
62 * current policy.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
63 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
65 #ifndef LIBARCHNAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
66 # error "The macro LIBARCHNAME was not defined on the compile line"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
67 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
68
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
69 #ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
70 # define DUAL_MODE
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
71 # ifndef LIBARCH32NAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
72 # error "The macro LIBARCH32NAME was not defined on the compile line"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
73 # endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
74 # ifndef LIBARCH64NAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
75 # error "The macro LIBARCH64NAME was not defined on the compile line"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
76 # endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
77 # include <sys/systeminfo.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
78 # include <sys/elf.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
79 # include <stdio.h>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
80 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
81
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
82 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
83
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
84 /* pointer to environment */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
85 extern char **environ;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
86
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
87 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
88 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
89 * A collection of useful strings. One should think of these as #define
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
90 * entries, but actual strings can be more efficient (with many compilers).
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
91 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
92 #ifdef __linux__
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
93 static const char *system_dir = "/usr/java";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
94 static const char *user_dir = "/java";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
95 #else /* Solaris */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
96 static const char *system_dir = "/usr/jdk";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
97 static const char *user_dir = "/jdk";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
98 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
99
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
100 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
101
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
102 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
103 * Flowchart of launcher execs and options processing on unix
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
104 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
105 * The selection of the proper vm shared library to open depends on
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
106 * several classes of command line options, including vm "flavor"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
107 * options (-client, -server) and the data model options, -d32 and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
108 * -d64, as well as a version specification which may have come from
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
109 * the command line or from the manifest of an executable jar file.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
110 * The vm selection options are not passed to the running
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
111 * virtual machine; they must be screened out by the launcher.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
112 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
113 * The version specification (if any) is processed first by the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
114 * platform independent routine SelectVersion. This may result in
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
115 * the exec of the specified launcher version.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
116 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
117 * Typically, the launcher execs at least once to ensure a suitable
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
118 * LD_LIBRARY_PATH is in effect for the process. The first exec
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
119 * screens out all the data model options; leaving the choice of data
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
120 * model implicit in the binary selected to run. However, in case no
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
121 * exec is done, the data model options are screened out before the vm
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
122 * is invoked.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
123 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
124 * incoming argv ------------------------------
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
125 * | |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
126 * \|/ |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
127 * CheckJVMType |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
128 * (removes -client, -server, etc.) |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
129 * \|/
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
130 * CreateExecutionEnvironment
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
131 * (removes -d32 and -d64,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
132 * determines desired data model,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
133 * sets up LD_LIBRARY_PATH,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
134 * and exec's)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
135 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
136 * --------------------------------------------
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
137 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
138 * \|/
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
139 * exec child 1 incoming argv -----------------
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
140 * | |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
141 * \|/ |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
142 * CheckJVMType |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
143 * (removes -client, -server, etc.) |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
144 * | \|/
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
145 * | CreateExecutionEnvironment
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
146 * | (verifies desired data model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
147 * | is running and acceptable
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
148 * | LD_LIBRARY_PATH;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
149 * | no-op in child)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
150 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
151 * \|/
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
152 * TranslateDashJArgs...
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
153 * (Prepare to pass args to vm)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
154 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
155 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
156 * |
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
157 * \|/
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
158 * ParseArguments
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
159 * (ignores -d32 and -d64,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
160 * processes version options,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
161 * creates argument list for vm,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
162 * etc.)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
163 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
164 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
165
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
166 static char *SetExecname(char **argv);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
167 static char * GetExecname();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
168 static jboolean GetJVMPath(const char *jrepath, const char *jvmtype,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
169 char *jvmpath, jint jvmpathsize, char * arch);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
170 static jboolean GetJREPath(char *path, jint pathsize, char * arch, jboolean speculative);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
171
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
172 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
173 const char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
174 GetArch()
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
175 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
176 return LIBARCHNAME;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
177 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
178 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
179
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
180 void
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
181 CreateExecutionEnvironment(int *_argcp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
182 char ***_argvp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
183 char jrepath[],
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
184 jint so_jrepath,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
185 char jvmpath[],
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
186 jint so_jvmpath,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
187 char **original_argv) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
188 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
189 * First, determine if we are running the desired data model. If we
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
190 * are running the desired data model, all the error messages
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
191 * associated with calling GetJREPath, ReadKnownVMs, etc. should be
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
192 * output. However, if we are not running the desired data model,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
193 * some of the errors should be suppressed since it is more
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
194 * informative to issue an error message based on whether or not the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
195 * os/processor combination has dual mode capabilities.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
196 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
197
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
198 char *execname = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
199 int original_argc = *_argcp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
200 jboolean jvmpathExists;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
201
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
202 /* Compute the name of the executable */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
203 execname = SetExecname(*_argvp);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
204
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
205 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
206 /* Set the LD_LIBRARY_PATH environment variable, check data model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
207 flags, and exec process, if needed */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
208 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
209 char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
210 char * jvmtype = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
211 int argc = *_argcp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
212 char **argv = original_argv;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
213
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
214 char *runpath = NULL; /* existing effective LD_LIBRARY_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
215 setting */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
216
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
217 int running = /* What data model is being ILP32 =>
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
218 32 bit vm; LP64 => 64 bit vm */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
219 #ifdef _LP64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
220 64;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
221 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
222 32;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
223 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
224
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
225 int wanted = running; /* What data mode is being
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
226 asked for? Current model is
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
227 fine unless another model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
228 is asked for */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
229
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
230 char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
231 char* newpath = NULL; /* path on new LD_LIBRARY_PATH */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
232 char* lastslash = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
233
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
234 char** newenvp = NULL; /* current environment */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
235
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
236 char** newargv = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
237 int newargc = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
238 #ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
239 char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
240 Solaris only */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
241 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
242
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
243 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
244 * Starting in 1.5, all unix platforms accept the -d32 and -d64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
245 * options. On platforms where only one data-model is supported
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
246 * (e.g. ia-64 Linux), using the flag for the other data model is
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
247 * an error and will terminate the program.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
248 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
249
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
250 { /* open new scope to declare local variables */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
251 int i;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
252
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
253 newargv = (char **)JLI_MemAlloc((argc+1) * sizeof(*newargv));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
254 newargv[newargc++] = argv[0];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
255
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
256 /* scan for data model arguments and remove from argument list;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
257 last occurrence determines desired data model */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
258 for (i=1; i < argc; i++) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
259
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
260 if (strcmp(argv[i], "-J-d64") == 0 || strcmp(argv[i], "-d64") == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
261 wanted = 64;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
262 continue;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
263 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
264 if (strcmp(argv[i], "-J-d32") == 0 || strcmp(argv[i], "-d32") == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
265 wanted = 32;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
266 continue;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
267 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
268 newargv[newargc++] = argv[i];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
269
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
270 #ifdef JAVA_ARGS
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
271 if (argv[i][0] != '-')
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
272 continue;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
273 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
274 if (strcmp(argv[i], "-classpath") == 0 || strcmp(argv[i], "-cp") == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
275 i++;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
276 if (i >= argc) break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
277 newargv[newargc++] = argv[i];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
278 continue;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
279 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
280 if (argv[i][0] != '-') { i++; break; }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
281 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
282 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
283
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
284 /* copy rest of args [i .. argc) */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
285 while (i < argc) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
286 newargv[newargc++] = argv[i++];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
287 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
288 newargv[newargc] = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
289
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
290 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
291 * newargv has all proper arguments here
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
292 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
293
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
294 argc = newargc;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
295 argv = newargv;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
296 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
297
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
298 /* If the data model is not changing, it is an error if the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
299 jvmpath does not exist */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
300 if (wanted == running) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
301 /* Find out where the JRE is that we will be using. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
302 if (!GetJREPath(jrepath, so_jrepath, arch, JNI_FALSE) ) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
303 fprintf(stderr, "Error: could not find Java 2 Runtime Environment.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
304 exit(2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
305 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
306
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
307 /* Find the specified JVM type */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
308 if (ReadKnownVMs(jrepath, arch, JNI_FALSE) < 1) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
309 fprintf(stderr, "Error: no known VMs. (check for corrupt jvm.cfg file)\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
310 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
311 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
312
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
313 jvmpath[0] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
314 jvmtype = CheckJvmType(_argcp, _argvp, JNI_FALSE);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
315
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
316 if (!GetJVMPath(jrepath, jvmtype, jvmpath, so_jvmpath, arch )) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
317 fprintf(stderr, "Error: no `%s' JVM at `%s'.\n", jvmtype, jvmpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
318 exit(4);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
319 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
320 } else { /* do the same speculatively or exit */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
321 #ifdef DUAL_MODE
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
322 if (running != wanted) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
323 /* Find out where the JRE is that we will be using. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
324 if (!GetJREPath(jrepath, so_jrepath, ((wanted==64)?LIBARCH64NAME:LIBARCH32NAME), JNI_TRUE)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
325 goto EndDataModelSpeculate;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
326 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
327
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
328 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
329 * Read in jvm.cfg for target data model and process vm
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
330 * selection options.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
331 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
332 if (ReadKnownVMs(jrepath, ((wanted==64)?LIBARCH64NAME:LIBARCH32NAME), JNI_TRUE) < 1) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
333 goto EndDataModelSpeculate;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
334 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
335 jvmpath[0] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
336 jvmtype = CheckJvmType(_argcp, _argvp, JNI_TRUE);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
337 /* exec child can do error checking on the existence of the path */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
338 jvmpathExists = GetJVMPath(jrepath, jvmtype, jvmpath, so_jvmpath,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
339 ((wanted==64)?LIBARCH64NAME:LIBARCH32NAME));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
340
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
341 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
342 EndDataModelSpeculate: /* give up and let other code report error message */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
343 ;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
344 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
345 fprintf(stderr, "Running a %d-bit JVM is not supported on this platform.\n", wanted);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
346 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
347 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
348 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
349
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
350 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
351 * We will set the LD_LIBRARY_PATH as follows:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
352 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
353 * o $JVMPATH (directory portion only)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
354 * o $JRE/lib/$LIBARCHNAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
355 * o $JRE/../lib/$LIBARCHNAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
356 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
357 * followed by the user's previous effective LD_LIBRARY_PATH, if
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
358 * any.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
359 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
360
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
361 #ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
362 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
363 * Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
364 * variables:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
365 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
366 * 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
367 * data-model specific variables are not set.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
368 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
369 * 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
370 * for 64-bit binaries.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
371 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
372 * 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
373 * for 32-bit binaries.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
374 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
375 * The vm uses LD_LIBRARY_PATH to set the java.library.path system
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
376 * property. To shield the vm from the complication of multiple
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
377 * LD_LIBRARY_PATH variables, if the appropriate data model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
378 * specific variable is set, we will act as if LD_LIBRARY_PATH had
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
379 * the value of the data model specific variant and the data model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
380 * specific variant will be unset. Note that the variable for the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
381 * *wanted* data model must be used (if it is set), not simply the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
382 * current running data model.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
383 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
384
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
385 switch(wanted) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
386 case 0:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
387 if(running == 32) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
388 dmpath = getenv("LD_LIBRARY_PATH_32");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
389 wanted = 32;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
390 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
391 else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
392 dmpath = getenv("LD_LIBRARY_PATH_64");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
393 wanted = 64;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
394 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
395 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
396
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
397 case 32:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
398 dmpath = getenv("LD_LIBRARY_PATH_32");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
399 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
400
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
401 case 64:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
402 dmpath = getenv("LD_LIBRARY_PATH_64");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
403 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
404
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
405 default:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
406 fprintf(stderr, "Improper value at line %d.", __LINE__);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
407 exit(1); /* unknown value in wanted */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
408 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
409 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
410
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
411 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
412 * If dmpath is NULL, the relevant data model specific variable is
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
413 * not set and normal LD_LIBRARY_PATH should be used.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
414 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
415 if( dmpath == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
416 runpath = getenv("LD_LIBRARY_PATH");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
417 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
418 else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
419 runpath = dmpath;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
420 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
421 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
422 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
423 * If not on Solaris, assume only a single LD_LIBRARY_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
424 * variable.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
425 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
426 runpath = getenv("LD_LIBRARY_PATH");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
427 #endif /* __sun */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
428
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
429 #ifdef __linux
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
430 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
431 * On linux, if a binary is running as sgid or suid, glibc sets
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
432 * LD_LIBRARY_PATH to the empty string for security purposes. (In
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
433 * contrast, on Solaris the LD_LIBRARY_PATH variable for a
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
434 * privileged binary does not lose its settings; but the dynamic
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
435 * linker does apply more scrutiny to the path.) The launcher uses
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
436 * the value of LD_LIBRARY_PATH to prevent an exec loop.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
437 * Therefore, if we are running sgid or suid, this function's
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
438 * setting of LD_LIBRARY_PATH will be ineffective and we should
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
439 * return from the function now. Getting the right libraries to
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
440 * be found must be handled through other mechanisms.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
441 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
442 if((getgid() != getegid()) || (getuid() != geteuid()) ) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
443 return;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
444 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
445 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
446
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
447 /* runpath contains current effective LD_LIBRARY_PATH setting */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
448
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
449 jvmpath = JLI_StringDup(jvmpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
450 new_runpath = JLI_MemAlloc( ((runpath!=NULL)?strlen(runpath):0) +
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
451 2*strlen(jrepath) + 2*strlen(arch) +
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
452 strlen(jvmpath) + 52);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
453 newpath = new_runpath + strlen("LD_LIBRARY_PATH=");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
454
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
455
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
456 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
457 * Create desired LD_LIBRARY_PATH value for target data model.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
458 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
459 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
460 /* remove the name of the .so from the JVM path */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
461 lastslash = strrchr(jvmpath, '/');
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
462 if (lastslash)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
463 *lastslash = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
464
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
465
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
466 /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
467
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
468 sprintf(new_runpath, "LD_LIBRARY_PATH="
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
469 "%s:"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
470 "%s/lib/%s:"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
471 "%s/../lib/%s",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
472 jvmpath,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
473 #ifdef DUAL_MODE
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
474 jrepath, ((wanted==64)?LIBARCH64NAME:LIBARCH32NAME),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
475 jrepath, ((wanted==64)?LIBARCH64NAME:LIBARCH32NAME)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
476 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
477 jrepath, arch,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
478 jrepath, arch
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
479 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
480 );
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
481
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
482
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
483 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
484 * Check to make sure that the prefix of the current path is the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
485 * desired environment variable setting.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
486 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
487 if (runpath != NULL &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
488 strncmp(newpath, runpath, strlen(newpath))==0 &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
489 (runpath[strlen(newpath)] == 0 || runpath[strlen(newpath)] == ':') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
490 (running == wanted) /* data model does not have to be changed */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
491 #ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
492 && (dmpath == NULL) /* data model specific variables not set */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
493 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
494 ) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
495
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
496 return;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
497
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
498 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
499 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
500
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
501 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
502 * Place the desired environment setting onto the prefix of
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
503 * LD_LIBRARY_PATH. Note that this prevents any possible infinite
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
504 * loop of execv() because we test for the prefix, above.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
505 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
506 if (runpath != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
507 strcat(new_runpath, ":");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
508 strcat(new_runpath, runpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
509 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
510
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
511 if( putenv(new_runpath) != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
512 exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
513 properly */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
514 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
515
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
516 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
517 * Unix systems document that they look at LD_LIBRARY_PATH only
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
518 * once at startup, so we have to re-exec the current executable
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
519 * to get the changed environment variable to have an effect.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
520 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
521
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
522 #ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
523 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
524 * If dmpath is not NULL, remove the data model specific string
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
525 * in the environment for the exec'ed child.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
526 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
527
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
528 if( dmpath != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
529 (void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
530 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
531
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
532 newenvp = environ;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
533
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
534 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
535 char *newexec = execname;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
536 #ifdef DUAL_MODE
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
537 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
538 * If the data model is being changed, the path to the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
539 * executable must be updated accordingly; the executable name
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
540 * and directory the executable resides in are separate. In the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
541 * case of 32 => 64, the new bits are assumed to reside in, e.g.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
542 * "olddir/LIBARCH64NAME/execname"; in the case of 64 => 32,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
543 * the bits are assumed to be in "olddir/../execname". For example,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
544 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
545 * olddir/sparcv9/execname
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
546 * olddir/amd64/execname
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
547 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
548 * for Solaris SPARC and Linux amd64, respectively.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
549 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
550
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
551 if (running != wanted) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
552 char *oldexec = strcpy(JLI_MemAlloc(strlen(execname) + 1), execname);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
553 char *olddir = oldexec;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
554 char *oldbase = strrchr(oldexec, '/');
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
555
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
556
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
557 newexec = JLI_MemAlloc(strlen(execname) + 20);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
558 *oldbase++ = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
559 sprintf(newexec, "%s/%s/%s", olddir,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
560 ((wanted==64) ? LIBARCH64NAME : ".."), oldbase);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
561 argv[0] = newexec;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
562 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
563 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
564
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
565 (void)fflush(stdout);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
566 (void)fflush(stderr);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
567 execve(newexec, argv, newenvp);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
568 perror("execve()");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
569
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
570 fprintf(stderr, "Error trying to exec %s.\n", newexec);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
571 fprintf(stderr, "Check if file exists and permissions are set correctly.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
572
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
573 #ifdef DUAL_MODE
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
574 if (running != wanted) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
575 fprintf(stderr, "Failed to start a %d-bit JVM process from a %d-bit JVM.\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
576 wanted, running);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
577 # ifdef __sun
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
578
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
579 # ifdef __sparc
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
580 fprintf(stderr, "Verify all necessary J2SE components have been installed.\n" );
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
581 fprintf(stderr,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
582 "(Solaris SPARC 64-bit components must be installed after 32-bit components.)\n" );
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
583 # else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
584 fprintf(stderr, "Either 64-bit processes are not supported by this platform\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
585 fprintf(stderr, "or the 64-bit components have not been installed.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
586 # endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
587 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
588 # endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
589 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
590
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
591 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
592
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
593 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
594 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
595
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
596 #else /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
597
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
598 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
599 * gamma launcher is simpler in that it doesn't handle VM flavors, data
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
600 * model, LD_LIBRARY_PATH, etc. Assuming everything is set-up correctly
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
601 * all we need to do here is to return correct path names. See also
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
602 * GetJVMPath() and GetApplicationHome().
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
603 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
604
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
605 { char *arch = (char *) ARCH; /* like sparc or sparcv9 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
606 char *p;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
607
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
608 if (!GetJREPath(jrepath, so_jrepath, arch, JNI_FALSE) ) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
609 fprintf(stderr, "Error: could not find Java 2 Runtime Environment.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
610 exit(2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
611 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
612
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
613 if (!GetJVMPath(jrepath, NULL, jvmpath, so_jvmpath, arch )) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
614 fprintf(stderr, "Error: no JVM at `%s'.\n", jvmpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
615 exit(4);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
616 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
617 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
618
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
619 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
620 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
621
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
622
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
623 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
624 * On Solaris VM choosing is done by the launcher (java.c).
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
625 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
626 static jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
627 GetJVMPath(const char *jrepath, const char *jvmtype,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
628 char *jvmpath, jint jvmpathsize, char * arch)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
629 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
630 struct stat s;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
631
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
632 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
633 if (strchr(jvmtype, '/')) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
634 sprintf(jvmpath, "%s/" JVM_DLL, jvmtype);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
635 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
636 sprintf(jvmpath, "%s/lib/%s/%s/" JVM_DLL, jrepath, arch, jvmtype);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
637 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
638 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
639 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
640 * For gamma launcher, JVM is either built-in or in the same directory.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
641 * Either way we return "<exe_path>/libjvm.so" where <exe_path> is the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
642 * directory where gamma launcher is located.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
643 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
644
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
645 char *p;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
646
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
647 snprintf(jvmpath, jvmpathsize, "%s", GetExecname());
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
648 p = strrchr(jvmpath, '/');
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
649 if (p) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
650 /* replace executable name with libjvm.so */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
651 snprintf(p + 1, jvmpathsize - (p + 1 - jvmpath), "%s", JVM_DLL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
652 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
653 /* this case shouldn't happen */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
654 snprintf(jvmpath, jvmpathsize, "%s", JVM_DLL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
655 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
656 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
657
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
658 if (_launcher_debug)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
659 printf("Does `%s' exist ... ", jvmpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
660
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
661 if (stat(jvmpath, &s) == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
662 if (_launcher_debug)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
663 printf("yes.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
664 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
665 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
666 if (_launcher_debug)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
667 printf("no.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
668 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
669 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
670 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
671
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
672 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
673 * Find path to JRE based on .exe's location or registry settings.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
674 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
675 static jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
676 GetJREPath(char *path, jint pathsize, char * arch, jboolean speculative)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
677 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
678 char libjava[MAXPATHLEN];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
679
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
680 if (GetApplicationHome(path, pathsize)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
681 /* Is JRE co-located with the application? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
682 sprintf(libjava, "%s/lib/%s/" JAVA_DLL, path, arch);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
683 if (access(libjava, F_OK) == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
684 goto found;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
685 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
686
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
687 /* Does the app ship a private JRE in <apphome>/jre directory? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
688 sprintf(libjava, "%s/jre/lib/%s/" JAVA_DLL, path, arch);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
689 if (access(libjava, F_OK) == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
690 strcat(path, "/jre");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
691 goto found;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
692 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
693 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
694
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
695 if (!speculative)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
696 fprintf(stderr, "Error: could not find " JAVA_DLL "\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
697 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
698
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
699 found:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
700 if (_launcher_debug)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
701 printf("JRE path is %s\n", path);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
702 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
703 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
704
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
705 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
706 LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
707 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
708 #ifdef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
709 /* JVM is directly linked with gamma launcher; no dlopen() */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
710 ifn->CreateJavaVM = JNI_CreateJavaVM;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
711 ifn->GetDefaultJavaVMInitArgs = JNI_GetDefaultJavaVMInitArgs;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
712 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
713 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
714 Dl_info dlinfo;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
715 void *libjvm;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
716
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
717 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
718 printf("JVM path is %s\n", jvmpath);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
719 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
720
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
721 libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
722 if (libjvm == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
723 #if defined(__sparc) && !defined(_LP64) /* i.e. 32-bit sparc */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
724 FILE * fp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
725 Elf32_Ehdr elf_head;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
726 int count;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
727 int location;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
728
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
729 fp = fopen(jvmpath, "r");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
730 if(fp == NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
731 goto error;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
732
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
733 /* read in elf header */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
734 count = fread((void*)(&elf_head), sizeof(Elf32_Ehdr), 1, fp);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
735 fclose(fp);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
736 if(count < 1)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
737 goto error;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
738
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
739 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
740 * Check for running a server vm (compiled with -xarch=v8plus)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
741 * on a stock v8 processor. In this case, the machine type in
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
742 * the elf header would not be included the architecture list
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
743 * provided by the isalist command, which is turn is gotten from
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
744 * sysinfo. This case cannot occur on 64-bit hardware and thus
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
745 * does not have to be checked for in binaries with an LP64 data
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
746 * model.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
747 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
748 if(elf_head.e_machine == EM_SPARC32PLUS) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
749 char buf[257]; /* recommended buffer size from sysinfo man
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
750 page */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
751 long length;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
752 char* location;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
753
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
754 length = sysinfo(SI_ISALIST, buf, 257);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
755 if(length > 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
756 location = strstr(buf, "sparcv8plus ");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
757 if(location == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
758 fprintf(stderr, "SPARC V8 processor detected; Server compiler requires V9 or better.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
759 fprintf(stderr, "Use Client compiler on V8 processors.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
760 fprintf(stderr, "Could not create the Java virtual machine.\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
761 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
762 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
763 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
764 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
765 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
766 fprintf(stderr, "dl failure on line %d", __LINE__);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
767 goto error;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
768 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
769
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
770 ifn->CreateJavaVM = (CreateJavaVM_t)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
771 dlsym(libjvm, "JNI_CreateJavaVM");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
772 if (ifn->CreateJavaVM == NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
773 goto error;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
774
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
775 ifn->GetDefaultJavaVMInitArgs = (GetDefaultJavaVMInitArgs_t)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
776 dlsym(libjvm, "JNI_GetDefaultJavaVMInitArgs");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
777 if (ifn->GetDefaultJavaVMInitArgs == NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
778 goto error;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
779
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
780 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
781
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
782 error:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
783 fprintf(stderr, "Error: failed %s, because %s\n", jvmpath, dlerror());
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
784 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
785 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
786 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
787
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
788 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
789 * If app is "/foo/bin/javac", or "/foo/bin/sparcv9/javac" then put
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
790 * "/foo" into buf.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
791 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
792 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
793 GetApplicationHome(char *buf, jint bufsize)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
794 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
795 #ifdef __linux__
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
796 char *execname = GetExecname();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
797 if (execname) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
798 strncpy(buf, execname, bufsize-1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
799 buf[bufsize-1] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
800 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
801 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
802 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
803 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
804 Dl_info dlinfo;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
805
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
806 dladdr((void *)GetApplicationHome, &dlinfo);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
807 if (realpath(dlinfo.dli_fname, buf) == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
808 fprintf(stderr, "Error: realpath(`%s') failed.\n", dlinfo.dli_fname);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
809 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
810 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
811 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
812
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
813 #ifdef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
814 {
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 1985
diff changeset
815 /* gamma launcher uses JAVA_HOME environment variable to find JDK/JRE */
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 1985
diff changeset
816 char* java_home_var = getenv("JAVA_HOME");
1985
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
817 if (java_home_var == NULL) {
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 1985
diff changeset
818 printf("JAVA_HOME must point to a valid JDK/JRE to run gamma\n");
1985
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
819 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
820 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
821 snprintf(buf, bufsize, "%s", java_home_var);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
822 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
823 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
824 if (strrchr(buf, '/') == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
825 buf[0] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
826 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
827 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
828 *(strrchr(buf, '/')) = '\0'; /* executable file */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
829 if (strlen(buf) < 4 || strrchr(buf, '/') == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
830 buf[0] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
831 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
832 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
833 if (strcmp("/bin", buf + strlen(buf) - 4) != 0)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
834 *(strrchr(buf, '/')) = '\0'; /* sparcv9 or amd64 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
835 if (strlen(buf) < 4 || strcmp("/bin", buf + strlen(buf) - 4) != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
836 buf[0] = '\0';
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
837 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
838 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
839 *(strrchr(buf, '/')) = '\0'; /* bin */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
840 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
841
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
842 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
843 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
844
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
845
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
846 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
847 * Return true if the named program exists
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
848 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
849 static int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
850 ProgramExists(char *name)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
851 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
852 struct stat sb;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
853 if (stat(name, &sb) != 0) return 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
854 if (S_ISDIR(sb.st_mode)) return 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
855 return (sb.st_mode & S_IEXEC) != 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
856 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
857
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
858
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
859 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
860 * Find a command in a directory, returning the path.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
861 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
862 static char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
863 Resolve(char *indir, char *cmd)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
864 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
865 char name[PATH_MAX + 2], *real;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
866
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
867 if ((strlen(indir) + strlen(cmd) + 1) > PATH_MAX) return 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
868 sprintf(name, "%s%c%s", indir, FILE_SEPARATOR, cmd);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
869 if (!ProgramExists(name)) return 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
870 real = JLI_MemAlloc(PATH_MAX + 2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
871 if (!realpath(name, real))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
872 strcpy(real, name);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
873 return real;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
874 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
875
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
876
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
877 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
878 * Find a path for the executable
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
879 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
880 static char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
881 FindExecName(char *program)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
882 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
883 char cwdbuf[PATH_MAX+2];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
884 char *path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
885 char *tmp_path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
886 char *f;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
887 char *result = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
888
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
889 /* absolute path? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
890 if (*program == FILE_SEPARATOR ||
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
891 (FILE_SEPARATOR=='\\' && strrchr(program, ':')))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
892 return Resolve("", program+1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
893
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
894 /* relative path? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
895 if (strrchr(program, FILE_SEPARATOR) != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
896 char buf[PATH_MAX+2];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
897 return Resolve(getcwd(cwdbuf, sizeof(cwdbuf)), program);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
898 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
899
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
900 /* from search path? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
901 path = getenv("PATH");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
902 if (!path || !*path) path = ".";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
903 tmp_path = JLI_MemAlloc(strlen(path) + 2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
904 strcpy(tmp_path, path);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
905
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
906 for (f=tmp_path; *f && result==0; ) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
907 char *s = f;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
908 while (*f && (*f != PATH_SEPARATOR)) ++f;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
909 if (*f) *f++ = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
910 if (*s == FILE_SEPARATOR)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
911 result = Resolve(s, program);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
912 else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
913 /* relative path element */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
914 char dir[2*PATH_MAX];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
915 sprintf(dir, "%s%c%s", getcwd(cwdbuf, sizeof(cwdbuf)),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
916 FILE_SEPARATOR, s);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
917 result = Resolve(dir, program);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
918 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
919 if (result != 0) break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
920 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
921
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
922 JLI_MemFree(tmp_path);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
923 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
924 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
925
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
926
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
927 /* Store the name of the executable once computed */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
928 static char *execname = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
929
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
930 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
931 * Compute the name of the executable
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
932 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
933 * In order to re-exec securely we need the absolute path of the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
934 * executable. On Solaris getexecname(3c) may not return an absolute
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
935 * path so we use dladdr to get the filename of the executable and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
936 * then use realpath to derive an absolute path. From Solaris 9
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
937 * onwards the filename returned in DL_info structure from dladdr is
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
938 * an absolute pathname so technically realpath isn't required.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
939 * On Linux we read the executable name from /proc/self/exe.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
940 * As a fallback, and for platforms other than Solaris and Linux,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
941 * we use FindExecName to compute the executable name.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
942 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
943 static char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
944 SetExecname(char **argv)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
945 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
946 char* exec_path = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
947
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
948 if (execname != NULL) /* Already determined */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
949 return (execname);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
950
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
951 #if defined(__sun)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
952 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
953 Dl_info dlinfo;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
954 if (dladdr((void*)&SetExecname, &dlinfo)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
955 char *resolved = (char*)JLI_MemAlloc(PATH_MAX+1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
956 if (resolved != NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
957 exec_path = realpath(dlinfo.dli_fname, resolved);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
958 if (exec_path == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
959 JLI_MemFree(resolved);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
960 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
961 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
962 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
963 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
964 #elif defined(__linux__)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
965 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
966 const char* self = "/proc/self/exe";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
967 char buf[PATH_MAX+1];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
968 int len = readlink(self, buf, PATH_MAX);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
969 if (len >= 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
970 buf[len] = '\0'; /* readlink doesn't nul terminate */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
971 exec_path = JLI_StringDup(buf);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
972 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
973 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
974 #else /* !__sun && !__linux */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
975 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
976 /* Not implemented */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
977 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
978 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
979
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
980 if (exec_path == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
981 exec_path = FindExecName(argv[0]);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
982 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
983 execname = exec_path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
984 return exec_path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
985 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
986
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
987 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
988 * Return the name of the executable. Used in java_md.c to find the JRE area.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
989 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
990 static char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
991 GetExecname() {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
992 return execname;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
993 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
994
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
995 void ReportErrorMessage(char * message, jboolean always) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
996 if (always) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
997 fprintf(stderr, "%s\n", message);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
998 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
999 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1000
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1001 void ReportErrorMessage2(char * format, char * string, jboolean always) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1002 if (always) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1003 fprintf(stderr, format, string);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1004 fprintf(stderr, "\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1005 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1006 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1007
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1008 void ReportExceptionDescription(JNIEnv * env) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1009 (*env)->ExceptionDescribe(env);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1010 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1011
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1012 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1013 * Return JNI_TRUE for an option string that has no effect but should
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1014 * _not_ be passed on to the vm; return JNI_FALSE otherwise. On
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1015 * Solaris SPARC, this screening needs to be done if:
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1016 * 1) LD_LIBRARY_PATH does _not_ need to be reset and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1017 * 2) -d32 or -d64 is passed to a binary with a matching data model
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1018 * (the exec in SetLibraryPath removes -d<n> options and points the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1019 * exec to the proper binary). When this exec is not done, these options
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1020 * would end up getting passed onto the vm.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1021 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1022 jboolean RemovableMachineDependentOption(char * option) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1023 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1024 * Unconditionally remove both -d32 and -d64 options since only
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1025 * the last such options has an effect; e.g.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1026 * java -d32 -d64 -d32 -version
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1027 * is equivalent to
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1028 * java -d32 -version
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1029 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1030
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1031 if( (strcmp(option, "-d32") == 0 ) ||
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1032 (strcmp(option, "-d64") == 0 ))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1033 return JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1034 else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1035 return JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1036 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1037
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1038 void PrintMachineDependentOptions() {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1039 fprintf(stdout,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1040 " -d32 use a 32-bit data model if available\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1041 "\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1042 " -d64 use a 64-bit data model if available\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1043 return;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1044 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1045
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1046 #ifndef GAMMA
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1047 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1048 * The following methods (down to ServerClassMachine()) answer
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1049 * the question about whether a machine is a "server-class"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1050 * machine. A server-class machine is loosely defined as one
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1051 * with 2 or more processors and 2 gigabytes or more physical
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1052 * memory. The definition of a processor is a physical package,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1053 * not a hyperthreaded chip masquerading as a multi-processor.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1054 * The definition of memory is also somewhat fuzzy, since x86
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1055 * machines seem not to report all the memory in their DIMMs, we
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1056 * think because of memory mapping of graphics cards, etc.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1057 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1058 * This code is somewhat more confused with #ifdef's than we'd
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1059 * like because this file is used by both Solaris and Linux
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1060 * platforms, and so needs to be parameterized for SPARC and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1061 * i586 hardware. The other Linux platforms (amd64 and ia64)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1062 * don't even ask this question, because they only come with
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1063 * server JVMs. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1064
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1065 # define KB (1024UL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1066 # define MB (1024UL * KB)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1067 # define GB (1024UL * MB)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1068
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1069 /* Compute physical memory by asking the OS */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1070 uint64_t
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1071 physical_memory(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1072 const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1073 const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1074 const uint64_t result = pages * page_size;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1075 # define UINT64_FORMAT "%" PRIu64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1076
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1077 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1078 printf("pages: " UINT64_FORMAT
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1079 " page_size: " UINT64_FORMAT
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1080 " physical memory: " UINT64_FORMAT " (%.3fGB)\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1081 pages, page_size, result, result / (double) GB);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1082 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1083 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1084 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1085
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1086 #if defined(__sun) && defined(__sparc)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1087
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1088 /* Methods for solaris-sparc: these are easy. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1089
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1090 /* Ask the OS how many processors there are. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1091 unsigned long
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1092 physical_processors(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1093 const unsigned long sys_processors = sysconf(_SC_NPROCESSORS_CONF);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1094
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1095 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1096 printf("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1097 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1098 return sys_processors;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1099 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1100
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1101 /* The solaris-sparc version of the "server-class" predicate. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1102 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1103 solaris_sparc_ServerClassMachine(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1104 jboolean result = JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1105 /* How big is a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1106 const unsigned long server_processors = 2UL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1107 const uint64_t server_memory = 2UL * GB;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1108 const uint64_t actual_memory = physical_memory();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1109
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1110 /* Is this a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1111 if (actual_memory >= server_memory) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1112 const unsigned long actual_processors = physical_processors();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1113 if (actual_processors >= server_processors) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1114 result = JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1115 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1116 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1117 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1118 printf("solaris_" LIBARCHNAME "_ServerClassMachine: %s\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1119 (result == JNI_TRUE ? "JNI_TRUE" : "JNI_FALSE"));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1120 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1121 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1122 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1123
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1124 #endif /* __sun && __sparc */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1125
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1126 #if defined(__sun) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1127
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1128 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1129 * A utility method for asking the CPU about itself.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1130 * There's a corresponding version of linux-i586
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1131 * because the compilers are different.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1132 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1133 void
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1134 get_cpuid(uint32_t arg,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1135 uint32_t* eaxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1136 uint32_t* ebxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1137 uint32_t* ecxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1138 uint32_t* edxp) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1139 #ifdef _LP64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1140 asm(
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1141 /* rbx is a callee-saved register */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1142 " movq %rbx, %r11 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1143 /* rdx and rcx are 3rd and 4th argument registers */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1144 " movq %rdx, %r10 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1145 " movq %rcx, %r9 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1146 " movl %edi, %eax \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1147 " cpuid \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1148 " movl %eax, (%rsi)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1149 " movl %ebx, (%r10)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1150 " movl %ecx, (%r9) \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1151 " movl %edx, (%r8) \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1152 /* Restore rbx */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1153 " movq %r11, %rbx");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1154 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1155 /* EBX is a callee-saved register */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1156 asm(" pushl %ebx");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1157 /* Need ESI for storing through arguments */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1158 asm(" pushl %esi");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1159 asm(" movl 8(%ebp), %eax \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1160 " cpuid \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1161 " movl 12(%ebp), %esi \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1162 " movl %eax, (%esi) \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1163 " movl 16(%ebp), %esi \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1164 " movl %ebx, (%esi) \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1165 " movl 20(%ebp), %esi \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1166 " movl %ecx, (%esi) \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1167 " movl 24(%ebp), %esi \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1168 " movl %edx, (%esi) ");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1169 /* Restore ESI and EBX */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1170 asm(" popl %esi");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1171 /* Restore EBX */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1172 asm(" popl %ebx");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1173 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1174 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1175
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1176 #endif /* __sun && i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1177
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1178 #if defined(__linux__) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1179
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1180 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1181 * A utility method for asking the CPU about itself.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1182 * There's a corresponding version of solaris-i586
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1183 * because the compilers are different.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1184 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1185 void
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1186 get_cpuid(uint32_t arg,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1187 uint32_t* eaxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1188 uint32_t* ebxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1189 uint32_t* ecxp,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1190 uint32_t* edxp) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1191 #ifdef _LP64
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1192 __asm__ volatile (/* Instructions */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1193 " movl %4, %%eax \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1194 " cpuid \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1195 " movl %%eax, (%0)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1196 " movl %%ebx, (%1)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1197 " movl %%ecx, (%2)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1198 " movl %%edx, (%3)\n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1199 : /* Outputs */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1200 : /* Inputs */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1201 "r" (eaxp),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1202 "r" (ebxp),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1203 "r" (ecxp),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1204 "r" (edxp),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1205 "r" (arg)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1206 : /* Clobbers */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1207 "%rax", "%rbx", "%rcx", "%rdx", "memory"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1208 );
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1209 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1210 uint32_t value_of_eax = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1211 uint32_t value_of_ebx = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1212 uint32_t value_of_ecx = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1213 uint32_t value_of_edx = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1214 __asm__ volatile (/* Instructions */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1215 /* ebx is callee-save, so push it */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1216 " pushl %%ebx \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1217 " movl %4, %%eax \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1218 " cpuid \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1219 " movl %%eax, %0 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1220 " movl %%ebx, %1 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1221 " movl %%ecx, %2 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1222 " movl %%edx, %3 \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1223 /* restore ebx */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1224 " popl %%ebx \n"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1225
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1226 : /* Outputs */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1227 "=m" (value_of_eax),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1228 "=m" (value_of_ebx),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1229 "=m" (value_of_ecx),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1230 "=m" (value_of_edx)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1231 : /* Inputs */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1232 "m" (arg)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1233 : /* Clobbers */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1234 "%eax", "%ecx", "%edx"
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1235 );
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1236 *eaxp = value_of_eax;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1237 *ebxp = value_of_ebx;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1238 *ecxp = value_of_ecx;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1239 *edxp = value_of_edx;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1240 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1241 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1242
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1243 #endif /* __linux__ && i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1244
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1245 #ifdef i586
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1246 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1247 * Routines shared by solaris-i586 and linux-i586.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1248 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1249
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1250 enum HyperThreadingSupport_enum {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1251 hts_supported = 1,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1252 hts_too_soon_to_tell = 0,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1253 hts_not_supported = -1,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1254 hts_not_pentium4 = -2,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1255 hts_not_intel = -3
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1256 };
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1257 typedef enum HyperThreadingSupport_enum HyperThreadingSupport;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1258
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1259 /* Determine if hyperthreading is supported */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1260 HyperThreadingSupport
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1261 hyperthreading_support(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1262 HyperThreadingSupport result = hts_too_soon_to_tell;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1263 /* Bits 11 through 8 is family processor id */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1264 # define FAMILY_ID_SHIFT 8
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1265 # define FAMILY_ID_MASK 0xf
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1266 /* Bits 23 through 20 is extended family processor id */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1267 # define EXT_FAMILY_ID_SHIFT 20
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1268 # define EXT_FAMILY_ID_MASK 0xf
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1269 /* Pentium 4 family processor id */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1270 # define PENTIUM4_FAMILY_ID 0xf
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1271 /* Bit 28 indicates Hyper-Threading Technology support */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1272 # define HT_BIT_SHIFT 28
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1273 # define HT_BIT_MASK 1
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1274 uint32_t vendor_id[3] = { 0U, 0U, 0U };
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1275 uint32_t value_of_eax = 0U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1276 uint32_t value_of_edx = 0U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1277 uint32_t dummy = 0U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1278
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1279 /* Yes, this is supposed to be [0], [2], [1] */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1280 get_cpuid(0, &dummy, &vendor_id[0], &vendor_id[2], &vendor_id[1]);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1281 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1282 printf("vendor: %c %c %c %c %c %c %c %c %c %c %c %c \n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1283 ((vendor_id[0] >> 0) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1284 ((vendor_id[0] >> 8) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1285 ((vendor_id[0] >> 16) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1286 ((vendor_id[0] >> 24) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1287 ((vendor_id[1] >> 0) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1288 ((vendor_id[1] >> 8) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1289 ((vendor_id[1] >> 16) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1290 ((vendor_id[1] >> 24) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1291 ((vendor_id[2] >> 0) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1292 ((vendor_id[2] >> 8) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1293 ((vendor_id[2] >> 16) & 0xff),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1294 ((vendor_id[2] >> 24) & 0xff));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1295 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1296 get_cpuid(1, &value_of_eax, &dummy, &dummy, &value_of_edx);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1297 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1298 printf("value_of_eax: 0x%x value_of_edx: 0x%x\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1299 value_of_eax, value_of_edx);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1300 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1301 if ((((value_of_eax >> FAMILY_ID_SHIFT) & FAMILY_ID_MASK) == PENTIUM4_FAMILY_ID) ||
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1302 (((value_of_eax >> EXT_FAMILY_ID_SHIFT) & EXT_FAMILY_ID_MASK) != 0)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1303 if ((((vendor_id[0] >> 0) & 0xff) == 'G') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1304 (((vendor_id[0] >> 8) & 0xff) == 'e') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1305 (((vendor_id[0] >> 16) & 0xff) == 'n') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1306 (((vendor_id[0] >> 24) & 0xff) == 'u') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1307 (((vendor_id[1] >> 0) & 0xff) == 'i') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1308 (((vendor_id[1] >> 8) & 0xff) == 'n') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1309 (((vendor_id[1] >> 16) & 0xff) == 'e') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1310 (((vendor_id[1] >> 24) & 0xff) == 'I') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1311 (((vendor_id[2] >> 0) & 0xff) == 'n') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1312 (((vendor_id[2] >> 8) & 0xff) == 't') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1313 (((vendor_id[2] >> 16) & 0xff) == 'e') &&
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1314 (((vendor_id[2] >> 24) & 0xff) == 'l')) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1315 if (((value_of_edx >> HT_BIT_SHIFT) & HT_BIT_MASK) == HT_BIT_MASK) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1316 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1317 printf("Hyperthreading supported\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1318 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1319 result = hts_supported;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1320 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1321 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1322 printf("Hyperthreading not supported\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1323 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1324 result = hts_not_supported;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1325 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1326 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1327 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1328 printf("Not GenuineIntel\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1329 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1330 result = hts_not_intel;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1331 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1332 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1333 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1334 printf("not Pentium 4 or extended\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1335 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1336 result = hts_not_pentium4;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1337 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1338 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1339 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1340
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1341 /* Determine how many logical processors there are per CPU */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1342 unsigned int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1343 logical_processors_per_package(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1344 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1345 * After CPUID with EAX==1, register EBX bits 23 through 16
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1346 * indicate the number of logical processors per package
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1347 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1348 # define NUM_LOGICAL_SHIFT 16
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1349 # define NUM_LOGICAL_MASK 0xff
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1350 unsigned int result = 1U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1351 const HyperThreadingSupport hyperthreading = hyperthreading_support();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1352
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1353 if (hyperthreading == hts_supported) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1354 uint32_t value_of_ebx = 0U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1355 uint32_t dummy = 0U;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1356
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1357 get_cpuid(1, &dummy, &value_of_ebx, &dummy, &dummy);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1358 result = (value_of_ebx >> NUM_LOGICAL_SHIFT) & NUM_LOGICAL_MASK;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1359 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1360 printf("logical processors per package: %u\n", result);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1361 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1362 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1363 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1364 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1365
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1366 /* Compute the number of physical processors, not logical processors */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1367 unsigned long
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1368 physical_processors(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1369 const long sys_processors = sysconf(_SC_NPROCESSORS_CONF);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1370 unsigned long result = sys_processors;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1371
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1372 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1373 printf("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1374 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1375 if (sys_processors > 1) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1376 unsigned int logical_processors = logical_processors_per_package();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1377 if (logical_processors > 1) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1378 result = (unsigned long) sys_processors / logical_processors;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1379 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1380 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1381 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1382 printf("physical processors: %lu\n", result);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1383 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1384 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1385 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1386
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1387 #endif /* i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1388
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1389 #if defined(__sun) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1390
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1391 /* The definition of a server-class machine for solaris-i586/amd64 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1392 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1393 solaris_i586_ServerClassMachine(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1394 jboolean result = JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1395 /* How big is a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1396 const unsigned long server_processors = 2UL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1397 const uint64_t server_memory = 2UL * GB;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1398 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1399 * We seem not to get our full complement of memory.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1400 * We allow some part (1/8?) of the memory to be "missing",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1401 * based on the sizes of DIMMs, and maybe graphics cards.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1402 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1403 const uint64_t missing_memory = 256UL * MB;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1404 const uint64_t actual_memory = physical_memory();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1405
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1406 /* Is this a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1407 if (actual_memory >= (server_memory - missing_memory)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1408 const unsigned long actual_processors = physical_processors();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1409 if (actual_processors >= server_processors) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1410 result = JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1411 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1412 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1413 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1414 printf("solaris_" LIBARCHNAME "_ServerClassMachine: %s\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1415 (result == JNI_TRUE ? "true" : "false"));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1416 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1417 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1418 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1419
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1420 #endif /* __sun && i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1421
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1422 #if defined(__linux__) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1423
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1424 /* The definition of a server-class machine for linux-i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1425 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1426 linux_i586_ServerClassMachine(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1427 jboolean result = JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1428 /* How big is a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1429 const unsigned long server_processors = 2UL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1430 const uint64_t server_memory = 2UL * GB;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1431 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1432 * We seem not to get our full complement of memory.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1433 * We allow some part (1/8?) of the memory to be "missing",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1434 * based on the sizes of DIMMs, and maybe graphics cards.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1435 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1436 const uint64_t missing_memory = 256UL * MB;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1437 const uint64_t actual_memory = physical_memory();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1438
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1439 /* Is this a server class machine? */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1440 if (actual_memory >= (server_memory - missing_memory)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1441 const unsigned long actual_processors = physical_processors();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1442 if (actual_processors >= server_processors) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1443 result = JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1444 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1445 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1446 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1447 printf("linux_" LIBARCHNAME "_ServerClassMachine: %s\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1448 (result == JNI_TRUE ? "true" : "false"));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1449 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1450 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1451 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1452
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1453 #endif /* __linux__ && i586 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1454
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1455 /* Dispatch to the platform-specific definition of "server-class" */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1456 jboolean
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1457 ServerClassMachine(void) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1458 jboolean result = JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1459 #if defined(NEVER_ACT_AS_SERVER_CLASS_MACHINE)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1460 result = JNI_FALSE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1461 #elif defined(ALWAYS_ACT_AS_SERVER_CLASS_MACHINE)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1462 result = JNI_TRUE;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1463 #elif defined(__sun) && defined(__sparc)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1464 result = solaris_sparc_ServerClassMachine();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1465 #elif defined(__sun) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1466 result = solaris_i586_ServerClassMachine();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1467 #elif defined(__linux__) && defined(i586)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1468 result = linux_i586_ServerClassMachine();
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1469 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1470 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1471 printf("ServerClassMachine: returns default value of %s\n",
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1472 (result == JNI_TRUE ? "true" : "false"));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1473 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1474 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1475 return result;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1476 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1477
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1478 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1479 * Since using the file system as a registry is a bit risky, perform
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1480 * additional sanity checks on the identified directory to validate
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1481 * it as a valid jre/sdk.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1482 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1483 * Return 0 if the tests fail; otherwise return non-zero (true).
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1484 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1485 * Note that checking for anything more than the existence of an
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1486 * executable object at bin/java relative to the path being checked
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1487 * will break the regression tests.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1488 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1489 static int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1490 CheckSanity(char *path, char *dir)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1491 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1492 char buffer[PATH_MAX];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1493
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1494 if (strlen(path) + strlen(dir) + 11 > PATH_MAX)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1495 return (0); /* Silently reject "impossibly" long paths */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1496
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1497 (void)strcat(strcat(strcat(strcpy(buffer, path), "/"), dir), "/bin/java");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1498 return ((access(buffer, X_OK) == 0) ? 1 : 0);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1499 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1500
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1501 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1502 * Determine if there is an acceptable JRE in the directory dirname.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1503 * Upon locating the "best" one, return a fully qualified path to
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1504 * it. "Best" is defined as the most advanced JRE meeting the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1505 * constraints contained in the manifest_info. If no JRE in this
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1506 * directory meets the constraints, return NULL.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1507 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1508 * Note that we don't check for errors in reading the directory
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1509 * (which would be done by checking errno). This is because it
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1510 * doesn't matter if we get an error reading the directory, or
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1511 * we just don't find anything interesting in the directory. We
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1512 * just return NULL in either case.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1513 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1514 * The historical names of j2sdk and j2re were changed to jdk and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1515 * jre respecively as part of the 1.5 rebranding effort. Since the
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1516 * former names are legacy on Linux, they must be recognized for
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1517 * all time. Fortunately, this is a minor cost.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1518 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1519 static char
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1520 *ProcessDir(manifest_info *info, char *dirname)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1521 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1522 DIR *dirp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1523 struct dirent *dp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1524 char *best = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1525 int offset;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1526 int best_offset = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1527 char *ret_str = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1528 char buffer[PATH_MAX];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1529
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1530 if ((dirp = opendir(dirname)) == NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1531 return (NULL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1532
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1533 do {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1534 if ((dp = readdir(dirp)) != NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1535 offset = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1536 if ((strncmp(dp->d_name, "jre", 3) == 0) ||
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1537 (strncmp(dp->d_name, "jdk", 3) == 0))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1538 offset = 3;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1539 else if (strncmp(dp->d_name, "j2re", 4) == 0)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1540 offset = 4;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1541 else if (strncmp(dp->d_name, "j2sdk", 5) == 0)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1542 offset = 5;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1543 if (offset > 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1544 if ((JLI_AcceptableRelease(dp->d_name + offset,
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1545 info->jre_version)) && CheckSanity(dirname, dp->d_name))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1546 if ((best == NULL) || (JLI_ExactVersionId(
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1547 dp->d_name + offset, best + best_offset) > 0)) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1548 if (best != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1549 JLI_MemFree(best);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1550 best = JLI_StringDup(dp->d_name);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1551 best_offset = offset;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1552 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1553 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1554 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1555 } while (dp != NULL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1556 (void) closedir(dirp);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1557 if (best == NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1558 return (NULL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1559 else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1560 ret_str = JLI_MemAlloc(strlen(dirname) + strlen(best) + 2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1561 ret_str = strcat(strcat(strcpy(ret_str, dirname), "/"), best);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1562 JLI_MemFree(best);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1563 return (ret_str);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1564 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1565 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1566
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1567 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1568 * This is the global entry point. It examines the host for the optimal
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1569 * JRE to be used by scanning a set of directories. The set of directories
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1570 * is platform dependent and can be overridden by the environment
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1571 * variable JAVA_VERSION_PATH.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1572 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1573 * This routine itself simply determines the set of appropriate
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1574 * directories before passing control onto ProcessDir().
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1575 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1576 char*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1577 LocateJRE(manifest_info* info)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1578 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1579 char *path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1580 char *home;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1581 char *target = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1582 char *dp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1583 char *cp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1584
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1585 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1586 * Start by getting JAVA_VERSION_PATH
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1587 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1588 if (info->jre_restrict_search)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1589 path = JLI_StringDup(system_dir);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1590 else if ((path = getenv("JAVA_VERSION_PATH")) != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1591 path = JLI_StringDup(path);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1592 else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1593 if ((home = getenv("HOME")) != NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1594 path = (char *)JLI_MemAlloc(strlen(home) + strlen(system_dir) +
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1595 strlen(user_dir) + 2);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1596 path = strcat(strcat(strcat(strcpy(path, home),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1597 user_dir), ":"), system_dir);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1598 } else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1599 path = JLI_StringDup(system_dir);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1600
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1601 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1602 * Step through each directory on the path. Terminate the scan with
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1603 * the first directory with an acceptable JRE.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1604 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1605 cp = dp = path;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1606 while (dp != NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1607 cp = strchr(dp, (int)':');
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1608 if (cp != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1609 *cp = (char)NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1610 if ((target = ProcessDir(info, dp)) != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1611 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1612 dp = cp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1613 if (dp != NULL)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1614 dp++;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1615 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1616 JLI_MemFree(path);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1617 return (target);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1618 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1619
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1620 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1621 * Given a path to a jre to execute, this routine checks if this process
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1622 * is indeed that jre. If not, it exec's that jre.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1623 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1624 * We want to actually check the paths rather than just the version string
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1625 * built into the executable, so that given version specification (and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1626 * JAVA_VERSION_PATH) will yield the exact same Java environment, regardless
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1627 * of the version of the arbitrary launcher we start with.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1628 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1629 void
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1630 ExecJRE(char *jre, char **argv)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1631 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1632 char wanted[PATH_MAX];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1633 char *execname;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1634 char *progname;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1635
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1636 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1637 * Resolve the real path to the directory containing the selected JRE.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1638 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1639 if (realpath(jre, wanted) == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1640 fprintf(stderr, "Unable to resolve %s\n", jre);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1641 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1642 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1643
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1644 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1645 * Resolve the real path to the currently running launcher.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1646 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1647 execname = SetExecname(argv);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1648 if (execname == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1649 fprintf(stderr, "Unable to resolve current executable\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1650 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1651 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1652
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1653 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1654 * If the path to the selected JRE directory is a match to the initial
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1655 * portion of the path to the currently executing JRE, we have a winner!
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1656 * If so, just return.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1657 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1658 if (strncmp(wanted, execname, strlen(wanted)) == 0)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1659 return; /* I am the droid you were looking for */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1660
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1661 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1662 * If this isn't the selected version, exec the selected version.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1663 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1664 #ifdef JAVA_ARGS /* javac, jar and friends. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1665 progname = "java";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1666 #else /* java, oldjava, javaw and friends */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1667 #ifdef PROGNAME
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1668 progname = PROGNAME;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1669 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1670 progname = *argv;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1671 if ((s = strrchr(progname, FILE_SEPARATOR)) != 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1672 progname = s + 1;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1673 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1674 #endif /* PROGNAME */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1675 #endif /* JAVA_ARGS */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1676
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1677 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1678 * This should never happen (because of the selection code in SelectJRE),
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1679 * but check for "impossibly" long path names just because buffer overruns
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1680 * can be so deadly.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1681 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1682 if (strlen(wanted) + strlen(progname) + 6 > PATH_MAX) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1683 fprintf(stderr, "Path length exceeds maximum length (PATH_MAX)\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1684 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1685 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1686
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1687 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1688 * Construct the path and exec it.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1689 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1690 (void)strcat(strcat(wanted, "/bin/"), progname);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1691 argv[0] = progname;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1692 if (_launcher_debug) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1693 int i;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1694 printf("ReExec Command: %s (%s)\n", wanted, argv[0]);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1695 printf("ReExec Args:");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1696 for (i = 1; argv[i] != NULL; i++)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1697 printf(" %s", argv[i]);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1698 printf("\n");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1699 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1700 (void)fflush(stdout);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1701 (void)fflush(stderr);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1702 execv(wanted, argv);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1703 perror("execv()");
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1704 fprintf(stderr, "Exec of %s failed\n", wanted);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1705 exit(1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1706 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1707 #endif /* ifndef GAMMA */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1708
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1709 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1710 * "Borrowed" from Solaris 10 where the unsetenv() function is being added
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1711 * to libc thanks to SUSv3 (Standard Unix Specification, version 3). As
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1712 * such, in the fullness of time this will appear in libc on all relevant
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1713 * Solaris/Linux platforms and maybe even the Windows platform. At that
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1714 * time, this stub can be removed.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1715 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1716 * This implementation removes the environment locking for multithreaded
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1717 * applications. (We don't have access to these mutexes within libc and
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1718 * the launcher isn't multithreaded.) Note that what remains is platform
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1719 * independent, because it only relies on attributes that a POSIX environment
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1720 * defines.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1721 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1722 * Returns 0 on success, -1 on failure.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1723 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1724 * Also removed was the setting of errno. The only value of errno set
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1725 * was EINVAL ("Invalid Argument").
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1726 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1727
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1728 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1729 * s1(environ) is name=value
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1730 * s2(name) is name(not the form of name=value).
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1731 * if names match, return value of 1, else return 0
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1732 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1733 static int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1734 match_noeq(const char *s1, const char *s2)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1735 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1736 while (*s1 == *s2++) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1737 if (*s1++ == '=')
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1738 return (1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1739 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1740 if (*s1 == '=' && s2[-1] == '\0')
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1741 return (1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1742 return (0);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1743 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1744
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1745 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1746 * added for SUSv3 standard
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1747 *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1748 * Delete entry from environ.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1749 * Do not free() memory! Other threads may be using it.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1750 * Keep it around forever.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1751 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1752 static int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1753 borrowed_unsetenv(const char *name)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1754 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1755 long idx; /* index into environ */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1756
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1757 if (name == NULL || *name == '\0' ||
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1758 strchr(name, '=') != NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1759 return (-1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1760 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1761
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1762 for (idx = 0; environ[idx] != NULL; idx++) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1763 if (match_noeq(environ[idx], name))
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1764 break;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1765 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1766 if (environ[idx] == NULL) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1767 /* name not found but still a success */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1768 return (0);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1769 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1770 /* squeeze up one entry */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1771 do {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1772 environ[idx] = environ[idx+1];
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1773 } while (environ[++idx] != NULL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1774
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1775 return (0);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1776 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1777 /* --- End of "borrowed" code --- */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1778
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1779 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1780 * Wrapper for unsetenv() function.
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1781 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1782 int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1783 UnsetEnv(char *name)
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1784 {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1785 return(borrowed_unsetenv(name));
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1786 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1787
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1788 /* --- Splash Screen shared library support --- */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1789
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1790 static const char* SPLASHSCREEN_SO = "libsplashscreen.so";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1791
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1792 static void* hSplashLib = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1793
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1794 void* SplashProcAddress(const char* name) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1795 if (!hSplashLib) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1796 hSplashLib = dlopen(SPLASHSCREEN_SO, RTLD_LAZY | RTLD_GLOBAL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1797 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1798 if (hSplashLib) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1799 void* sym = dlsym(hSplashLib, name);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1800 return sym;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1801 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1802 return NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1803 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1804 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1805
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1806 void SplashFreeLibrary() {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1807 if (hSplashLib) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1808 dlclose(hSplashLib);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1809 hSplashLib = NULL;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1810 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1811 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1812
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1813 const char *
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1814 jlong_format_specifier() {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1815 return "%lld";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1816 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1817
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1818 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1819 * Block current thread and continue execution in a new thread
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1820 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1821 int
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1822 ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1823 int rslt;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1824 #ifdef __linux__
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1825 pthread_t tid;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1826 pthread_attr_t attr;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1827 pthread_attr_init(&attr);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1828 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1829
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1830 if (stack_size > 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1831 pthread_attr_setstacksize(&attr, stack_size);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1832 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1833
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1834 if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1835 void * tmp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1836 pthread_join(tid, &tmp);
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 1985
diff changeset
1837 rslt = (int)(intptr_t)tmp;
1985
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1838 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1839 /*
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1840 * Continue execution in current thread if for some reason (e.g. out of
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1841 * memory/LWP) a new thread can't be created. This will likely fail
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1842 * later in continuation as JNI_CreateJavaVM needs to create quite a
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1843 * few new threads, anyway, just give it a try..
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1844 */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1845 rslt = continuation(args);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1846 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1847
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1848 pthread_attr_destroy(&attr);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1849 #else
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1850 thread_t tid;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1851 long flags = 0;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1852 if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1853 void * tmp;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1854 thr_join(tid, NULL, &tmp);
2027
aa6e219afbf1 7006354: Updates to Visual Studio project creation and development launcher
sla
parents: 1985
diff changeset
1855 rslt = (int)(intptr_t)tmp;
1985
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1856 } else {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1857 /* See above. Continue in current thread if thr_create() failed */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1858 rslt = continuation(args);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1859 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1860 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1861 return rslt;
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1862 }
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1863
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1864 /* Coarse estimation of number of digits assuming the worst case is a 64-bit pid. */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1865 #define MAX_PID_STR_SZ 20
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1866
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1867 void SetJavaLauncherPlatformProps() {
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1868 /* Linux only */
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1869 #ifdef __linux__
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1870 const char *substr = "-Dsun.java.launcher.pid=";
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1871 char *pid_prop_str = (char *)JLI_MemAlloc(strlen(substr) + MAX_PID_STR_SZ + 1);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1872 sprintf(pid_prop_str, "%s%d", substr, getpid());
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1873 AddOption(pid_prop_str, NULL);
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1874 #endif
cb2d0a362639 6981484: Update development launcher
sla
parents:
diff changeset
1875 }