7df6e18265341f87a69fba808aa1f92f8ebca841 markd Wed Apr 15 13:39:42 2026 -0700 move copy of htslib diff --git src/htslib/plugin.c src/htslib/plugin.c deleted file mode 100644 index 7525cc6dfb0..00000000000 --- src/htslib/plugin.c +++ /dev/null @@ -1,171 +0,0 @@ -/* plugin.c -- low-level path parsing and plugin functions. - - Copyright (C) 2015 Genome Research Ltd. - - Author: John Marshall <jm18@sanger.ac.uk> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#include <dirent.h> -#include <dlfcn.h> - -#include "hts_internal.h" -#include "htslib/kstring.h" - -#ifndef PLUGINPATH -#define PLUGINPATH "" -#endif - -#ifdef __APPLE__ -#define PLUGIN_EXT ".bundle" -#define PLUGIN_EXT_LEN 7 -#else -#define PLUGIN_EXT ".so" -#define PLUGIN_EXT_LEN 3 -#endif - -static DIR *open_nextdir(struct hts_path_itr *itr) -{ - DIR *dir; - - while (1) { - const char *colon = strchr(itr->pathdir, ':'); - if (colon == NULL) return NULL; - - itr->entry.l = 0; - kputsn(itr->pathdir, colon - itr->pathdir, &itr->entry); - itr->pathdir = &colon[1]; - if (itr->entry.l == 0) continue; - - dir = opendir(itr->entry.s); - if (dir) break; - - if (hts_verbose >= 4) - fprintf(stderr, - "[W::hts_path_itr] can't scan directory \"%s\": %s\n", - itr->entry.s, strerror(errno)); - } - - if (itr->entry.s[itr->entry.l-1] != '/') kputc('/', &itr->entry); - itr->entry_dir_l = itr->entry.l; - return dir; -} - -void hts_path_itr_setup(struct hts_path_itr *itr, const char *path, - const char *builtin_path, const char *prefix, size_t prefix_len, - const char *suffix, size_t suffix_len) -{ - itr->prefix = prefix; - itr->prefix_len = prefix_len; - - if (suffix) itr->suffix = suffix, itr->suffix_len = suffix_len; - else itr->suffix = PLUGIN_EXT, itr->suffix_len = PLUGIN_EXT_LEN; - - itr->path.l = itr->path.m = 0; itr->path.s = NULL; - itr->entry.l = itr->entry.m = 0; itr->entry.s = NULL; - - if (! builtin_path) builtin_path = PLUGINPATH; - if (! path) { - path = getenv("HTS_PATH"); - if (! path) path = ""; - } - - while (1) { - size_t len = strcspn(path, ":"); - if (len == 0) kputs(builtin_path, &itr->path); - else kputsn(path, len, &itr->path); - kputc(':', &itr->path); - - path += len; - if (*path == ':') path++; - else break; - } - - // Note that ':' now terminates entries rather than separates them - itr->pathdir = itr->path.s; - itr->dirv = open_nextdir(itr); -} - -const char *hts_path_itr_next(struct hts_path_itr *itr) -{ - while (itr->dirv) { - struct dirent *e; - while ((e = readdir((DIR *) itr->dirv)) != NULL) { - size_t d_name_len = strlen(e->d_name); - if (strncmp(e->d_name, itr->prefix, itr->prefix_len) == 0 && - d_name_len >= itr->suffix_len && - strncmp(e->d_name + d_name_len - itr->suffix_len, itr->suffix, - itr->suffix_len) == 0) { - itr->entry.l = itr->entry_dir_l; - kputs(e->d_name, &itr->entry); - return itr->entry.s; - } - } - - closedir((DIR *) itr->dirv); - itr->dirv = open_nextdir(itr); - } - - itr->pathdir = NULL; - free(itr->path.s); itr->path.s = NULL; - free(itr->entry.s); itr->entry.s = NULL; - return NULL; -} - -void *load_plugin(void **pluginp, const char *filename, const char *symbol) -{ - void *lib = dlopen(filename, RTLD_NOW | RTLD_LOCAL); - if (lib == NULL) goto error; - - void *sym = dlsym(lib, symbol); - if (sym == NULL) goto error; - - *pluginp = lib; - return sym; - -error: - if (hts_verbose >= 4) - fprintf(stderr, "[W::%s] can't load plugin \"%s\": %s\n", - __func__, filename, dlerror()); - if (lib) dlclose(lib); - return NULL; -} - -void *plugin_sym(void *plugin, const char *name, const char **errmsg) -{ - void *sym = dlsym(plugin, name); - if (sym == NULL) *errmsg = dlerror(); - return sym; -} - -void close_plugin(void *plugin) -{ - if (dlclose(plugin) != 0) { - if (hts_verbose >= 4) - fprintf(stderr, "[W::%s] dlclose() failed: %s\n", - __func__, dlerror()); - } -}