libbluray | branch: master | Marvin Scholz <epira...@gmail.com> | Thu Dec 8 03:47:00 2016 +0100| [34bce23f06e854162c75f15b25df91a73c5bd4af] | committer: hpi1
Get the correct java home on macOS On macOS apparently the only way to get the correct path to the java home for the currently active SDK as selected by the user is to use the /usr/libexec/java_home tool. > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=34bce23f06e854162c75f15b25df91a73c5bd4af --- src/libbluray/bdj/bdj.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index 3a75076..2a2e2e6 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -39,6 +39,13 @@ #include <stdlib.h> #include <string.h> +#ifdef __APPLE__ +#include <sys/types.h> +#include <sys/wait.h> +#include <limits.h> +#include <unistd.h> +#endif + #ifdef _WIN32 #include <windows.h> #include <winreg.h> @@ -177,6 +184,71 @@ static inline char *_utf8_to_cp(const char *utf8) } #endif +#if defined(__APPLE__) && !defined(HAVE_BDJ_J2ME) + +#define MACOS_JAVA_HOME "/usr/libexec/java_home" +static char *_java_home_macos() +{ + static char result[PATH_MAX] = ""; + + if (result[0]) + return result; + + pid_t java_home_pid; + int fd[2], exitcode; + + if (pipe(fd)) { + BD_DEBUG(DBG_BDJ | DBG_CRIT, "unable to set up pipes\n"); + return NULL; + } + + switch (java_home_pid = vfork()) + { + case -1: + BD_DEBUG(DBG_BDJ | DBG_CRIT, "vfork failed\n"); + return NULL; + + case 0: + if (dup2(fd[1], STDOUT_FILENO) == -1) { + _exit(-1); + } + + close(fd[1]); + close(fd[0]); + + execl(MACOS_JAVA_HOME, MACOS_JAVA_HOME); + + _exit(-1); + + default: + close(fd[1]); + + for (int len = 0; ;) { + int n = read(fd[0], result + len, sizeof result - len); + if (n <= 0) + break; + + len += n; + result[len-1] = '\0'; + } + + waitpid(java_home_pid, &exitcode, 0); + } + + if (result[0] == '\0' || exitcode) { + BD_DEBUG(DBG_BDJ | DBG_CRIT, + "Unable to read path from " MACOS_JAVA_HOME "\n"); + result[0] = '\0'; + return NULL; + } + + BD_DEBUG(DBG_BDJ, "macos java home: '%s'\n", result ); + return result; +} +#undef MACOS_JAVA_HOME + +#endif + static void *_jvm_dlopen(const char *java_home, const char *jvm_dir, const char *jvm_lib) { if (java_home) { @@ -234,6 +306,10 @@ static void *_load_jvm(const char **p_java_home) static const char jvm_dir[] = "jre\\bin\\server"; static const char jvm_lib[] = "jvm"; # else +# ifdef __APPLE__ + static const char *jvm_path[] = {NULL, JDK_HOME}; + static const char jvm_dir[] = "jre/lib/server"; +# else static const char *jvm_path[] = {NULL, JDK_HOME, "/usr/lib/jvm/default-java", "/usr/lib/jvm/default", @@ -244,6 +320,7 @@ static void *_load_jvm(const char **p_java_home) "/usr/lib/jvm/java-6-openjdk", }; static const char jvm_dir[] = "jre/lib/" JAVA_ARCH "/server"; +# endif static const char jvm_lib[] = "libjvm"; # endif #endif @@ -265,6 +342,14 @@ static void *_load_jvm(const char **p_java_home) } #endif +#if defined(__APPLE__) && !defined(HAVE_BDJ_J2ME) + java_home = _java_home_macos(); + if (java_home) { + *p_java_home = java_home; + return _jvm_dlopen(java_home, jvm_dir, jvm_lib); + } +#endif + BD_DEBUG(DBG_BDJ, "JAVA_HOME not set, trying default locations\n"); /* try our pre-defined locations */ _______________________________________________ libbluray-devel mailing list libbluray-devel@videolan.org https://mailman.videolan.org/listinfo/libbluray-devel