static void *_jvm_dlopen(const char *java_home, const char *jvm_dir, const char *jvm_lib) { if (java_home) { char *path = str_printf("%s/%s/%s", java_home, jvm_dir, jvm_lib); BD_DEBUG(DBG_BDJ, "Opening %s ...\n", path); void *h = dl_dlopen(path, NULL); X_FREE(path); return h; } else { BD_DEBUG(DBG_BDJ, "Opening %s ...\n", jvm_lib); return dl_dlopen(jvm_lib, NULL); } }
BD_AACS *libaacs_load(void) { BD_AACS *p = calloc(1, sizeof(BD_AACS)); p->h_libaacs = dl_dlopen("libaacs", "0"); if (!p->h_libaacs) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "libaacs not found!\n"); X_FREE(p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loading libaacs (%p)\n", p->h_libaacs); *(void **)(&p->decrypt_unit) = dl_dlsym(p->h_libaacs, "aacs_decrypt_unit"); *(void **)(&p->get_vid) = dl_dlsym(p->h_libaacs, "aacs_get_vid"); *(void **)(&p->get_pmsn) = dl_dlsym(p->h_libaacs, "aacs_get_pmsn"); *(void **)(&p->get_device_binding_id) = dl_dlsym(p->h_libaacs, "aacs_get_device_binding_id"); if (!p->decrypt_unit) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "libaacs dlsym failed! (%p)\n", p->h_libaacs); libaacs_unload(&p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loaded libaacs (%p)\n", p->h_libaacs); if (file_open != file_open_default()) { BD_DEBUG(DBG_BLURAY, "Registering libaacs filesystem handler %p (%p)\n", (void *)(intptr_t)file_open, p->h_libaacs); DL_CALL(p->h_libaacs, aacs_register_file, file_open); } return p; }
static void *_jvm_dlopen(const char *java_home, const char *jvm_dir, const char *jvm_lib) { if (java_home) { char *path = str_printf("%s" DIR_SEP "%s" DIR_SEP "%s", java_home, jvm_dir, jvm_lib); if (!path) { BD_DEBUG(DBG_CRIT, "out of memory\n"); return NULL; } BD_DEBUG(DBG_BDJ, "Opening %s ...\n", path); void *h = dl_dlopen(path, NULL); X_FREE(path); return h; } else { BD_DEBUG(DBG_BDJ, "Opening %s ...\n", jvm_lib); return dl_dlopen(jvm_lib, NULL); } }
static void *_load_jvm(void) { const char* java_home = getenv("JAVA_HOME"); // FIXME: should probably search multiple directories if (java_home == NULL) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "JAVA_HOME not set, trying default locations\n"); void *h = dl_dlopen("libjvm", NULL); if (h) { return h; } java_home = "/usr/lib/jvm/default-java/"; } #ifdef WIN32 char* path = str_printf("%s/jre/bin/server/jvm", java_home); #else // #ifdef WIN32 char* path = str_printf("%s/jre/lib/%s/server/libjvm", java_home, JAVA_ARCH); #endif // #ifdef WIN32 return dl_dlopen(path, NULL); }
void* load_jvm() { const char* java_home = getenv("JAVA_HOME"); // FIXME: should probably search multiple directories if (java_home == NULL) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "JAVA_HOME not set, can't find Java VM.\n"); return NULL; } #ifdef WIN32 char* path = str_printf("%s/jre/bin/server/jvm", java_home); #else // #ifdef WIN32 char* path = str_printf("%s/jre/lib/%s/server/libjvm", java_home, JAVA_ARCH); #endif // #ifdef WIN32 return dl_dlopen(path, NULL); }
static void *_open_libaacs(void) { const char * const libaacs[] = { getenv("LIBAACS_PATH"), "libaacs", "libmmbd", }; unsigned ii; for (ii = 0; ii < sizeof(libaacs) / sizeof(libaacs[0]); ii++) { if (libaacs[ii]) { void *handle = dl_dlopen(libaacs[ii], "0"); if (handle) { BD_DEBUG(DBG_BLURAY, "Using %s for AACS\n", libaacs[ii]); return handle; } } } BD_DEBUG(DBG_BLURAY | DBG_CRIT, "No usable AACS libraries found!\n"); return NULL; }