/* * Find path to JRE based on .exe's location or registry settings. */ static jboolean GetJREPath(char *path, jint pathsize) { char libjava[MAXPATHLEN]; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ sprintf(libjava, "%s/lib/%s/" JAVA_DLL, path, GetArch()); if (access(libjava, F_OK) == 0) { goto found; } /* Does the app ship a private JRE in <apphome>/jre directory? */ sprintf(libjava, "%s/jre/lib/%s/" JAVA_DLL, path, GetArch()); if (access(libjava, F_OK) == 0) { strcat(path, "/jre"); goto found; } } fprintf(stderr, "Error: could not find " JAVA_DLL "\n"); return JNI_FALSE; found: if (debug) printf("JRE path is %s\n", path); return JNI_TRUE; }
/* * Find path to JRE based on .exe's location or registry settings. */ jboolean GetJREPath(char *path, jint pathsize) { char javadll[MAXPATHLEN]; struct stat s; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ sprintf(javadll, "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { goto found; } /* Does this app ship a private JRE in <apphome>\jre directory? */ sprintf(javadll, "%s\\jre\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { strcat(path, "\\jre"); goto found; } } /* Look for a public JRE on this machine. */ if (GetPublicJREHome(path, pathsize)) { goto found; } fprintf(stderr, "Error: could not find " JAVA_DLL "\n"); return JNI_FALSE; found: if (_launcher_debug) printf("JRE path is %s\n", path); return JNI_TRUE; }
/* * Find path to JRE based on .exe's location or registry settings. */ static jboolean GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative) { char libjava[MAXPATHLEN]; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/%s/" JAVA_DLL, path, arch); if (access(libjava, F_OK) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } /* Does the app ship a private JRE in <apphome>/jre directory? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/jre/lib/%s/" JAVA_DLL, path, arch); if (access(libjava, F_OK) == 0) { JLI_StrCat(path, "/jre"); JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } if (!speculative) JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; }
/* * Find path to JRE based on .exe's location or registry settings. */ jboolean GetJREPath(char *path, jint pathsize) { char javadll[MAXPATHLEN]; struct stat s; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ JLI_Snprintf(javadll, sizeof(javadll), "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } /* Does this app ship a private JRE in <apphome>\jre directory? */ JLI_Snprintf(javadll, sizeof (javadll), "%s\\jre\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { JLI_StrCat(path, "\\jre"); JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } /* Look for a public JRE on this machine. */ if (GetPublicJREHome(path, pathsize)) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; }
jboolean GetJREPath(char *path, jint pathsize) { char javadll[MAXPATHLEN]; struct stat s; if (GetApplicationHome(path, pathsize)) { // Is JRE co-located with the application? sprintf_s(javadll, sizeof javadll, "%s\\bin\\"JAVA_DLL, path); if (stat(javadll, &s) == 0) { goto found; } // Does this app ship a private JRE in <apphome>\jre directory? sprintf_s(javadll, sizeof javadll, "%s\\jre\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { strcat_s(path, pathsize, "\\jre"); goto found; } } // Look for a public JRE on this machine. if (GetPublicJREHome(path, pathsize)) { goto found; } return JNI_FALSE; found: return JNI_TRUE; }
/* * Find path to JRE based on .exe's location or registry settings. */ static jboolean GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative) { char libjava[MAXPATHLEN]; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/" JAVA_DLL, path); if (access(libjava, F_OK) == 0) { return JNI_TRUE; } /* ensure storage for path + /jre + NULL */ if ((JLI_StrLen(path) + 4 + 1) > pathsize) { JLI_TraceLauncher("Insufficient space to store JRE path\n"); return JNI_FALSE; } /* Does the app ship a private JRE in <apphome>/jre directory? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/jre/lib/" JAVA_DLL, path); if (access(libjava, F_OK) == 0) { JLI_StrCat(path, "/jre"); JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } /* try to find ourselves instead */ Dl_info selfInfo; dladdr(&GetJREPath, &selfInfo); char *realPathToSelf = realpath(selfInfo.dli_fname, path); if (realPathToSelf != path) { return JNI_FALSE; } size_t pathLen = strlen(realPathToSelf); if (pathLen == 0) { return JNI_FALSE; } const char lastPathComponent[] = "/lib/jli/libjli.dylib"; size_t sizeOfLastPathComponent = sizeof(lastPathComponent) - 1; if (pathLen < sizeOfLastPathComponent) { return JNI_FALSE; } size_t indexOfLastPathComponent = pathLen - sizeOfLastPathComponent; if (0 == strncmp(realPathToSelf + indexOfLastPathComponent, lastPathComponent, sizeOfLastPathComponent - 1)) { realPathToSelf[indexOfLastPathComponent + 1] = '\0'; return JNI_TRUE; } if (!speculative) JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; }
/* * Find path to JRE based on .exe's location or registry settings. */ jboolean GetJREPath(char *path, jint pathsize) { char javadll[MAXPATHLEN]; struct stat s; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ JLI_Snprintf(javadll, sizeof(javadll), "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } /* ensure storage for path + \jre + NULL */ if ((JLI_StrLen(path) + 4 + 1) > (size_t) pathsize) { JLI_TraceLauncher("Insufficient space to store JRE path\n"); return JNI_FALSE; } /* Does this app ship a private JRE in <apphome>\jre directory? */ JLI_Snprintf(javadll, sizeof (javadll), "%s\\jre\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { JLI_StrCat(path, "\\jre"); JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } /* Try getting path to JRE from path to JLI.DLL */ if (GetApplicationHomeFromDll(path, pathsize)) { JLI_Snprintf(javadll, sizeof(javadll), "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } #ifdef USE_REGISTRY_LOOKUP /* Lookup public JRE using Windows registry. */ if (GetPublicJREHome(path, pathsize)) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } #endif JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; }
/* * For our tools, we try to add 3 VM options: * -Denv.class.path=<envcp> * -Dapplication.home=<apphome> * -Djava.class.path=<appcp> * <envcp> is the user's setting of CLASSPATH -- for instance the user * tells javac where to find binary classes through this environment * variable. Notice that users will be able to compile against our * tools classes (sun.tools.javac.Main) only if they explicitly add * tools.jar to CLASSPATH. * <apphome> is the directory where the application is installed. * <appcp> is the classpath to where our apps' classfiles are. */ static jboolean AddApplicationOptions() { const int NUM_APP_CLASSPATH = (sizeof(app_classpath) / sizeof(char *)); char *s, *envcp, *appcp, *apphome; char home[MAXPATHLEN]; /* application home */ char separator[] = { PATH_SEPARATOR, '\0' }; int size, i; int strlenHome; s = getenv("CLASSPATH"); if (s) { /* 40 for -Denv.class.path= */ envcp = (char *)MemAlloc(strlen(s) + 40); sprintf(envcp, "-Denv.class.path=%s", s); AddOption(envcp, NULL); } if (!GetApplicationHome(home, sizeof(home))) { ReportErrorMessage("Can't determine application home", JNI_TRUE); return JNI_FALSE; } /* 40 for '-Dapplication.home=' */ apphome = (char *)MemAlloc(strlen(home) + 40); sprintf(apphome, "-Dapplication.home=%s", home); AddOption(apphome, NULL); /* How big is the application's classpath? */ size = 40; /* 40: "-Djava.class.path=" */ strlenHome = (int)strlen(home); for (i = 0; i < NUM_APP_CLASSPATH; i++) { size += strlenHome + (int)strlen(app_classpath[i]) + 1; /* 1: separator */ } appcp = (char *)MemAlloc(size + 1); strcpy(appcp, "-Djava.class.path="); for (i = 0; i < NUM_APP_CLASSPATH; i++) { strcat(appcp, home); /* c:\program files\myapp */ strcat(appcp, app_classpath[i]); /* \lib\myapp.jar */ strcat(appcp, separator); /* ; */ } appcp[strlen(appcp)-1] = '\0'; /* remove trailing path separator */ AddOption(appcp, NULL); return JNI_TRUE; }
/* * Find path to JRE based on .exe's location or registry settings. */ static jboolean GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative) { char libjava[MAXPATHLEN]; struct stat s; if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/%s/" JAVA_DLL, path, arch); if (access(libjava, F_OK) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } /* ensure storage for path + /jre + NULL */ if ((JLI_StrLen(path) + 4 + 1) > (size_t) pathsize) { JLI_TraceLauncher("Insufficient space to store JRE path\n"); return JNI_FALSE; } /* Does the app ship a private JRE in <apphome>/jre directory? */ JLI_Snprintf(libjava, sizeof(libjava), "%s/jre/lib/%s/" JAVA_DLL, path, arch); if (access(libjava, F_OK) == 0) { JLI_StrCat(path, "/jre"); JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } if (GetApplicationHomeFromDll(path, pathsize)) { JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/%s/" JAVA_DLL, path, arch); if (stat(libjava, &s) == 0) { JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE; } } if (!speculative) JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL); return JNI_FALSE; }