summarylogtreecommitdiffstats
path: root/jd-gui.c
diff options
context:
space:
mode:
authorBoris Barbulovski2025-03-30 21:11:36 +0200
committerBoris Barbulovski2025-03-30 21:11:36 +0200
commit6e39a42f36e317c755fe43f441ea780060574367 (patch)
tree5bc6ec8874e31a017d237620070956fe0b27d617 /jd-gui.c
parent37ebf18c6096e6b8eb55d4dde77500204a4a9639 (diff)
downloadaur-6e39a42f36e317c755fe43f441ea780060574367.tar.gz
Update JRE detection alogrithm.
Diffstat (limited to 'jd-gui.c')
-rw-r--r--jd-gui.c98
1 files changed, 87 insertions, 11 deletions
diff --git a/jd-gui.c b/jd-gui.c
index 4959a523f096..d945f67ae497 100644
--- a/jd-gui.c
+++ b/jd-gui.c
@@ -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(&reg_java_version, "^\\s*JAVA_VERSION\\s*=\\s*\"(.*)\"\\s*$", REG_EXTENDED|REG_ICASE);
+ regcomp(&reg_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(&reg_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(&reg_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(&reg_java_version);
+ regfree(&reg_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,