Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/exelib/common/libhlp.c
6000 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2020 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include <stdlib.h>
24
#include <stdio.h>
25
#include <string.h>
26
#include "jni.h"
27
#include "j9user.h"
28
#include "j9port.h"
29
#include "cfr.h"
30
#include "j9.h"
31
#include "j9protos.h"
32
#include "rommeth.h"
33
#include "j9version.h"
34
35
#include "libhlp.h"
36
37
#include "j9exelibnls.h"
38
#include "exelib_internal.h"
39
40
#define J9_PATH_SLASH DIR_SEPARATOR
41
42
static IDATA convertString (JNIEnv* env, J9PortLibrary *j9portLibrary, jclass utilClass, jmethodID utilMid, char* chars, jstring* str);
43
44
45
#define ROUND_TO_1K( x ) (((x + 1023) / 1024) * 1024)
46
47
static char versionString[255];
48
49
I_32 main_appendToClassPath( J9PortLibrary *portLib, U_16 sep, J9StringBuffer **classPath, char *toAppend) {
50
51
/* append a separator, first */
52
if ((NULL != *classPath)
53
&& ((*classPath)->data[strlen((const char*)(*classPath)->data)] != sep)
54
) {
55
char separator[2];
56
separator[0] = (char)sep;
57
separator[1] = '\0';
58
*classPath = strBufferCat(portLib, *classPath, separator);
59
if (*classPath == NULL) return -1;
60
}
61
62
*classPath = strBufferCat(portLib, *classPath, toAppend);
63
if (*classPath == NULL) return -1;
64
65
return 0;
66
}
67
68
69
70
71
IDATA main_initializeBootLibraryPath(J9PortLibrary * portLib, J9StringBuffer **finalBootLibraryPath, char *argv0)
72
{
73
*finalBootLibraryPath = NULL;
74
{
75
char *p = NULL;
76
char *bootLibraryPath = NULL;
77
PORT_ACCESS_FROM_PORT(portLib);
78
79
if (j9sysinfo_get_executable_name (argv0, &bootLibraryPath)) {
80
return -1;
81
}
82
83
p = strrchr(bootLibraryPath, J9_PATH_SLASH);
84
if (p) {
85
p[1] = '\0';
86
*finalBootLibraryPath = strBufferCat(portLib, NULL, bootLibraryPath);
87
}
88
/* Do /not/ delete executable name string; system-owned. */
89
}
90
return 0;
91
}
92
93
94
95
/* Allocates and retrieves initial value of the classPath. */
96
97
I_32 main_initializeClassPath( J9PortLibrary *portLib, J9StringBuffer** classPath)
98
{
99
PORT_ACCESS_FROM_PORT( portLib );
100
IDATA rc;
101
char* envvars = "CLASSPATH\0classpath\0";
102
char* envvar;
103
104
for (envvar = envvars; *envvar; envvar += strlen(envvar) + 1) {
105
rc = j9sysinfo_get_env(envvar, NULL, 0);
106
if (rc > 0) {
107
char * cpData = NULL;
108
*classPath = strBufferEnsure(portLib, *classPath, rc);
109
if (*classPath == NULL) return -1;
110
cpData = (*classPath)->data + strlen((const char*)(*classPath)->data);
111
j9sysinfo_get_env(envvar, cpData, rc);
112
(*classPath)->remaining -= rc;
113
break;
114
}
115
}
116
117
return 0;
118
}
119
120
121
IDATA main_initializeJavaHome(J9PortLibrary * portLib, J9StringBuffer **finalJavaHome, int argc, char **argv)
122
{
123
char *javaHome = NULL;
124
char *javaHomeModifiablePart = NULL;
125
char *p;
126
IDATA retval = -1;
127
IDATA rc;
128
UDATA isUpper = TRUE;
129
char* envvars = "JAVA_HOME\0java_home\0";
130
char* envvar;
131
132
PORT_ACCESS_FROM_PORT(portLib);
133
134
#ifdef DEBUG
135
j9tty_printf(portLib, "initializeJavaHome called\n");
136
#endif
137
138
for (envvar = envvars; *envvar; envvar += strlen(envvar) + 1) {
139
rc = j9sysinfo_get_env(envvar, NULL, 0);
140
if (rc > 0) {
141
char* javaHomeData = NULL;
142
*finalJavaHome = strBufferEnsure(PORTLIB, *finalJavaHome, rc);
143
if (NULL == *finalJavaHome) {
144
return -1;
145
}
146
javaHomeData = (*finalJavaHome)->data + strlen((const char*)(*finalJavaHome)->data);
147
j9sysinfo_get_env(envvar, javaHomeData , rc);
148
(*finalJavaHome)->remaining -= rc;
149
return 0;
150
}
151
}
152
153
/* Compute the proper value for the var. */
154
155
if ((argc < 1) || !argv) return -1;
156
157
retval = j9sysinfo_get_executable_name(argv[0], &javaHome);
158
if (retval) {
159
*finalJavaHome = strBufferCat(PORTLIB, *finalJavaHome, "..");
160
return 0;
161
}
162
163
javaHomeModifiablePart = javaHome;
164
#if defined(WIN32) || defined(OS2)
165
/* Make sure we don't modify a drive specifier in a pathname. */
166
if ((strlen(javaHome) > 2) && (javaHome[1] == ':')) {
167
javaHomeModifiablePart = javaHome + 2;
168
if (javaHome[2] == J9_PATH_SLASH)
169
javaHomeModifiablePart++;
170
}
171
#endif
172
#if defined(WIN32) || defined(OS2)
173
/* Make sure we don't modify the root of a UNC pathname. */
174
if ((strlen(javaHome) > 2) && (javaHome[0] == J9_PATH_SLASH) && (javaHome[1] == J9_PATH_SLASH)) {
175
javaHomeModifiablePart = javaHome + 2;
176
/* skip over the machine name */
177
while (*javaHomeModifiablePart && (*javaHomeModifiablePart != J9_PATH_SLASH)) {
178
javaHomeModifiablePart++;
179
}
180
if (*javaHomeModifiablePart)
181
javaHomeModifiablePart++;
182
/* skip over the share name */
183
while (*javaHomeModifiablePart && (*javaHomeModifiablePart != J9_PATH_SLASH)) {
184
javaHomeModifiablePart++;
185
}
186
}
187
#endif
188
if ((javaHomeModifiablePart == javaHome) && javaHome[0] == J9_PATH_SLASH) {
189
/* make sure we don't modify a root slash. */
190
javaHomeModifiablePart++;
191
}
192
193
/* Note: if sysinfo_get_executable_name claims we were invoked from a root directory, */
194
/* then this code will return that root directory for java.home also. */
195
p = strrchr(javaHomeModifiablePart, J9_PATH_SLASH);
196
if (!p) {
197
javaHomeModifiablePart[0] = '\0'; /* chop off whole thing! */
198
} else {
199
p[0] = '\0'; /* chop off trailing slash and executable name. */
200
p = strrchr(javaHomeModifiablePart, J9_PATH_SLASH);
201
if (!p) {
202
javaHomeModifiablePart[0] = '\0'; /* chop off the rest */
203
} else {
204
p[0] = '\0'; /* chop off trailing slash and deepest subdirectory. */
205
}
206
}
207
208
*finalJavaHome = strBufferCat(PORTLIB, *finalJavaHome, javaHome);
209
/* Do /not/ delete executable name string; system-owned. */
210
return 0;
211
}
212
213
214
215
IDATA main_initializeJavaLibraryPath(J9PortLibrary * portLib, J9StringBuffer **finalJavaLibraryPath, char *argv0)
216
{
217
#ifdef WIN32
218
#define ENV_PATH "PATH"
219
#else
220
#if defined(AIXPPC)
221
#define ENV_PATH "LIBPATH"
222
#else
223
#define ENV_PATH "LD_LIBRARY_PATH"
224
#endif
225
#endif
226
227
J9StringBuffer *javaLibraryPath = NULL;
228
char *exeName = NULL;
229
IDATA rc = -1;
230
char *p = NULL;
231
char *envResult = NULL;
232
IDATA envSize;
233
#define ENV_BUFFER_SIZE 80
234
char envBuffer[ENV_BUFFER_SIZE];
235
char sep[2];
236
PORT_ACCESS_FROM_PORT(portLib);
237
238
sep[0] = (char)j9sysinfo_get_classpathSeparator();
239
sep[1] = '\0';
240
241
if (j9sysinfo_get_executable_name(argv0, &exeName)) {
242
goto done;
243
}
244
p = strrchr(exeName, J9_PATH_SLASH);
245
if (NULL != p) {
246
p[1] = '\0';
247
} else {
248
/* Reset to NULL; do /not/ delete (system-owned string). */
249
exeName = NULL;
250
}
251
252
envSize = j9sysinfo_get_env( ENV_PATH, NULL, 0 );
253
if( envSize > 0 ) {
254
if( envSize >= ENV_BUFFER_SIZE ) {
255
envResult = j9mem_allocate_memory( envSize + 1 , OMRMEM_CATEGORY_VM);
256
if (!envResult) goto done;
257
j9sysinfo_get_env( ENV_PATH, envResult, envSize );
258
} else {
259
envSize = -1; /* make it -1 so we don't free the buffer */
260
j9sysinfo_get_env( ENV_PATH, envBuffer, ENV_BUFFER_SIZE );
261
envResult = envBuffer;
262
}
263
} else {
264
envResult = NULL;
265
}
266
267
268
/* Add one to each length to account for the separator character. Add 2 at the end for the "." and NULL terminator */
269
270
if (exeName) {
271
javaLibraryPath = strBufferCat(portLib, javaLibraryPath, exeName);
272
javaLibraryPath = strBufferCat(portLib, javaLibraryPath, sep);
273
}
274
javaLibraryPath = strBufferCat(portLib, javaLibraryPath, ".");
275
if (envResult) {
276
javaLibraryPath = strBufferCat(portLib, javaLibraryPath, sep);
277
javaLibraryPath = strBufferCat(portLib, javaLibraryPath, envResult);
278
if( envSize != -1 ) {
279
j9mem_free_memory( envResult );
280
}
281
}
282
283
rc = 0;
284
285
done:
286
/* Do /not/ delete executable name string; system-owned. */
287
*finalJavaLibraryPath = javaLibraryPath;
288
return rc;
289
}
290
291
292
293
int main_runJavaMain(JNIEnv * env, char *mainClassName, int nameIsUTF, int java_argc, char **java_argv, J9PortLibrary * j9portLibrary)
294
{
295
int i, rc = 0;
296
jclass cls;
297
jmethodID mid, utilMid;
298
jarray args;
299
jclass utilClass, stringClass;
300
char *slashifiedClassName, *dots, *slashes;
301
const char *utfClassName;
302
jboolean isCopy;
303
jstring str;
304
jclass globalCls;
305
jarray globalArgs;
306
307
PORT_ACCESS_FROM_PORT(j9portLibrary);
308
309
slashifiedClassName = j9mem_allocate_memory(strlen(mainClassName) + 1, OMRMEM_CATEGORY_VM);
310
if (slashifiedClassName == NULL) {
311
/* J9NLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
312
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
313
rc = 2;
314
goto done;
315
}
316
for (slashes = slashifiedClassName, dots = mainClassName; *dots; dots++, slashes++) {
317
*slashes = (*dots == '.' ? '/' : *dots);
318
}
319
*slashes = '\0';
320
321
/* These classes must have already been found as part of bootstrap */
322
stringClass = (*env)->FindClass(env, "java/lang/String");
323
if (!stringClass) {
324
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_TO_FIND_JLS=Internal VM error: Failed to find class java/lang/String\n */
325
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_TO_FIND_JLS );
326
rc = 5;
327
goto done;
328
}
329
utilClass = (*env)->FindClass(env, "com/ibm/oti/util/Util");
330
if (NULL == utilClass) {
331
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME=Internal VM error: Failed to create java/lang/String for class name %s\n */
332
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME, mainClassName);
333
rc = 13;
334
goto done;
335
}
336
utilMid = ((*env)->GetStaticMethodID(env, utilClass, "toString", "([BII)Ljava/lang/String;"));
337
if (NULL == utilMid) {
338
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME=Internal VM error: Failed to create java/lang/String for class name %s\n */
339
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME, mainClassName);
340
rc = 14;
341
goto done;
342
}
343
344
if(nameIsUTF) {
345
cls = (*env)->FindClass(env, slashifiedClassName);
346
j9mem_free_memory(slashifiedClassName);
347
} else {
348
IDATA rcConvert = convertString(env, j9portLibrary, utilClass, utilMid, slashifiedClassName, &str);
349
j9mem_free_memory(slashifiedClassName);
350
351
if(rcConvert == 1) {
352
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BA=Internal VM error: Failed to create byte array for class name %s\n */
353
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BA, mainClassName);
354
rc = 10;
355
goto done;
356
}
357
if(rcConvert == 2) {
358
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME=Internal VM error: Failed to create java/lang/String for class name %s\n */
359
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME, mainClassName);
360
rc = 11;
361
goto done;
362
}
363
utfClassName = (const char *) (*env)->GetStringUTFChars(env, str, &isCopy);
364
if(utfClassName == NULL) {
365
/* J9NLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY_CONVERTING=Internal VM error: Out of memory converting string to UTF Chars for class name %s\n */
366
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY_CONVERTING, mainClassName);
367
rc = 12;
368
goto done;
369
}
370
cls = (*env)->FindClass(env, utfClassName);
371
(*env)->ReleaseStringUTFChars(env, str, utfClassName);
372
(*env)->DeleteLocalRef(env, str);
373
}
374
375
if (!cls) {
376
rc = 3;
377
goto done;
378
}
379
380
/* Create the String array before getting the methodID to get better performance from HOOK_ABOUT_TO_RUN_MAIN */
381
args = (*env)->NewObjectArray(env, java_argc, stringClass, NULL);
382
if (!args) {
383
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_ARG_ARRAY=Internal VM error: Failed to create argument array\n */
384
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_ARG_ARRAY);
385
rc = 6;
386
goto done;
387
}
388
for (i = 0; i < java_argc; ++i) {
389
IDATA rcConvert = convertString(env, j9portLibrary, utilClass, utilMid, java_argv[i], &str);
390
if(rcConvert == 1) {
391
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BYTE_ARRAY=Internal VM error: Failed to create byte array for argument %s\n */
392
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BYTE_ARRAY, java_argv[i]);
393
rc = 7;
394
goto done;
395
}
396
if(rcConvert == 2) {
397
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_ARG=Internal VM error: Failed to create java/lang/String for argument %s\n*/
398
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_ARG, java_argv[i]);
399
rc = 8;
400
goto done;
401
}
402
403
(*env)->SetObjectArrayElement(env, args, i, str);
404
if ((*env)->ExceptionCheck(env)) {
405
/* J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_SET_ARRAY_ELEM=Internal VM error: Failed to set array element for %s\n */
406
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_INTERNAL_VM_ERR_FAILED_SET_ARRAY_ELEM,
407
java_argv[i]);
408
rc = 9;
409
goto done;
410
}
411
(*env)->DeleteLocalRef(env, str);
412
}
413
414
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
415
if (!mid) {
416
/* Currently, GetStaticMethodID does not throw an exception when the method is not found */
417
/* J9NLS_EXELIB_CLASS_DOES_NOT_IMPL_MAIN=Class %s does not implement main()\n */
418
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_CLASS_DOES_NOT_IMPL_MAIN, mainClassName);
419
rc = 4;
420
goto done;
421
}
422
/* For compliance purposes on CDC we must apply the spec more strictly than the JDK seems to */
423
/* Verify that the main method we found is public, static, and void -- as described in 2.17.1 of the spec */
424
/* WARNING: this is non-portable J9 specific code */
425
if( ((J9VMThread *)env)->javaVM->runtimeFlags & J9RuntimeFlagVerify ) {
426
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD( ((J9JNIMethodID *)mid)->method );
427
if( (romMethod->modifiers & (CFR_ACC_STATIC | CFR_ACC_PUBLIC)) != (CFR_ACC_STATIC | CFR_ACC_PUBLIC) ) {
428
/* J9NLS_EXELIB_MUST_BE_PSV=The method main must be declared public, static and void.\n */
429
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_EXELIB_MUST_BE_PSV);
430
rc = 4;
431
goto done;
432
}
433
} /* end of non-portable J9 specific code */
434
435
globalCls = (jclass) (*env)->NewGlobalRef(env, cls);
436
if (globalCls) {
437
(*env)->DeleteLocalRef(env, cls);
438
cls = globalCls;
439
}
440
globalArgs = (jarray) (*env)->NewGlobalRef(env, args);
441
if (globalArgs) {
442
(*env)->DeleteLocalRef(env, args);
443
args = globalArgs;
444
}
445
(*env)->DeleteLocalRef(env, stringClass);
446
(*env)->CallStaticVoidMethod(env, cls, mid, args);
447
448
done:
449
if ((*env)->ExceptionCheck(env)) {
450
if (rc == 0)
451
rc = 100;
452
}
453
454
(*env)->ExceptionDescribe(env);
455
return rc;
456
}
457
458
459
460
/* Compute and return a string which is the vm version */
461
462
char * main_vmVersionString(void)
463
{
464
U_32 minorVersion;
465
char *native = "";
466
char *versionStringPtr = GLOBAL_DATA(versionString);
467
minorVersion = EsVersionMinor;
468
469
if ((minorVersion % 10) == 0)
470
minorVersion /= 10;
471
sprintf (versionStringPtr, "%d.%d%s,%s %s",
472
EsVersionMajor, minorVersion, EsExtraVersionString, native, EsBuildVersionString);
473
return versionStringPtr;
474
}
475
476
477
478
479
static IDATA
480
convertString(JNIEnv* env, J9PortLibrary *j9portLibrary, jclass utilClass, jmethodID utilMid, char* chars, jstring* str)
481
{
482
jsize strLength;
483
jarray bytearray;
484
jstring string;
485
486
strLength = (jsize) strlen(chars);
487
bytearray = (*env)->NewByteArray(env, strLength);
488
if (((*env)->ExceptionCheck(env))) {
489
return 1;
490
}
491
492
(*env)->SetByteArrayRegion(env, bytearray, (UDATA)0, strLength, (jbyte*)chars);
493
494
string = (*env)->CallStaticObjectMethod(env, utilClass, utilMid, bytearray, (jint)0, strLength);
495
(*env)->DeleteLocalRef(env, bytearray);
496
497
if (!string) {
498
return 2;
499
} else {
500
*str = string;
501
return 0;
502
}
503
}
504
505
506
/* Compute and return a string which is the nitty-gritty for the vm */
507
508
char * vmDetailString( J9PortLibrary *portLib, char *detailString, UDATA detailStringLength )
509
{
510
const char *ostype, *osversion, *osarch;
511
PORT_ACCESS_FROM_PORT( portLib );
512
513
ostype = j9sysinfo_get_OS_type();
514
osversion = j9sysinfo_get_OS_version();
515
osarch = j9sysinfo_get_CPU_architecture();
516
517
j9str_printf (PORTLIB, detailString, detailStringLength, "%s (%s %s %s)", EsBuildVersionString, ostype ? ostype : "unknown", osversion ? osversion : "unknown", osarch ? osarch : "unknown");
518
return detailString;
519
}
520
521
522
/* Try to initialize the NLS catalog; otherwise use defaults */
523
void main_setNLSCatalog(J9PortLibrary * portLib, char **argv)
524
{
525
char *exename = NULL;
526
527
PORT_ACCESS_FROM_PORT(portLib);
528
529
/* Locate 'lib' directory which contains java.properties file */
530
if ( j9sysinfo_get_executable_name( argv[0], &exename ) == 0 ) {
531
/* For Java 8, java.properties file is present at same location as 'exename',
532
* but for Java 9, java.properties is under 'lib' directory.
533
* Since we have no way to determine if we are running for Java 8 or Java 9,
534
* pass both the locations to j9nls_set_catalog() and let it search for the file.
535
*/
536
char *nlsPaths[] = { exename, NULL };
537
char *exe = NULL;
538
char *vmName = NULL;
539
UDATA exeNameLen = strlen(exename);
540
#ifdef WIN32
541
UDATA j9libLen = exeNameLen + strlen(DIR_SEPARATOR_STR) * 2 + strlen("lib") + 1;
542
char *j9lib = j9mem_allocate_memory(j9libLen, OMRMEM_CATEGORY_VM);
543
544
if (NULL != j9lib) {
545
char *bin = NULL;
546
547
strcpy(j9lib, exename);
548
549
/* Remove exe name, VM name ('default' or 'compressedrefs') and 'bin', then add 'lib' */
550
exe = strrchr(j9lib, DIR_SEPARATOR);
551
if (NULL != exe) {
552
*exe = '\0';
553
}
554
vmName = strrchr(j9lib, DIR_SEPARATOR);
555
if (NULL != vmName) {
556
*vmName = '\0';
557
}
558
bin = strrchr(j9lib, DIR_SEPARATOR);
559
if (NULL != bin) {
560
*bin = '\0';
561
}
562
563
/* j9nls_set_catalog ignores everything after the last slash. Append a slash to j9lib. */
564
strcat(j9lib, DIR_SEPARATOR_STR);
565
strcat(j9lib, "lib");
566
strcat(j9lib, DIR_SEPARATOR_STR);
567
#else
568
char *j9lib = j9mem_allocate_memory(exeNameLen + 1, OMRMEM_CATEGORY_VM);
569
570
if (NULL != j9lib) {
571
strcpy(j9lib, exename);
572
573
/* Remove exe name and VM name ('default' or 'compressedrefs') */
574
exe = strrchr(j9lib, DIR_SEPARATOR);
575
if (NULL != exe) {
576
*exe = '\0';
577
}
578
vmName = strrchr(j9lib, DIR_SEPARATOR);
579
if (NULL != vmName) {
580
*vmName = '\0';
581
}
582
/* leave the platform name, it gets removed by j9nls_set_catalog as it ignores everything after the last slash. */
583
#endif /* WIN32 */
584
nlsPaths[1] = j9lib;
585
}
586
j9nls_set_catalog( (const char**)nlsPaths, 2, "java", "properties" );
587
if (NULL != j9lib) {
588
j9mem_free_memory(j9lib);
589
}
590
}
591
/* Do /not/ delete executable name string; system-owned. */
592
}
593
594
/*
595
* Returns a non-zero value if an error occurred, returns zero on success.
596
* If a default option file is located, optionFileName is an allocated buffer (must be freed by
597
* callee) that contains the fully qualified filename.
598
* If a default option file cannot be found, optionFileName will point at NULL.
599
*
600
*/
601
I_32 main_findDefaultOptionsFile( J9PortLibrary *portLib, char *argv0, char **optionFileName) {
602
char *exeName;
603
char *eptr;
604
char *ptr;
605
char *defaultOptionFileName;
606
IDATA file;
607
PORT_ACCESS_FROM_PORT(portLib);
608
609
610
if( j9sysinfo_get_executable_name(argv0, &exeName)) {
611
return -1;
612
}
613
defaultOptionFileName = j9mem_allocate_memory(strlen(exeName) + 6, OMRMEM_CATEGORY_VM); /* +6 == ".j9vm" + zero termination */
614
if(NULL == defaultOptionFileName ) {
615
return -1;
616
}
617
/* First look for <path>/.<exename> */
618
strcpy( defaultOptionFileName, exeName );
619
#if defined(WIN32)
620
/* On Windows we have to strip the .exe extension */
621
eptr = strrchr( exeName, '.');
622
if( eptr ) {
623
*eptr = '\0';
624
}
625
#endif
626
eptr = strrchr( exeName, DIR_SEPARATOR);
627
ptr = strrchr( defaultOptionFileName, DIR_SEPARATOR);
628
if( ptr ) { /* we can assume if ptr is valid, so is eptr */
629
ptr[1] = '.';
630
ptr[2] = '\0';
631
strcat( defaultOptionFileName, &eptr[1] );
632
file = j9file_open( defaultOptionFileName, EsOpenRead, 0);
633
if( file != -1 ) {
634
j9file_close(file);
635
*optionFileName = defaultOptionFileName;
636
/* Do /not/ delete executable name string; system-owned. */
637
return 0;
638
}
639
}
640
/* Do /not/ delete executable name string; system-owned. */
641
642
ptr = strrchr( defaultOptionFileName, DIR_SEPARATOR);
643
if( ptr ) {
644
/* if we found a separator - truncate just after it */
645
ptr++;
646
*ptr = '\0';
647
strcat( defaultOptionFileName, ".j9vm" );
648
file = j9file_open( defaultOptionFileName, EsOpenRead, 0);
649
if( file != -1 ) {
650
j9file_close(file);
651
*optionFileName = defaultOptionFileName;
652
return 0;
653
}
654
}
655
/* No failure, but no file found */
656
*optionFileName = NULL;
657
j9mem_free_memory( defaultOptionFileName );
658
return 0;
659
}
660
661