int PLUGIN_GLOBAL(hfile_plugin_init,_libcurl)(struct hFILE_plugin *self) { static const struct hFILE_scheme_handler handler = { hopen_libcurl, hfile_always_remote, "libcurl", 50 }; const curl_version_info_data *info; const char * const *protocol; CURLcode err; err = curl_global_init(CURL_GLOBAL_ALL); if (err != CURLE_OK) { errno = easy_errno(NULL, err); return -1; } curl.multi = curl_multi_init(); if (curl.multi == NULL) { curl_global_cleanup(); errno = EIO; return -1; } info = curl_version_info(CURLVERSION_NOW); ksprintf(&curl.useragent, "htslib/%s libcurl/%s", hts_version(), info->version); curl.nrunning = 0; curl.perform_again = 0; self->name = "libcurl"; self->destroy = libcurl_exit; for (protocol = info->protocols; *protocol; protocol++) hfile_add_scheme_handler(*protocol, &handler); hfile_add_scheme_handler("s3", &handler); hfile_add_scheme_handler("s3+http", &handler); if (info->features & CURL_VERSION_SSL) hfile_add_scheme_handler("s3+https", &handler); return 0; }
int hfile_plugin_init_net(struct hFILE_plugin *self) { static const struct hFILE_scheme_handler handler = { hopen_net, hfile_always_remote, "knetfile", 0 }; self->name = "knetfile"; hfile_add_scheme_handler("http", &handler); hfile_add_scheme_handler("ftp", &handler); return 0; }
static void load_hfile_plugins() { static const struct hFILE_scheme_handler data = { hopen_mem, hfile_always_local, "built-in", 80 }, file = { hopen_fd_fileuri, hfile_always_local, "built-in", 80 }, preload = { hopen_preload, is_preload_url_remote, "built-in", 80 }; schemes = kh_init(scheme_string); if (schemes == NULL) abort(); hfile_add_scheme_handler("data", &data); hfile_add_scheme_handler("file", &file); hfile_add_scheme_handler("preload", &preload); init_add_plugin(NULL, hfile_plugin_init_net, "knetfile"); init_add_plugin(NULL, hfile_plugin_init_mem, "mem"); #ifdef ENABLE_PLUGINS struct hts_path_itr path; const char *pluginname; hts_path_itr_setup(&path, NULL, NULL, "hfile_", 6, NULL, 0); while ((pluginname = hts_path_itr_next(&path)) != NULL) { void *obj; int (*init)(struct hFILE_plugin *) = (int (*)(struct hFILE_plugin *)) load_plugin(&obj, pluginname, "hfile_plugin_init"); if (init) { if (init_add_plugin(obj, init, pluginname) != 0) close_plugin(obj); } } #else #ifdef HAVE_LIBCURL init_add_plugin(NULL, hfile_plugin_init_libcurl, "libcurl"); #endif #ifdef ENABLE_GCS init_add_plugin(NULL, hfile_plugin_init_gcs, "gcs"); #endif #ifdef ENABLE_S3 init_add_plugin(NULL, hfile_plugin_init_s3, "s3"); #endif #endif // In the unlikely event atexit() fails, it's better to succeed here and // carry on; then eventually when the program exits, we'll merely close // down the plugins uncleanly, as if we had aborted. (void) atexit(hfile_exit); }
int hfile_plugin_init_mem(struct hFILE_plugin *self) { // mem files are declared remote so they work with a tabix index static const struct hFILE_scheme_handler handler = {NULL, hfile_always_remote, "mem", 2000 + 50, hopenv_mem}; self->name = "mem"; hfile_add_scheme_handler("mem", &handler); return 0; }
int PLUGIN_GLOBAL(hfile_plugin_init,_s3)(struct hFILE_plugin *self) { static const struct hFILE_scheme_handler handler = { s3_open, hfile_always_remote, "Amazon S3", 2000 + 50, s3_vopen }; #ifdef ENABLE_PLUGINS // Embed version string for examination via strings(1) or what(1) static const char id[] = "@(#)hfile_s3 plugin (htslib)\t" HTS_VERSION; if (hts_verbose >= 9) fprintf(stderr, "[M::hfile_s3.init] version %s\n", strchr(id, '\t')+1); #endif self->name = "Amazon S3"; hfile_add_scheme_handler("s3", &handler); hfile_add_scheme_handler("s3+http", &handler); hfile_add_scheme_handler("s3+https", &handler); return 0; }
int PLUGIN_GLOBAL(hfile_plugin_init,_irods)(struct hFILE_plugin *self) { static const struct hFILE_scheme_handler handler = { hopen_irods, hfile_always_remote, "iRODS", 50 }; self->name = "iRODS"; hfile_add_scheme_handler("irods", &handler); self->destroy = irods_exit; return 0; }