bool CarlaBridgeUI::libOpen(const char* const filename) noexcept { CARLA_SAFE_ASSERT_RETURN(fLib == nullptr, false); fLib = lib_open(filename); if (fLib != nullptr) { fLibFilename = filename; return true; } return false; }
Library::Library(char const* p) : path(p), handle(lib_open(p)) { load = (Init_fn)lib_resolve(handle, "load"); unload = (Init_fn)lib_resolve(handle, "unload"); start = (Init_fn)lib_resolve(handle, "start"); stop = (Init_fn)lib_resolve(handle, "stop"); port_added = (Port_fn)lib_resolve(handle, "port_added"); port_removed = (Port_fn)lib_resolve(handle, "port_removed"); port_changed = (Port_fn)lib_resolve(handle, "port_changed"); proc = (Proc_fn)lib_require(handle, "process"); }
libsym_return libsym_intrnl(void **symbol, const char *libname, const char *interfacename) { void *lib = lib_open(libname); if(symbol) *symbol = 0; if(!lib) return LIBSYM_NODLL; void *retval = lib_sym(lib, interfacename); if(!retval) return LIBSYM_NOSYMBOL; if(symbol) *symbol = retval; return LIBSYM_SUCCESS; }
int add_path_and_deps(const char *path, int readonly, int error, int lib) { assert(path != NULL); if (lib == 0 && path[0] != '/') { ERROR("%s is not an absolute path\n", path); return error; } char *map = NULL; int fd, ret = -1; if (path[0] == '/') { if (avl_find(&mounts, path)) return 0; fd = open(path, O_RDONLY|O_CLOEXEC); if (fd == -1) return error; add_mount(path, readonly, error); } else { if (avl_find(&libraries, path)) return 0; char *fullpath; fd = lib_open(&fullpath, path); if (fd == -1) return error; if (fullpath) { alloc_library(fullpath, path); free(fullpath); } } struct stat s; if (fstat(fd, &s) == -1) { ERROR("fstat(%s) failed: %s\n", path, strerror(errno)); ret = error; goto out; } if (!S_ISREG(s.st_mode)) { ret = 0; goto out; } /* too small to be an ELF or a script -> "normal" file */ if (s.st_size < 4) { ret = 0; goto out; } map = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (map == MAP_FAILED) { ERROR("failed to mmap %s\n", path); ret = -1; goto out; } if (map[0] == '#' && map[1] == '!') { ret = add_script_interp(path, map, s.st_size); goto out; } if (map[0] == ELFMAG0 && map[1] == ELFMAG1 && map[2] == ELFMAG2 && map[3] == ELFMAG3) { ret = elf_load_deps(path, map); goto out; } ret = 0; out: if (fd >= 0) close(fd); if (map) munmap(map, s.st_size); return ret; }
static void loadPluginLib(QFileInfo* fi, const PluginType t) { if (debugMsg) qWarning("looking up %s", fi->filePath().toAscii().constData()); void* handle = lib_open(fi->filePath().toAscii().constData()); if (handle == 0) { fprintf(stderr, "dlopen(%s) failed: %s\n", fi->filePath().toAscii().constData(), dlerror()); return; } if (t == PLUGIN_LADSPA) { LADSPA_Descriptor_Function ladspa = (LADSPA_Descriptor_Function) lib_symbol(handle, "ladspa_descriptor"); if (!ladspa) { const char *txt = dlerror(); if (txt) { fprintf(stderr, "Unable to find ladspa_descriptor() function in plugin " "library file \"%s\": %s.\n" "Are you sure this is a LADSPA plugin file?\n", fi->filePath().toAscii().constData(), txt); } lib_close(handle); return; } const LADSPA_Descriptor* descr; for (int i = 0;; ++i) { descr = ladspa(i); if (descr == NULL) break; // Make sure it doesn't already exist. if (plugins.find(fi->completeBaseName(), QString(descr->Label)) != 0) continue; #ifdef PLUGIN_DEBUGIN fprintf(stderr, "loadPluginLib: ladspa effect name:%s inPlaceBroken:%d\n", descr->Name, LADSPA_IS_INPLACE_BROKEN(descr->Properties)); #endif plugins.add(PLUGIN_LADSPA, fi->absoluteFilePath(), QString(descr->Label), descr); } } else if (t == PLUGIN_VST) { VST_Function vstfn = (VST_Function) lib_symbol(handle, "VSTPluginMain"); if (! vstfn) { vstfn = (VST_Function) lib_symbol(handle, "main"); #ifdef TARGET_API_MAC_CARBON if (! vstfn) vstfn = (VST_Function)lib_symbol(lib_handle, "main_macho"); #endif } if (! vstfn) { const char *txt = dlerror(); if (txt) { fprintf(stderr, "Unable to find vst entry function in plugin " "library file \"%s\": %s.\n" "Are you sure this is a VST plugin file?\n", fi->filePath().toAscii().constData(), txt); } lib_close(handle); return; } AEffect* effect = vstfn(VstHostCallback); if (effect && (effect->flags & effFlagsCanReplacing) > 0) { QString PluginLabel = fi->baseName(); char buf_str[255] = { 0 }; effect->dispatcher(effect, effOpen, 0, 0, 0, 0.0f); effect->dispatcher(effect, effGetProductString, 0, 0, buf_str, 0.0f); if (buf_str[0] != 0) PluginLabel = QString(buf_str); // Make sure it doesn't already exist. if (plugins.find(fi->completeBaseName(), QString(PluginLabel)) == 0) { plugins.add(PLUGIN_VST, fi->absoluteFilePath(), PluginLabel, effect); } effect->dispatcher(effect, effClose, 0, 0, 0, 0.0f); } } lib_close(handle); }