mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 12:34:32 +02:00
6367077: Purge LD_LIBRARY_PATH usage from the launcher
6899834: (launcher) remove the solaris libjvm.so symlink Fixes other related issues as well. Reviewed-by: darcy, ohair, xlu, martin
This commit is contained in:
parent
9150551f00
commit
3d2d85a19c
13 changed files with 504 additions and 860 deletions
|
@ -96,6 +96,7 @@ OTHER_CPPFLAGS += $(LIBARCH_DEFINES)
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(PLATFORM), windows) # UNIX systems
|
ifneq ($(PLATFORM), windows) # UNIX systems
|
||||||
|
LD_RUNPATH_EXTRAS += ..
|
||||||
LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
|
LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
|
||||||
# Note: its important to keep this order meaning -lc is the
|
# Note: its important to keep this order meaning -lc is the
|
||||||
# last library otherwise it could cause compatibility issues
|
# last library otherwise it could cause compatibility issues
|
||||||
|
|
|
@ -61,8 +61,5 @@ OTHER_CPPFLAGS += -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"'
|
||||||
|
|
||||||
ifeq ($(PLATFORM), solaris)
|
ifeq ($(PLATFORM), solaris)
|
||||||
LDFLAGS += -R$(OPENWIN_LIB)
|
LDFLAGS += -R$(OPENWIN_LIB)
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM), solaris)
|
|
||||||
LDFLAGS += -M mapfile-$(ARCH)
|
LDFLAGS += -M mapfile-$(ARCH)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -194,10 +194,8 @@ endif
|
||||||
# For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR)
|
# For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR)
|
||||||
IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME)
|
IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME)
|
||||||
|
|
||||||
# create a link from lib/libjvm.so to client/libjvm.so
|
|
||||||
$(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME)
|
$(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME)
|
||||||
@$(prep-target)
|
@$(prep-target)
|
||||||
$(LN) -s $(CLIENT_LOCATION)/$(JVM_NAME) $@
|
|
||||||
|
|
||||||
# solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris
|
# solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris
|
||||||
endif # 32bit solaris
|
endif # 32bit solaris
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -41,15 +41,13 @@
|
||||||
* options are turned into "-foo" options to the vm. This option
|
* options are turned into "-foo" options to the vm. This option
|
||||||
* filtering is handled in a number of places in the launcher, some of
|
* filtering is handled in a number of places in the launcher, some of
|
||||||
* it in machine-dependent code. In this file, the function
|
* it in machine-dependent code. In this file, the function
|
||||||
* CheckJVMType removes vm style options and TranslateApplicationArgs
|
* CheckJvmType removes vm style options and TranslateApplicationArgs
|
||||||
* removes "-J" prefixes. On unix platforms, the
|
* removes "-J" prefixes. The CreateExecutionEnvironment function processes
|
||||||
* CreateExecutionEnvironment function from the unix java_md.c file
|
* and removes -d<n> options. On unix, there is a possibility that the running
|
||||||
* processes and removes -d<n> options. However, in case
|
* data model may not match to the desired data model, in this case an exec is
|
||||||
* CreateExecutionEnvironment does not need to exec because
|
* required to start the desired model. If the data models match, then
|
||||||
* LD_LIBRARY_PATH is set acceptably and the data model does not need
|
* ParseArguments will remove the -d<n> flags. If the data models do not match
|
||||||
* to be changed, ParseArguments will screen out the redundant -d<n>
|
* the CreateExecutionEnviroment will remove the -d<n> flags.
|
||||||
* options and prevent them from being passed to the vm; this is done
|
|
||||||
* by RemovableOption.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -1891,11 +1889,11 @@ DumpState()
|
||||||
* Return JNI_TRUE for an option string that has no effect but should
|
* Return JNI_TRUE for an option string that has no effect but should
|
||||||
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On
|
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On
|
||||||
* Solaris SPARC, this screening needs to be done if:
|
* Solaris SPARC, this screening needs to be done if:
|
||||||
* 1) LD_LIBRARY_PATH does _not_ need to be reset and
|
* -d32 or -d64 is passed to a binary with an unmatched data model
|
||||||
* 2) -d32 or -d64 is passed to a binary with a matching data model
|
* (the exec in CreateExecutionEnvironment removes -d<n> options and points the
|
||||||
* (the exec in SetLibraryPath removes -d<n> options and points the
|
* exec to the proper binary). In the case of when the data model and the
|
||||||
* exec to the proper binary). When this exec is not done, these options
|
* requested version is matched, an exec would not occur, and these options
|
||||||
* would end up getting passed onto the vm.
|
* were erroneously passed to the vm.
|
||||||
*/
|
*/
|
||||||
jboolean
|
jboolean
|
||||||
RemovableOption(char * option)
|
RemovableOption(char * option)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -51,9 +51,9 @@
|
||||||
* two data models and cohabitation of jre/jdk bits with both data
|
* two data models and cohabitation of jre/jdk bits with both data
|
||||||
* models is supported, then DUAL_MODE is defined. When DUAL_MODE is
|
* models is supported, then DUAL_MODE is defined. When DUAL_MODE is
|
||||||
* defined, the architecture names for the narrow and wide version of
|
* defined, the architecture names for the narrow and wide version of
|
||||||
* the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently
|
* the architecture are defined in LIBARCH64NAME and LIBARCH32NAME.
|
||||||
* only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux
|
* Currently only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE;
|
||||||
* i586/amd64 could be defined as DUAL_MODE but that is not the
|
* linux i586/amd64 could be defined as DUAL_MODE but that is not the
|
||||||
* current policy.
|
* current policy.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -103,49 +103,56 @@ static char *execname = NULL;
|
||||||
* platform independent routine SelectVersion. This may result in
|
* platform independent routine SelectVersion. This may result in
|
||||||
* the exec of the specified launcher version.
|
* the exec of the specified launcher version.
|
||||||
*
|
*
|
||||||
* Typically, the launcher execs at least once to ensure a suitable
|
* Previously the launcher modified the LD_LIBRARY_PATH appropriately for the
|
||||||
* LD_LIBRARY_PATH is in effect for the process. The first exec
|
* desired data model path, regardless if data models matched or not. The
|
||||||
* screens out all the data model options; leaving the choice of data
|
* launcher subsequently exec'ed the desired executable, in order to make the
|
||||||
* model implicit in the binary selected to run. However, in case no
|
* LD_LIBRARY_PATH path available for the runtime linker. This is no longer the
|
||||||
* exec is done, the data model options are screened out before the vm
|
* case, the launcher dlopens the target libjvm.so. All other required
|
||||||
* is invoked.
|
* libraries are loaded by the runtime linker, by virtue of the $ORIGIN paths
|
||||||
|
* baked into the shared libraries, by the build infrastructure at compile time.
|
||||||
*
|
*
|
||||||
* incoming argv ------------------------------
|
* Main
|
||||||
* | |
|
* (incoming argv)
|
||||||
* \|/ |
|
|
||||||
* CheckJVMType |
|
|
||||||
* (removes -client, -server, etc.) |
|
|
||||||
* \|/
|
|
||||||
* CreateExecutionEnvironment
|
|
||||||
* (removes -d32 and -d64,
|
|
||||||
* determines desired data model,
|
|
||||||
* sets up LD_LIBRARY_PATH,
|
|
||||||
* and exec's)
|
|
||||||
* |
|
|
||||||
* --------------------------------------------
|
|
||||||
* |
|
* |
|
||||||
* \|/
|
* \|/
|
||||||
* exec child 1 incoming argv -----------------
|
* SelectVersion
|
||||||
|
* (selects the JRE version, note: not data model)
|
||||||
|
* |
|
||||||
|
* \|/
|
||||||
|
* CreateExecutionEnvironment
|
||||||
|
* (determines desired data model)
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* \|/
|
||||||
|
* Have Desired Model ? --> NO --> Is Dual-Mode ? --> NO --> Exit(with error)
|
||||||
|
* | |
|
||||||
* | |
|
* | |
|
||||||
* \|/ |
|
|
||||||
* CheckJVMType |
|
|
||||||
* (removes -client, -server, etc.) |
|
|
||||||
* | \|/
|
* | \|/
|
||||||
* | CreateExecutionEnvironment
|
* | YES
|
||||||
* | (verifies desired data model
|
* | |
|
||||||
* | is running and acceptable
|
* | |
|
||||||
* | LD_LIBRARY_PATH;
|
* | \|/
|
||||||
* | no-op in child)
|
* | CheckJvmType
|
||||||
|
* | (removes -client, -server etc.)
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* \|/ \|/
|
||||||
|
* YES (find the desired executable and exec child)
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* \|/ \|/
|
||||||
|
* CheckJvmType Main
|
||||||
|
* (removes -client, -server, etc.)
|
||||||
|
* |
|
||||||
* |
|
* |
|
||||||
* \|/
|
* \|/
|
||||||
* TranslateDashJArgs...
|
* TranslateDashJArgs...
|
||||||
* (Prepare to pass args to vm)
|
* (Prepare to pass args to vm)
|
||||||
* |
|
* |
|
||||||
* |
|
* |
|
||||||
* |
|
|
||||||
* \|/
|
* \|/
|
||||||
* ParseArguments
|
* ParseArguments
|
||||||
* (ignores -d32 and -d64,
|
* (removes -d32 and -d64 if any,
|
||||||
* processes version options,
|
* processes version options,
|
||||||
* creates argument list for vm,
|
* creates argument list for vm,
|
||||||
* etc.)
|
* etc.)
|
||||||
|
@ -199,17 +206,13 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
/* Compute/set the name of the executable */
|
/* Compute/set the name of the executable */
|
||||||
SetExecname(*_argvp);
|
SetExecname(*_argvp);
|
||||||
|
|
||||||
/* Set the LD_LIBRARY_PATH environment variable, check data model
|
/* Check data model flags, and exec process, if needed */
|
||||||
flags, and exec process, if needed */
|
|
||||||
{
|
{
|
||||||
char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
|
char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
|
||||||
char * jvmtype = NULL;
|
char * jvmtype = NULL;
|
||||||
int argc = *_argcp;
|
int argc = *_argcp;
|
||||||
char **argv = original_argv;
|
char **argv = original_argv;
|
||||||
|
|
||||||
char *runpath = NULL; /* existing effective LD_LIBRARY_PATH
|
|
||||||
setting */
|
|
||||||
|
|
||||||
int running = CURRENT_DATA_MODEL;
|
int running = CURRENT_DATA_MODEL;
|
||||||
|
|
||||||
int wanted = running; /* What data mode is being
|
int wanted = running; /* What data mode is being
|
||||||
|
@ -217,18 +220,8 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
fine unless another model
|
fine unless another model
|
||||||
is asked for */
|
is asked for */
|
||||||
|
|
||||||
char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */
|
|
||||||
char* newpath = NULL; /* path on new LD_LIBRARY_PATH */
|
|
||||||
char* lastslash = NULL;
|
|
||||||
|
|
||||||
char** newenvp = NULL; /* current environment */
|
|
||||||
|
|
||||||
char** newargv = NULL;
|
char** newargv = NULL;
|
||||||
int newargc = 0;
|
int newargc = 0;
|
||||||
#ifdef __solaris__
|
|
||||||
char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH,
|
|
||||||
Solaris only */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Starting in 1.5, all unix platforms accept the -d32 and -d64
|
* Starting in 1.5, all unix platforms accept the -d32 and -d64
|
||||||
|
@ -306,6 +299,11 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
|
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
|
||||||
exit(4);
|
exit(4);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* we seem to have everything we need, so without further ado
|
||||||
|
* we return back.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
} else { /* do the same speculatively or exit */
|
} else { /* do the same speculatively or exit */
|
||||||
#ifdef DUAL_MODE
|
#ifdef DUAL_MODE
|
||||||
if (running != wanted) {
|
if (running != wanted) {
|
||||||
|
@ -335,190 +333,6 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We will set the LD_LIBRARY_PATH as follows:
|
|
||||||
*
|
|
||||||
* o $JVMPATH (directory portion only)
|
|
||||||
* o $JRE/lib/$LIBARCHNAME
|
|
||||||
* o $JRE/../lib/$LIBARCHNAME
|
|
||||||
*
|
|
||||||
* followed by the user's previous effective LD_LIBRARY_PATH, if
|
|
||||||
* any.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __solaris__
|
|
||||||
/*
|
|
||||||
* Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH
|
|
||||||
* variables:
|
|
||||||
*
|
|
||||||
* 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if
|
|
||||||
* data-model specific variables are not set.
|
|
||||||
*
|
|
||||||
* 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH
|
|
||||||
* for 64-bit binaries.
|
|
||||||
*
|
|
||||||
* 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH
|
|
||||||
* for 32-bit binaries.
|
|
||||||
*
|
|
||||||
* The vm uses LD_LIBRARY_PATH to set the java.library.path system
|
|
||||||
* property. To shield the vm from the complication of multiple
|
|
||||||
* LD_LIBRARY_PATH variables, if the appropriate data model
|
|
||||||
* specific variable is set, we will act as if LD_LIBRARY_PATH had
|
|
||||||
* the value of the data model specific variant and the data model
|
|
||||||
* specific variant will be unset. Note that the variable for the
|
|
||||||
* *wanted* data model must be used (if it is set), not simply the
|
|
||||||
* current running data model.
|
|
||||||
*/
|
|
||||||
|
|
||||||
switch(wanted) {
|
|
||||||
case 0:
|
|
||||||
if(running == 32) {
|
|
||||||
dmpath = getenv("LD_LIBRARY_PATH_32");
|
|
||||||
wanted = 32;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dmpath = getenv("LD_LIBRARY_PATH_64");
|
|
||||||
wanted = 64;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 32:
|
|
||||||
dmpath = getenv("LD_LIBRARY_PATH_32");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 64:
|
|
||||||
dmpath = getenv("LD_LIBRARY_PATH_64");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
JLI_ReportErrorMessage(JRE_ERROR3, __LINE__);
|
|
||||||
exit(1); /* unknown value in wanted */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If dmpath is NULL, the relevant data model specific variable is
|
|
||||||
* not set and normal LD_LIBRARY_PATH should be used.
|
|
||||||
*/
|
|
||||||
if( dmpath == NULL) {
|
|
||||||
runpath = getenv("LD_LIBRARY_PATH");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
runpath = dmpath;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* If not on Solaris, assume only a single LD_LIBRARY_PATH
|
|
||||||
* variable.
|
|
||||||
*/
|
|
||||||
runpath = getenv("LD_LIBRARY_PATH");
|
|
||||||
#endif /* __solaris__ */
|
|
||||||
|
|
||||||
#ifdef __linux
|
|
||||||
/*
|
|
||||||
* On linux, if a binary is running as sgid or suid, glibc sets
|
|
||||||
* LD_LIBRARY_PATH to the empty string for security purposes. (In
|
|
||||||
* contrast, on Solaris the LD_LIBRARY_PATH variable for a
|
|
||||||
* privileged binary does not lose its settings; but the dynamic
|
|
||||||
* linker does apply more scrutiny to the path.) The launcher uses
|
|
||||||
* the value of LD_LIBRARY_PATH to prevent an exec loop.
|
|
||||||
* Therefore, if we are running sgid or suid, this function's
|
|
||||||
* setting of LD_LIBRARY_PATH will be ineffective and we should
|
|
||||||
* return from the function now. Getting the right libraries to
|
|
||||||
* be found must be handled through other mechanisms.
|
|
||||||
*/
|
|
||||||
if((getgid() != getegid()) || (getuid() != geteuid()) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* runpath contains current effective LD_LIBRARY_PATH setting */
|
|
||||||
|
|
||||||
jvmpath = JLI_StringDup(jvmpath);
|
|
||||||
new_runpath = JLI_MemAlloc( ((runpath!=NULL)?JLI_StrLen(runpath):0) +
|
|
||||||
2*JLI_StrLen(jrepath) + 2*JLI_StrLen(arch) +
|
|
||||||
JLI_StrLen(jvmpath) + 52);
|
|
||||||
newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH=");
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create desired LD_LIBRARY_PATH value for target data model.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
/* remove the name of the .so from the JVM path */
|
|
||||||
lastslash = JLI_StrRChr(jvmpath, '/');
|
|
||||||
if (lastslash)
|
|
||||||
*lastslash = '\0';
|
|
||||||
|
|
||||||
|
|
||||||
/* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
|
|
||||||
|
|
||||||
sprintf(new_runpath, "LD_LIBRARY_PATH="
|
|
||||||
"%s:"
|
|
||||||
"%s/lib/%s:"
|
|
||||||
"%s/../lib/%s",
|
|
||||||
jvmpath,
|
|
||||||
#ifdef DUAL_MODE
|
|
||||||
jrepath, GetArchPath(wanted),
|
|
||||||
jrepath, GetArchPath(wanted)
|
|
||||||
#else
|
|
||||||
jrepath, arch,
|
|
||||||
jrepath, arch
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to make sure that the prefix of the current path is the
|
|
||||||
* desired environment variable setting.
|
|
||||||
*/
|
|
||||||
if (runpath != NULL &&
|
|
||||||
JLI_StrNCmp(newpath, runpath, JLI_StrLen(newpath))==0 &&
|
|
||||||
(runpath[JLI_StrLen(newpath)] == 0 || runpath[JLI_StrLen(newpath)] == ':') &&
|
|
||||||
(running == wanted) /* data model does not have to be changed */
|
|
||||||
#ifdef __solaris__
|
|
||||||
&& (dmpath == NULL) /* data model specific variables not set */
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Place the desired environment setting onto the prefix of
|
|
||||||
* LD_LIBRARY_PATH. Note that this prevents any possible infinite
|
|
||||||
* loop of execv() because we test for the prefix, above.
|
|
||||||
*/
|
|
||||||
if (runpath != 0) {
|
|
||||||
JLI_StrCat(new_runpath, ":");
|
|
||||||
JLI_StrCat(new_runpath, runpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( putenv(new_runpath) != 0) {
|
|
||||||
exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set
|
|
||||||
properly */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unix systems document that they look at LD_LIBRARY_PATH only
|
|
||||||
* once at startup, so we have to re-exec the current executable
|
|
||||||
* to get the changed environment variable to have an effect.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __solaris__
|
|
||||||
/*
|
|
||||||
* If dmpath is not NULL, remove the data model specific string
|
|
||||||
* in the environment for the exec'ed child.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if( dmpath != NULL)
|
|
||||||
(void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
newenvp = environ;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
char *newexec = execname;
|
char *newexec = execname;
|
||||||
#ifdef DUAL_MODE
|
#ifdef DUAL_MODE
|
||||||
|
@ -549,17 +363,16 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
argv[0] = newexec;
|
argv[0] = newexec;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
|
||||||
(void)fflush(stdout);
|
(void)fflush(stdout);
|
||||||
(void)fflush(stderr);
|
(void)fflush(stderr);
|
||||||
execve(newexec, argv, newenvp);
|
execv(newexec, argv);
|
||||||
JLI_ReportErrorMessageSys(JRE_ERROR4, newexec);
|
JLI_ReportErrorMessageSys(JRE_ERROR4, newexec);
|
||||||
|
|
||||||
#ifdef DUAL_MODE
|
#ifdef DUAL_MODE
|
||||||
if (running != wanted) {
|
if (running != wanted) {
|
||||||
JLI_ReportErrorMessage(JRE_ERROR5, wanted, running);
|
JLI_ReportErrorMessage(JRE_ERROR5, wanted, running);
|
||||||
# ifdef __solaris__
|
# ifdef __solaris__
|
||||||
|
|
||||||
# ifdef __sparc
|
# ifdef __sparc
|
||||||
JLI_ReportErrorMessage(JRE_ERROR6);
|
JLI_ReportErrorMessage(JRE_ERROR6);
|
||||||
# else
|
# else
|
||||||
|
@ -570,13 +383,11 @@ CreateExecutionEnvironment(int *_argcp,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On Solaris VM choosing is done by the launcher (java.c).
|
* On Solaris VM choosing is done by the launcher (java.c).
|
||||||
*/
|
*/
|
||||||
|
@ -1123,6 +934,7 @@ ExecJRE(char *jre, char **argv)
|
||||||
printf(" %s", argv[i]);
|
printf(" %s", argv[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
|
||||||
(void)fflush(stdout);
|
(void)fflush(stdout);
|
||||||
(void)fflush(stderr);
|
(void)fflush(stderr);
|
||||||
execv(wanted, argv);
|
execv(wanted, argv);
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
* @test
|
* @test
|
||||||
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881
|
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881
|
||||||
* @summary Argument parsing validation.
|
* @summary Argument parsing validation.
|
||||||
* @compile Arrrghs.java TestHelper.java
|
* @compile -XDignore.symbol.file Arrrghs.java TestHelper.java
|
||||||
* @run main Arrrghs
|
* @run main Arrrghs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
358
jdk/test/tools/launcher/ExecutionEnvironment.java
Normal file
358
jdk/test/tools/launcher/ExecutionEnvironment.java
Normal file
|
@ -0,0 +1,358 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 4780570 4731671 6354700 6367077 6670965 4882974
|
||||||
|
* @summary Checks for LD_LIBRARY_PATH and execution on *nixes
|
||||||
|
* @compile -XDignore.symbol.file ExecutionEnvironment.java TestHelper.java
|
||||||
|
* @run main ExecutionEnvironment
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This test tests for various things as follows:
|
||||||
|
* Ensures that:
|
||||||
|
* 1. uneccessary execs do not occur
|
||||||
|
* 2. the environment is pristine, users environment variable wrt.
|
||||||
|
* LD_LIBRARY_PATH if set are not modified in any way.
|
||||||
|
* 3. the correct vm is chosen with -server and -client options
|
||||||
|
* 4. the VM on Solaris correctly interprets the LD_LIBRARY_PATH32
|
||||||
|
* and LD_LIBRARY_PATH64 variables if set by the user, ie.
|
||||||
|
* i. on 32 bit systems:
|
||||||
|
* a. if LD_LIBRARY_PATH32 is set it will override LD_LIBRARY_PATH
|
||||||
|
* b. LD_LIBRARY_PATH64 is ignored if set
|
||||||
|
* ii. on 64 bit systems:
|
||||||
|
* a. if LD_LIBRARY_PATH64 is set it will override LD_LIBRARY_PATH
|
||||||
|
* b. LD_LIBRARY_PATH32 is ignored if set
|
||||||
|
* 5. no extra symlink exists on Solaris ie.
|
||||||
|
* jre/lib/$arch/libjvm.so -> client/libjvm.so
|
||||||
|
* TODO:
|
||||||
|
* a. perhaps we need to add a test to audit all environment variables are
|
||||||
|
* in pristine condition after the launch, there may be a few that the
|
||||||
|
* launcher may add as implementation details.
|
||||||
|
* b. add a pldd for solaris to ensure only one libjvm.so is linked
|
||||||
|
*/
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public class ExecutionEnvironment {
|
||||||
|
static final String LD_LIBRARY_PATH = "LD_LIBRARY_PATH";
|
||||||
|
static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32";
|
||||||
|
static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64";
|
||||||
|
|
||||||
|
// Note: these paths need not exist on the filesytem
|
||||||
|
static final String LD_LIBRARY_PATH_VALUE = "/Bridge/On/The/River/Kwai";
|
||||||
|
static final String LD_LIBRARY_PATH_32_VALUE = "/Lawrence/Of/Arabia";
|
||||||
|
static final String LD_LIBRARY_PATH_64_VALUE = "/A/Passage/To/India";
|
||||||
|
|
||||||
|
static final String JLDEBUG_KEY = "_JAVA_LAUNCHER_DEBUG";
|
||||||
|
static final String EXPECTED_MARKER = "TRACER_MARKER:About to EXEC";
|
||||||
|
|
||||||
|
static final String[] LD_PATH_STRINGS = {
|
||||||
|
LD_LIBRARY_PATH + "=" + LD_LIBRARY_PATH_VALUE,
|
||||||
|
LD_LIBRARY_PATH_32 + "=" + LD_LIBRARY_PATH_32_VALUE,
|
||||||
|
LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE
|
||||||
|
};
|
||||||
|
|
||||||
|
static final File testJarFile = new File("EcoFriendly.jar");
|
||||||
|
|
||||||
|
static int errors = 0;
|
||||||
|
static int passes = 0;
|
||||||
|
|
||||||
|
private static void createTestJar() {
|
||||||
|
try {
|
||||||
|
List<String> codeList = new ArrayList<String>();
|
||||||
|
codeList.add("static void printValue(String name, boolean property) {\n");
|
||||||
|
codeList.add(" String value = (property) ? System.getProperty(name) : System.getenv(name);\n");
|
||||||
|
codeList.add(" System.out.println(name + \"=\" + value);\n");
|
||||||
|
codeList.add("}\n");
|
||||||
|
codeList.add("public static void main(String... args) {\n");
|
||||||
|
codeList.add(" System.out.println(\"Execute test:\");\n");
|
||||||
|
codeList.add(" printValue(\"os.name\", true);\n");
|
||||||
|
codeList.add(" printValue(\"os.arch\", true);\n");
|
||||||
|
codeList.add(" printValue(\"os.version\", true);\n");
|
||||||
|
codeList.add(" printValue(\"sun.arch.data.model\", true);\n");
|
||||||
|
codeList.add(" printValue(\"java.library.path\", true);\n");
|
||||||
|
codeList.add(" printValue(\"" + LD_LIBRARY_PATH + "\", false);\n");
|
||||||
|
codeList.add(" printValue(\"" + LD_LIBRARY_PATH_32 + "\", false);\n");
|
||||||
|
codeList.add(" printValue(\"" + LD_LIBRARY_PATH_64 + "\", false);\n");
|
||||||
|
codeList.add("}\n");
|
||||||
|
String[] clist = new String[codeList.size()];
|
||||||
|
TestHelper.createJar(testJarFile, codeList.toArray(clist));
|
||||||
|
} catch (FileNotFoundException fnfe) {
|
||||||
|
throw new RuntimeException(fnfe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there
|
||||||
|
* should not be any new variables or pollution/mutations of any kind, the
|
||||||
|
* environment should be pristine.
|
||||||
|
*/
|
||||||
|
private static void ensureEcoFriendly() {
|
||||||
|
TestHelper.TestResult tr = null;
|
||||||
|
|
||||||
|
Map<String, String> env = new HashMap<String, String>();
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
String pairs[] = x.split("=");
|
||||||
|
env.put(pairs[0], pairs[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
|
||||||
|
if (!tr.isNotZeroOutput()) {
|
||||||
|
throw new RuntimeException("Error: No output at all. Did the test execute ?");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
if (!tr.contains(x)) {
|
||||||
|
System.out.println("FAIL: did not get <" + x + ">");
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ensures that there are no execs as long as we are in the same
|
||||||
|
* data model
|
||||||
|
*/
|
||||||
|
static void ensureNoExec() {
|
||||||
|
Map<String, String> env = new HashMap<String, String>();
|
||||||
|
env.put(JLDEBUG_KEY, "true");
|
||||||
|
TestHelper.TestResult tr =
|
||||||
|
TestHelper.doExec(env, TestHelper.javaCmd, "-version");
|
||||||
|
if (tr.testOutput.contains(EXPECTED_MARKER)) {
|
||||||
|
System.out.println("FAIL: EnsureNoExecs: found expected warning <" +
|
||||||
|
EXPECTED_MARKER +
|
||||||
|
"> the process execing ?");
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM
|
||||||
|
* and the expected java.library.path behaviour.
|
||||||
|
* For Generic platforms (All *nixes):
|
||||||
|
* * All LD_LIBRARY_PATH variable should be on java.library.path
|
||||||
|
* For Solaris 32-bit
|
||||||
|
* * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified
|
||||||
|
* For Solaris 64-bit
|
||||||
|
* * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void verifyJavaLibraryPath() {
|
||||||
|
TestHelper.TestResult tr = null;
|
||||||
|
|
||||||
|
Map<String, String> env = new HashMap<String, String>();
|
||||||
|
|
||||||
|
|
||||||
|
if (TestHelper.isLinux) {
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
String pairs[] = x.split("=");
|
||||||
|
env.put(pairs[0], pairs[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathGeneric(tr);
|
||||||
|
} else {
|
||||||
|
// no override
|
||||||
|
env.clear();
|
||||||
|
env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathGeneric(tr);
|
||||||
|
|
||||||
|
env.clear();
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
String pairs[] = x.split("=");
|
||||||
|
env.put(pairs[0], pairs[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify the override occurs, since we know the invocation always
|
||||||
|
// uses by default is 32-bit, therefore we also set the test
|
||||||
|
// expectation to be the same.
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathOverride(tr, true);
|
||||||
|
|
||||||
|
// try changing the model from 32 to 64 bit
|
||||||
|
if (TestHelper.java64Cmd != null && TestHelper.is32Bit) {
|
||||||
|
// verify the override occurs
|
||||||
|
env.clear();
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
String pairs[] = x.split("=");
|
||||||
|
env.put(pairs[0], pairs[1]);
|
||||||
|
}
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-d64", "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathOverride(tr, false);
|
||||||
|
|
||||||
|
// no override
|
||||||
|
env.clear();
|
||||||
|
env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathGeneric(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// try changing the model from 64 to 32 bit
|
||||||
|
if (TestHelper.java64Cmd != null && TestHelper.is64Bit) {
|
||||||
|
// verify the override occurs
|
||||||
|
env.clear();
|
||||||
|
for (String x : LD_PATH_STRINGS) {
|
||||||
|
String pairs[] = x.split("=");
|
||||||
|
env.put(pairs[0], pairs[1]);
|
||||||
|
}
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathOverride(tr, true);
|
||||||
|
|
||||||
|
// no override
|
||||||
|
env.clear();
|
||||||
|
env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
|
||||||
|
tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar",
|
||||||
|
testJarFile.getAbsolutePath());
|
||||||
|
verifyJavaLibraryPathGeneric(tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyJavaLibraryPathGeneric(TestHelper.TestResult tr) {
|
||||||
|
if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
|
||||||
|
System.out.print("FAIL: verifyJavaLibraryPath: ");
|
||||||
|
System.out.println(" java.library.path does not contain " +
|
||||||
|
LD_LIBRARY_PATH_VALUE);
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyJavaLibraryPathOverride(TestHelper.TestResult tr,
|
||||||
|
boolean is32Bit) {
|
||||||
|
// make sure the 32/64 bit value exists
|
||||||
|
if (!tr.matches("java.library.path=.*" +
|
||||||
|
(is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) {
|
||||||
|
System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
|
||||||
|
System.out.println(" java.library.path does not contain " +
|
||||||
|
(is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE));
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
// make sure the generic value is absent
|
||||||
|
if (tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
|
||||||
|
System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
|
||||||
|
System.out.println(" java.library.path contains " +
|
||||||
|
LD_LIBRARY_PATH_VALUE);
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ensures we have indeed exec'ed the correct vm of choice, all VMs support
|
||||||
|
* -server, however 32-bit VMs support -client and -server.
|
||||||
|
*/
|
||||||
|
static void verifyVmSelection() {
|
||||||
|
|
||||||
|
TestHelper.TestResult tr = null;
|
||||||
|
|
||||||
|
if (TestHelper.is32Bit) {
|
||||||
|
tr = TestHelper.doExec(TestHelper.javaCmd, "-client", "-version");
|
||||||
|
if (!tr.matches("Java.*Client VM.*")) {
|
||||||
|
System.out.println("FAIL: the expected vm -client did launch");
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tr = TestHelper.doExec(TestHelper.javaCmd, "-server", "-version");
|
||||||
|
if (!tr.matches("Java.*Server VM.*")) {
|
||||||
|
System.out.println("FAIL: the expected vm -server did launch");
|
||||||
|
System.out.println(tr);
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* checks to see there is no extra libjvm.so than needed
|
||||||
|
*/
|
||||||
|
static void verifyNoSymLink() {
|
||||||
|
if (TestHelper.is64Bit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
File symLink = null;
|
||||||
|
String libPathPrefix = TestHelper.isSDK ? "jre/lib" : "/lib";
|
||||||
|
symLink = new File(TestHelper.JAVAHOME, libPathPrefix +
|
||||||
|
TestHelper.getJreArch() + "/libjvm.so");
|
||||||
|
if (symLink.exists()) {
|
||||||
|
System.out.println("FAIL: The symlink exists " +
|
||||||
|
symLink.getAbsolutePath());
|
||||||
|
errors++;
|
||||||
|
} else {
|
||||||
|
passes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
if (TestHelper.isWindows) {
|
||||||
|
System.out.println("Warning: noop on windows");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// create our test jar first
|
||||||
|
createTestJar();
|
||||||
|
ensureNoExec();
|
||||||
|
verifyVmSelection();
|
||||||
|
ensureEcoFriendly();
|
||||||
|
verifyJavaLibraryPath();
|
||||||
|
verifyNoSymLink();
|
||||||
|
if (errors > 0) {
|
||||||
|
throw new Exception("ExecutionEnvironment: FAIL: with " +
|
||||||
|
errors + " errors and passes " + passes );
|
||||||
|
} else {
|
||||||
|
System.out.println("ExecutionEnvironment: PASS " + passes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,219 +0,0 @@
|
||||||
# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
# have any questions.
|
|
||||||
|
|
||||||
# @test
|
|
||||||
# @bug 4780570
|
|
||||||
# @run shell SolarisDataModel.sh
|
|
||||||
# @summary Verify Solaris SPARC -d32 and -d64 options work with preset LD_LIBRARY_PATH
|
|
||||||
# @author Joseph D. Darcy
|
|
||||||
|
|
||||||
# Test to see if presetting LD_LIBRARY_PATH affects the treatment of
|
|
||||||
# -d32 and -d64 options; also checks that -d<n> options result in the
|
|
||||||
# desired data model.
|
|
||||||
|
|
||||||
# If the test is not being run on a Solaris SPARC box SPARC the test
|
|
||||||
# succeeds immediately.
|
|
||||||
|
|
||||||
OS=`uname -s`;
|
|
||||||
|
|
||||||
case "$OS" in
|
|
||||||
SunOS )
|
|
||||||
# ARCH should be sparc or i386
|
|
||||||
ARCH=`uname -p`
|
|
||||||
case "$ARCH" in
|
|
||||||
sparc)
|
|
||||||
PATHSEP=":"
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Non-SPARC Solaris environment; test vacuously succeeds."
|
|
||||||
exit 0
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Not a Solaris SPARC environment; test vacuously succeeds."
|
|
||||||
exit 0;
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
# Verify directory context variables are set
|
|
||||||
if [ "${TESTJAVA}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTJAVA not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${TESTSRC}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTSRC not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "${TESTCLASSES}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTCLASSES not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
JAVAC="$TESTJAVA/bin/javac"
|
|
||||||
|
|
||||||
# Create our little Java tests on the fly
|
|
||||||
( printf "public class GetDataModel {"
|
|
||||||
printf " public static void main(String argv[]) {"
|
|
||||||
printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));"
|
|
||||||
printf " }"
|
|
||||||
printf "}"
|
|
||||||
) > GetDataModel.java
|
|
||||||
|
|
||||||
$JAVAC GetDataModel.java
|
|
||||||
|
|
||||||
( printf "public class GetLdLibraryPath {"
|
|
||||||
printf " public static void main(String argv[]) {"
|
|
||||||
printf " System.out.println(System.getProperty(\"java.library.path\"));"
|
|
||||||
printf " }"
|
|
||||||
printf "}"
|
|
||||||
) > GetLdLibraryPath.java
|
|
||||||
|
|
||||||
$JAVAC GetLdLibraryPath.java
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# All preconditions are met; run the tests
|
|
||||||
|
|
||||||
|
|
||||||
# Construct path to 32-bit Java executable
|
|
||||||
JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}."
|
|
||||||
|
|
||||||
|
|
||||||
# Construct path to 64-bit Java executable, might not exist
|
|
||||||
JAVA64="$TESTJAVA/bin/sparcv9/java -classpath $TESTCLASSES${PATHSEP}."
|
|
||||||
JAVA64FILE="$TESTJAVA/bin/sparcv9/java"
|
|
||||||
|
|
||||||
|
|
||||||
# java -d32 tests
|
|
||||||
|
|
||||||
LD_LIBRARY_PATH=""
|
|
||||||
export LD_LIBRARY_PATH
|
|
||||||
|
|
||||||
DM=`$JAVA -d32 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
32 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"java -d32\" failed."
|
|
||||||
echo $DM
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Rerun test with LD_LIBRARY_PATH preset
|
|
||||||
LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`;
|
|
||||||
DM=`$JAVA -d32 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
32 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"java -d32\" failed with preset LD_LIBRARY_PATH."
|
|
||||||
echo $DM
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Reset LD_LIBRARY_PATH
|
|
||||||
LD_LIBRARY_PATH=
|
|
||||||
|
|
||||||
|
|
||||||
# Test for 64-bit executable
|
|
||||||
|
|
||||||
if [ -f $JAVA64FILE ]; then
|
|
||||||
|
|
||||||
DM=`$JAVA -d64 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
64 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"java -d64\" failed."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
DM=`$JAVA64 -d32 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
32 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"sparcv9/java -d32\" failed."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
DM=`$JAVA64 -d64 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
64 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"sparcv9/java -d64\" failed."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Rerun tests with LD_LIBRARY_PATH preset
|
|
||||||
LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`;
|
|
||||||
echo "Presetting LD_LIBRARY_PATH"
|
|
||||||
|
|
||||||
DM=`$JAVA -d64 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
64 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"java -d64\" failed with preset LD_LIBRARY_PATH."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
DM=`$JAVA64 -d32 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
32 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"sparcv9/java -d32\" failed with preset LD_LIBRARY_PATH."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
DM=`$JAVA64 -d64 GetDataModel`
|
|
||||||
case "$DM" in
|
|
||||||
64 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "The combination \"sparcv9/java -d64\" failed with preset LD_LIBRARY_PATH."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
else
|
|
||||||
echo "Warning: no 64-bit components found; only java -d32 tests have been run."
|
|
||||||
fi
|
|
||||||
exit 0;
|
|
|
@ -1,221 +0,0 @@
|
||||||
# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
# have any questions.
|
|
||||||
|
|
||||||
|
|
||||||
# @test
|
|
||||||
# @bug 4731671
|
|
||||||
# @build libraryCaller
|
|
||||||
# @run shell SolarisRunpath.sh
|
|
||||||
# @summary Verify that Solaris LD_LIBRARY_PATH rules are followed
|
|
||||||
# @author Joseph D. Darcy
|
|
||||||
|
|
||||||
# The launcher has been updated to properly take account of Solaris
|
|
||||||
# LD_LIBRARY_PATH rules when constructing the runpath for the Java
|
|
||||||
# executable. That is, data model dependent LD_LIBRARY_PATH variables
|
|
||||||
# are tested for and override LD_LIBRARY_PATH if present. The current
|
|
||||||
# launcher design relies on LD_LIBRARY_PATH settings to ensure the
|
|
||||||
# proper jre/jdk libraries are opening during program execution. In
|
|
||||||
# the future, this dependence might be removed by having the vm
|
|
||||||
# explicitly dlopen the needed files. If that change occurs, this
|
|
||||||
# test will be harmless but no long relevant.
|
|
||||||
|
|
||||||
# A more robust test for Solaris SPARC would set the different
|
|
||||||
# LD_LIBRARY_PATH variables while also varying the -d[32|64] options
|
|
||||||
# to make sure the LD_LIBRARY_PATH of the *target* data model were
|
|
||||||
# being respected. That is "java -d64" should use the 64-bit
|
|
||||||
# LD_LIBRARY_PATH while "java -d32" should use the 32-bit
|
|
||||||
# LD_LIBRARY_PATH regardless of the data model of the "java" binary.
|
|
||||||
# However, by default builds do not contain both 32 and 64 bit
|
|
||||||
# components so such a test would often not be applicable.
|
|
||||||
|
|
||||||
|
|
||||||
# If the test is not being run on a Solaris box, SPARC or x86, the
|
|
||||||
# test succeeds immediately.
|
|
||||||
|
|
||||||
OS=`uname -s`;
|
|
||||||
|
|
||||||
case "$OS" in
|
|
||||||
SunOS )
|
|
||||||
PATHSEP=":"
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Not a Solaris environment; test vacuously succeeds."
|
|
||||||
exit 0;
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Verify directory context variables are set
|
|
||||||
if [ "${TESTJAVA}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTJAVA not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${TESTSRC}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTSRC not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "${TESTCLASSES}" = "" ]
|
|
||||||
then
|
|
||||||
echo "TESTCLASSES not set. Test cannot execute. Failed."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Construct paths to default Java executables
|
|
||||||
JAVAC="$TESTJAVA/bin/javac"
|
|
||||||
|
|
||||||
|
|
||||||
# Create our little Java test on the fly
|
|
||||||
( printf "public class GetDataModel {"
|
|
||||||
printf " public static void main(String argv[]) {"
|
|
||||||
printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));"
|
|
||||||
printf " }"
|
|
||||||
printf "}"
|
|
||||||
) > GetDataModel.java
|
|
||||||
|
|
||||||
$JAVAC GetDataModel.java
|
|
||||||
|
|
||||||
|
|
||||||
# ARCH should be sparc or i386
|
|
||||||
ARCH=`uname -p`
|
|
||||||
case "$ARCH" in
|
|
||||||
sparc | i386 )
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Unrecognized architecture; test fails."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
# The following construction may not work as desired in a
|
|
||||||
# 64-bit build.
|
|
||||||
JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}."
|
|
||||||
|
|
||||||
# Determine data model
|
|
||||||
DM=`$JAVA GetDataModel`
|
|
||||||
|
|
||||||
# verify DM is 32 or 64
|
|
||||||
case "$DM" in
|
|
||||||
32 )
|
|
||||||
ODM=64;
|
|
||||||
;;
|
|
||||||
|
|
||||||
64 )
|
|
||||||
ODM=32;
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Unknown data model \"$DM\"; test fails."
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
# -------------------- Test 1 --------------------
|
|
||||||
|
|
||||||
LD_LIBRARY_PATH=$TESTSRC/lib/$ARCH/lib$DM
|
|
||||||
export LD_LIBRARY_PATH
|
|
||||||
unset LD_LIBRARY_PATH_32
|
|
||||||
unset LD_LIBRARY_PATH_64
|
|
||||||
|
|
||||||
# With plain LD_LIBRARY_PATH, result should always be 0
|
|
||||||
RESULT=`$JAVA libraryCaller`
|
|
||||||
if [ "${RESULT}" != "0" ];
|
|
||||||
then
|
|
||||||
echo "Not using LD_LIBRARY_PATH; test fails."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The following two tests sets both data model dependent
|
|
||||||
# LD_LIBRARY_PATH variables individually.
|
|
||||||
|
|
||||||
# -------------------- Test 2 --------------------
|
|
||||||
|
|
||||||
# Set opposite data model variable; should return same result
|
|
||||||
# as plain LD_LIBRARY_PATH.
|
|
||||||
|
|
||||||
if [ "${DM}" = "32" ]; then
|
|
||||||
LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_64
|
|
||||||
else
|
|
||||||
LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_32
|
|
||||||
fi
|
|
||||||
|
|
||||||
RESULT=`$JAVA libraryCaller`
|
|
||||||
if [ "${RESULT}" != "0" ];
|
|
||||||
then
|
|
||||||
echo "Using LD_LIBRARY_PATH_$ODM for $DM binary;"
|
|
||||||
echo "test fails."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
unset LD_LIBRARY_PATH_32
|
|
||||||
unset LD_LIBRARY_PATH_64
|
|
||||||
|
|
||||||
# -------------------- Test 3 --------------------
|
|
||||||
|
|
||||||
# Set appropriate data model variable; result should match
|
|
||||||
# data model.
|
|
||||||
if [ "${DM}" = "32" ]; then
|
|
||||||
LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_32
|
|
||||||
else
|
|
||||||
LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_64
|
|
||||||
fi
|
|
||||||
|
|
||||||
RESULT=`$JAVA libraryCaller`
|
|
||||||
if [ "${RESULT}" != "$DM" ];
|
|
||||||
then
|
|
||||||
echo "Data model dependent LD_LIBRARY_PATH_$DM"
|
|
||||||
echo "not overriding LD_LIBRARY_PATH; test fails."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
unset LD_LIBRARY_PATH
|
|
||||||
unset LD_LIBRARY_PATH_32
|
|
||||||
unset LD_LIBRARY_PATH_64
|
|
||||||
|
|
||||||
# -------------------- Test 4 --------------------
|
|
||||||
|
|
||||||
# Have only data model dependent LD_LIBRARY_PATH set; result
|
|
||||||
# should match data model.
|
|
||||||
|
|
||||||
if [ "${DM}" = "32" ]; then
|
|
||||||
LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_32
|
|
||||||
else
|
|
||||||
LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
|
|
||||||
export LD_LIBRARY_PATH_64
|
|
||||||
fi
|
|
||||||
|
|
||||||
RESULT=`$JAVA libraryCaller`
|
|
||||||
if [ "${RESULT}" != "$DM" ];
|
|
||||||
then
|
|
||||||
echo "Not using data-model dependent LD_LIBRARY_PATH; test fails."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# All tests have passed
|
|
||||||
exit 0
|
|
|
@ -39,18 +39,36 @@ import javax.tools.JavaCompiler;
|
||||||
*/
|
*/
|
||||||
public enum TestHelper {
|
public enum TestHelper {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
static final String JAVAHOME = System.getProperty("java.home", ".");
|
static final String JAVAHOME = System.getProperty("java.home");
|
||||||
static final boolean isSDK = JAVAHOME.endsWith("jre");
|
static final boolean isSDK = JAVAHOME.endsWith("jre");
|
||||||
static final String javaCmd;
|
static final String javaCmd;
|
||||||
|
static final String java64Cmd;
|
||||||
static final String javacCmd;
|
static final String javacCmd;
|
||||||
static final JavaCompiler compiler;
|
static final JavaCompiler compiler;
|
||||||
|
|
||||||
static final boolean debug = Boolean.getBoolean("Arrrghs.Debug");
|
static final boolean debug = Boolean.getBoolean("TestHelper.Debug");
|
||||||
static final boolean isWindows =
|
static final boolean isWindows =
|
||||||
System.getProperty("os.name", "unknown").startsWith("Windows");
|
System.getProperty("os.name", "unknown").startsWith("Windows");
|
||||||
|
static final boolean is64Bit =
|
||||||
|
System.getProperty("sun.arch.data.model").equals("64");
|
||||||
|
static final boolean is32Bit =
|
||||||
|
System.getProperty("sun.arch.data.model").equals("32");
|
||||||
|
static final boolean isSolaris =
|
||||||
|
System.getProperty("os.name", "unknown").startsWith("SunOS");
|
||||||
|
static final boolean isLinux =
|
||||||
|
System.getProperty("os.name", "unknown").startsWith("Linux");
|
||||||
|
static final boolean isDualMode = isSolaris;
|
||||||
|
static final boolean isSparc = System.getProperty("os.arch").startsWith("sparc");
|
||||||
|
|
||||||
static int testExitValue = 0;
|
static int testExitValue = 0;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
if (is64Bit && is32Bit) {
|
||||||
|
throw new RuntimeException("arch model cannot be both 32 and 64 bit");
|
||||||
|
}
|
||||||
|
if (!is64Bit && !is32Bit) {
|
||||||
|
throw new RuntimeException("arch model is not 32 or 64 bit ?");
|
||||||
|
}
|
||||||
compiler = ToolProvider.getSystemJavaCompiler();
|
compiler = ToolProvider.getSystemJavaCompiler();
|
||||||
File binDir = (isSDK) ? new File((new File(JAVAHOME)).getParentFile(), "bin")
|
File binDir = (isSDK) ? new File((new File(JAVAHOME)).getParentFile(), "bin")
|
||||||
: new File(JAVAHOME, "bin");
|
: new File(JAVAHOME, "bin");
|
||||||
|
@ -69,6 +87,33 @@ public enum TestHelper {
|
||||||
if (!javacCmdFile.canExecute()) {
|
if (!javacCmdFile.canExecute()) {
|
||||||
throw new RuntimeException("java <" + javacCmd + "> must exist");
|
throw new RuntimeException("java <" + javacCmd + "> must exist");
|
||||||
}
|
}
|
||||||
|
if (isSolaris) {
|
||||||
|
File sparc64BinDir = new File(binDir,isSparc ? "sparcv9" : "amd64");
|
||||||
|
File java64CmdFile= new File(sparc64BinDir, "java");
|
||||||
|
if (java64CmdFile.exists() && java64CmdFile.canExecute()) {
|
||||||
|
java64Cmd = java64CmdFile.getAbsolutePath();
|
||||||
|
} else {
|
||||||
|
java64Cmd = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
java64Cmd = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* usually the jre/lib/arch-name is the same as os.arch, except for x86.
|
||||||
|
*/
|
||||||
|
static String getJreArch() {
|
||||||
|
String arch = System.getProperty("os.arch");
|
||||||
|
return arch.equals("x86") ? "i386" : arch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A convenience method to create a jar with jar file name and defs
|
||||||
|
*/
|
||||||
|
static void createJar(File jarName, String... mainDefs)
|
||||||
|
throws FileNotFoundException{
|
||||||
|
createJar(null, jarName, new File("Foo"), mainDefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -123,16 +168,23 @@ public enum TestHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static TestResult doExec(String...cmds) {
|
||||||
|
return doExec(null, cmds);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A method which executes a java cmd and returns the results in a container
|
* A method which executes a java cmd and returns the results in a container
|
||||||
*/
|
*/
|
||||||
static TestResult doExec(String...cmds) {
|
static TestResult doExec(Map<String, String> envToSet, String...cmds) {
|
||||||
String cmdStr = "";
|
String cmdStr = "";
|
||||||
for (String x : cmds) {
|
for (String x : cmds) {
|
||||||
cmdStr = cmdStr.concat(x + " ");
|
cmdStr = cmdStr.concat(x + " ");
|
||||||
}
|
}
|
||||||
ProcessBuilder pb = new ProcessBuilder(cmds);
|
ProcessBuilder pb = new ProcessBuilder(cmds);
|
||||||
Map<String, String> env = pb.environment();
|
Map<String, String> env = pb.environment();
|
||||||
|
if (envToSet != null) {
|
||||||
|
env.putAll(envToSet);
|
||||||
|
}
|
||||||
BufferedReader rdr = null;
|
BufferedReader rdr = null;
|
||||||
try {
|
try {
|
||||||
List<String> outputList = new ArrayList<String>();
|
List<String> outputList = new ArrayList<String>();
|
||||||
|
@ -163,21 +215,25 @@ public enum TestHelper {
|
||||||
List<String> testOutput;
|
List<String> testOutput;
|
||||||
|
|
||||||
public TestResult(String str, int rv, List<String> oList) {
|
public TestResult(String str, int rv, List<String> oList) {
|
||||||
status = new StringBuilder(str);
|
status = new StringBuilder("Executed command: " + str + "\n");
|
||||||
exitValue = rv;
|
exitValue = rv;
|
||||||
testOutput = oList;
|
testOutput = oList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void appendStatus(String x) {
|
||||||
|
status = status.append(" " + x + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
void checkNegative() {
|
void checkNegative() {
|
||||||
if (exitValue == 0) {
|
if (exitValue == 0) {
|
||||||
status = status.append(" Error: test must not return 0 exit value");
|
appendStatus("Error: test must not return 0 exit value");
|
||||||
testExitValue++;
|
testExitValue++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkPositive() {
|
void checkPositive() {
|
||||||
if (exitValue != 0) {
|
if (exitValue != 0) {
|
||||||
status = status.append(" Error: test did not return 0 exit value");
|
appendStatus("Error: test did not return 0 exit value");
|
||||||
testExitValue++;
|
testExitValue++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,7 +244,7 @@ public enum TestHelper {
|
||||||
|
|
||||||
boolean isZeroOutput() {
|
boolean isZeroOutput() {
|
||||||
if (!testOutput.isEmpty()) {
|
if (!testOutput.isEmpty()) {
|
||||||
status = status.append(" Error: No message from cmd please");
|
appendStatus("Error: No message from cmd please");
|
||||||
testExitValue++;
|
testExitValue++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -197,19 +253,20 @@ public enum TestHelper {
|
||||||
|
|
||||||
boolean isNotZeroOutput() {
|
boolean isNotZeroOutput() {
|
||||||
if (testOutput.isEmpty()) {
|
if (testOutput.isEmpty()) {
|
||||||
status = status.append(" Error: Missing message");
|
appendStatus("Error: Missing message");
|
||||||
testExitValue++;
|
testExitValue++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (debug) {
|
status = status.append("++++Test Output Begin++++\n");
|
||||||
for (String x : testOutput) {
|
for (String x : testOutput) {
|
||||||
status = status.append(x + "\n");
|
appendStatus(x);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
status = status.append("++++Test Output End++++\n");
|
||||||
return status.toString();
|
return status.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +276,18 @@ public enum TestHelper {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
status = status.append(" Error: string <" + str + "> not found ");
|
appendStatus("Error: string <" + str + "> not found");
|
||||||
|
testExitValue++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean matches(String stringToMatch) {
|
||||||
|
for (String x : testOutput) {
|
||||||
|
if (x.matches(stringToMatch)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appendStatus("Error: string <" + stringToMatch + "> not found");
|
||||||
testExitValue++;
|
testExitValue++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
* have any questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Indictly used by SolarisRunpath.sh; this file is used to generate
|
|
||||||
* the shared objects:
|
|
||||||
*
|
|
||||||
* ./lib/sparc/lib32/liblibrary.so
|
|
||||||
* ./lib/sparc/lib32/lib32/liblibrary.so
|
|
||||||
*
|
|
||||||
* ./lib/sparc/lib64/liblibrary.so
|
|
||||||
* ./lib/sparc/lib64/lib64/liblibrary.so
|
|
||||||
*
|
|
||||||
* ./lib/i386/lib32/liblibrary.so
|
|
||||||
* ./lib/i386/lib32/lib32/liblibrary.so
|
|
||||||
*
|
|
||||||
* The function defined below returns either 0 or the size of an
|
|
||||||
* integer in the data model used to compile the file (32 for ILP; 64
|
|
||||||
* for LP). The libraries in ./lib/$ARCH/lib$DM return 0; those in
|
|
||||||
* ./lib/$ARCH/lib$DM/lib$DM return 32 or 64.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <jni.h>
|
|
||||||
#include "libraryCaller.h"
|
|
||||||
|
|
||||||
#ifndef RETURN_VALUE
|
|
||||||
#define RETURN_VALUE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_libraryCaller_number
|
|
||||||
(JNIEnv *je, jclass jc) {
|
|
||||||
return RETURN_VALUE;
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
* have any questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
|
||||||
|
|
||||||
#include <jni.h>
|
|
||||||
/* Header for class libraryCaller */
|
|
||||||
|
|
||||||
#ifndef _Included_libraryCaller
|
|
||||||
#define _Included_libraryCaller
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Class: libraryCaller
|
|
||||||
* Method: number
|
|
||||||
* Signature: ()I
|
|
||||||
*/
|
|
||||||
JNIEXPORT jint JNICALL Java_libraryCaller_number
|
|
||||||
(JNIEnv *, jclass);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
* have any questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Used by SolarisRunpath.sh to help test if the launcher fully
|
|
||||||
* respects Solaris LD_LIBRARY_PATH semantics. The ./lib directory is
|
|
||||||
* structured so that the results of the dynamically linked number
|
|
||||||
* method varies depending on the value the data model dependent
|
|
||||||
* LD_LIBRARY_PATH variable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class libraryCaller {
|
|
||||||
static {
|
|
||||||
System.loadLibrary("library");
|
|
||||||
}
|
|
||||||
static native int number();
|
|
||||||
|
|
||||||
public static void main(String argv[]) {
|
|
||||||
System.out.println(number());
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue