From 14198f502f0a721e479adc754a2c7d94b665fbe6 Mon Sep 17 00:00:00 2001 From: Joachim Kern Date: Fri, 17 May 2024 08:31:41 +0000 Subject: [PATCH] 8329653: JLILaunchTest fails on AIX after JDK-8329131 Reviewed-by: clanger, mdoerr --- src/java.base/unix/native/libjli/java_md.c | 11 +++++ src/java.base/unix/native/libjli/java_md.h | 1 + .../unix/native/libjli/java_md_common.c | 43 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/java.base/unix/native/libjli/java_md.c b/src/java.base/unix/native/libjli/java_md.c index d2c04d8c25da9..2a1a4e7795a2e 100644 --- a/src/java.base/unix/native/libjli/java_md.c +++ b/src/java.base/unix/native/libjli/java_md.c @@ -516,6 +516,17 @@ GetJREPath(char *path, jint pathsize, jboolean speculative) } } +#if defined(AIX) + /* at least on AIX try also the LD_LIBRARY_PATH / LIBPATH */ + if (GetApplicationHomeFromLibpath(path, pathsize)) { + JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/" JAVA_DLL, path); + if (stat(libjava, &s) == 0) { + JLI_TraceLauncher("JRE path is %s\n", path); + return JNI_TRUE; + } + } +#endif + if (!speculative) JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; diff --git a/src/java.base/unix/native/libjli/java_md.h b/src/java.base/unix/native/libjli/java_md.h index e3600f6734775..acc75ab091d30 100644 --- a/src/java.base/unix/native/libjli/java_md.h +++ b/src/java.base/unix/native/libjli/java_md.h @@ -60,6 +60,7 @@ static jboolean GetJVMPath(const char *jrepath, const char *jvmtype, static jboolean GetJREPath(char *path, jint pathsize, jboolean speculative); #if defined(_AIX) +jboolean GetApplicationHomeFromLibpath(char *buf, jint bufsize); #include "java_md_aix.h" #endif diff --git a/src/java.base/unix/native/libjli/java_md_common.c b/src/java.base/unix/native/libjli/java_md_common.c index 488b7382b7ce2..511519ae362ff 100644 --- a/src/java.base/unix/native/libjli/java_md_common.c +++ b/src/java.base/unix/native/libjli/java_md_common.c @@ -25,6 +25,8 @@ #include #include "java.h" +#define JAVA_DLL "libjava.so" + /* * Find the last occurrence of a string */ @@ -108,6 +110,47 @@ GetApplicationHomeFromDll(char *buf, jint bufsize) return JNI_FALSE; } +#if defined(AIX) +static jboolean +LibjavaExists(const char *path) +{ + char tmp[PATH_MAX + 1]; + struct stat statbuf; + JLI_Snprintf(tmp, PATH_MAX, "%s/%s", path, JAVA_DLL); + if (stat(tmp, &statbuf) == 0) { + return JNI_TRUE; + } + return JNI_FALSE; +} + +/* + * Retrieves the path to the JRE home by locating libjava.so in + * LIBPATH and then truncating the path to it. + */ +jboolean +GetApplicationHomeFromLibpath(char *buf, jint bufsize) +{ + char *env = getenv("LIBPATH"); + char *tmp; + char *save_ptr = NULL; + char *envpath = JLI_StringDup(env); + for (tmp = strtok_r(envpath, ":", &save_ptr); tmp != NULL; tmp = strtok_r(NULL, ":", &save_ptr)) { + if (LibjavaExists(tmp)) { + char *path = realpath(tmp, buf); + if (path == buf) { + JLI_StrCat(buf, "/"); + if (JNI_TRUE == TruncatePath(buf, JNI_TRUE)) { + JLI_MemFree(envpath); + return JNI_TRUE; + } + } + } + } + JLI_MemFree(envpath); + return JNI_FALSE; +} +#endif + /* * Return true if the named program exists */