diff options
author | Boris Barbulovski | 2025-03-30 21:11:36 +0200 |
---|---|---|
committer | Boris Barbulovski | 2025-03-30 21:11:36 +0200 |
commit | 6e39a42f36e317c755fe43f441ea780060574367 (patch) | |
tree | 5bc6ec8874e31a017d237620070956fe0b27d617 /jd-gui.c | |
parent | 37ebf18c6096e6b8eb55d4dde77500204a4a9639 (diff) | |
download | aur-6e39a42f36e317c755fe43f441ea780060574367.tar.gz |
Update JRE detection alogrithm.
Diffstat (limited to 'jd-gui.c')
-rw-r--r-- | jd-gui.c | 98 |
1 files changed, 87 insertions, 11 deletions
@@ -3,7 +3,9 @@ #include <stdlib.h> #include <dirent.h> #include <string.h> +#include <limits.h> #include <dlfcn.h> +#include <regex.h> #include <stdio.h> const int MIN_JVM_VERSION = 17; @@ -22,9 +24,16 @@ int (*JLI_Launch)(int argc, char** argv, char *find_openjdk_jli_pathname() { + char *ret = NULL; + const struct dirent* entry = NULL; + bool oracle_jvm_found = false; + regex_t reg_java_version; + regex_t reg_implementor; char pathname[PATH_MAX]; - int jvm_version = 0; + char line[1024]; + char *jvm_dirname = NULL; + int jvm_version = INT_MAX; DIR* dir = NULL; dir = opendir("/usr/lib/jvm"); @@ -32,24 +41,91 @@ char *find_openjdk_jli_pathname() return NULL; } + regcomp(®_java_version, "^\\s*JAVA_VERSION\\s*=\\s*\"(.*)\"\\s*$", REG_EXTENDED|REG_ICASE); + regcomp(®_implementor, "^\\s*IMPLEMENTOR\\s*=\\s*\"(.*)\"\\s*$", REG_EXTENDED|REG_ICASE); + while((entry = readdir(dir)) != NULL) { if (entry->d_type == DT_DIR) { - int value = 0; - sscanf(entry->d_name, "java-%d-openjdk", &value); - if ((value >= MIN_JVM_VERSION)&&((value < jvm_version)||(jvm_version == 0))) { - jvm_version = value; + const char *dirname = entry->d_name; + + if ((strcmp(dirname, ".") == 0)||(strcmp(dirname, "..") == 0)) + continue; + + snprintf(pathname, sizeof(pathname), "/usr/lib/jvm/%s/release", dirname); + + FILE *f = fopen(pathname, "r"); + if (f == NULL) break; + + char *implementor_str = NULL; + char *version_str = NULL; + + while(fgets(line, sizeof(line), f)) { + if (implementor_str == NULL) { + regmatch_t matches[2]; + int res = regexec(®_implementor, line, sizeof(matches) / sizeof(matches[0]), matches, 0); + if (res == 0) { + int size = matches[1].rm_eo - matches[1].rm_so; + implementor_str = malloc(size + 1); + if (implementor_str == NULL) break; + memcpy(implementor_str, line + matches[1].rm_so, size); + implementor_str[size] = '\0'; + } + } + if (version_str == NULL) { + regmatch_t matches[2]; + int res = regexec(®_java_version, line, sizeof(matches) / sizeof(matches[0]), matches, 0); + if (res == 0) { + int size = matches[1].rm_eo - matches[1].rm_so; + version_str = malloc(size + 1); + if (version_str == NULL) break; + memcpy(version_str, line + matches[1].rm_so, size); + version_str[size] = '\0'; + } + } + + if ((implementor_str != NULL)&&(version_str != NULL)) + break; } + + if ((implementor_str != NULL)&&(version_str != NULL)) { + int version = atoi(version_str); + bool is_oracle_jvm = strcmp(implementor_str, "Oracle Corporation") == 0; + if ((is_oracle_jvm)&&(version >= MIN_JVM_VERSION)) { + if ((!oracle_jvm_found)||(version > jvm_version)) { + jvm_dirname = strdup(dirname); + jvm_version = version; + oracle_jvm_found = true; + } + } else { + if (((version >= MIN_JVM_VERSION)&&(version < jvm_version))||((version == MIN_JVM_VERSION)&&(!oracle_jvm_found))) { + if (jvm_dirname) free(jvm_dirname); + jvm_dirname = strdup(dirname); + jvm_version = version; + } + } + } + + if (implementor_str) free(implementor_str); + if (version_str) free(version_str); + + fclose(f); } } - closedir(dir); + regfree(®_java_version); + regfree(®_implementor); - if (jvm_version > 0) { - snprintf(pathname, sizeof(pathname), "/usr/lib/jvm/java-%d-openjdk/lib/libjli.so", jvm_version); - return strdup(pathname); + if (jvm_dirname) { + snprintf(pathname, sizeof(pathname), "/usr/lib/jvm/%s/lib/libjli.so", jvm_dirname); + ret = strdup(pathname); + } else { + ret = strdup("/usr/lib/jvm/default/lib/libjli.so"); } - return NULL; + if (jvm_dirname) free(jvm_dirname); + closedir(dir); + + return ret; } int main(int argc, char* argv[]) @@ -98,7 +174,7 @@ int main(int argc, char* argv[]) jli_argv[3] = "/usr/share/java/jd-gui/jd-gui.jar"; for(int c = 1; c < argc; c++) - jli_argv[c + 2] = argv[c]; + jli_argv[c + 3] = argv[c]; ret = JLI_Launch(jli_argc, jli_argv, 0, NULL, |