bool GetJREPathFromEnvVars(char* path, size_t pathSize, const char* arch) { bool found = false; static const size_t possLoc_sizeMax = 32; char* possLoc[possLoc_sizeMax]; size_t possLoc_i = 0; possLoc[possLoc_i++] = util_allocStrCpy("JAVA_HOME"); possLoc[possLoc_i++] = util_allocStrCpy("JDK_HOME"); possLoc[possLoc_i++] = util_allocStrCpy("JRE_HOME"); size_t l; for (l=0; l < possLoc_i; ++l) { const char* envPath = getenv(possLoc[l]); if (envPath != NULL) { found = GetJREPathFromBase(path, pathSize, envPath, arch); if (found) { simpleLog_logL(LOG_LEVEL_NOTICE, "JRE found in env var \"%s\"!", possLoc[l]); goto locSearchEnd; } } } locSearchEnd: // cleanup for (l=0; l < possLoc_i; ++l) { free(possLoc[l]); possLoc[l] = NULL; } return found; }
static bool GetJREPathWhichJava(char* path, size_t pathSize, const char* arch) { static const char* suf = "/bin/java"; const size_t suf_size = strlen(suf); bool found = false; // execute FILE* cmd_fp = popen("which java | sed 's/[\\n\\r]/K/g'", "r"); if (cmd_fp == NULL) { return found; } // parse results static const size_t line_sizeMax = 512; char line[line_sizeMax]; if (fgets(line, line_sizeMax, cmd_fp)) { if (*line == '/') { // -> absolute path size_t line_size = strlen(line); if (*(line+line_size-1) == '\n') { // remove trailing '\n' *(line+line_size-1) = '\0'; line_size--; } simpleLog_logL(SIMPLELOG_LEVEL_FINEST, "which line \"%s\"!", line); if (line_size > suf_size && strcmp(line+(line_size-suf_size), suf) == 0) { // line ends with suf simpleLog_logL(SIMPLELOG_LEVEL_FINER, "JRE found with `which java`!"); // remove suf *(line+(line_size-suf_size)) = '\0'; found = GetJREPathFromBase(path, pathSize, line, arch); } } } pclose(cmd_fp); return found; }
static bool GetJREPathInCommonLocations(char* path, size_t pathSize, const char* arch) { bool found = false; static const size_t possLoc_sizeMax = 32; char* possLoc[possLoc_sizeMax]; size_t possLoc_i = 0; possLoc[possLoc_i++] = util_allocStrCpy("/usr/local/jdk*"); possLoc[possLoc_i++] = util_allocStrCpy("/usr/lib/jvm/java-?-sun"); possLoc[possLoc_i++] = util_allocStrCpy("/usr/lib/jvm/java-?-*"); possLoc[possLoc_i++] = util_allocStrCpy("~/jdk*"); possLoc[possLoc_i++] = util_allocStrCpy("~/bin/jdk*"); possLoc[possLoc_i++] = util_allocStrCpy("~/jre*"); possLoc[possLoc_i++] = util_allocStrCpy("~/bin/jre*"); static const size_t globHits_sizeMax = 32; char* globHits[globHits_sizeMax]; size_t l, g; for (l=0; l < possLoc_i; ++l) { const size_t globHits_size = ExecFileSystemGlob(globHits, globHits_sizeMax, possLoc[l]); for (g=0; g < globHits_size; ++g) { found = GetJREPathFromBase(path, pathSize, globHits[g], arch); if (found) { simpleLog_logL(SIMPLELOG_LEVEL_FINER, "JRE found common location env var \"%s\"!", possLoc[l]); goto locSearchEnd; } } } locSearchEnd: // cleanup for (l=0; l < possLoc_i; ++l) { free(possLoc[l]); possLoc[l] = NULL; } return found; }