void do_nistcheck (GtkAction *action) { void *handle; int (*run_nist_tests)(const char *, const char *, int); gchar *datadir = NULL; gchar *fname = NULL; run_nist_tests = gui_get_plugin_function("run_nist_tests", &handle); if (run_nist_tests == NULL) { return; } datadir = g_strdup_printf("%sdata%s", gretl_home(), SLASHSTR); fname = g_strdup_printf("%snist.out", gretl_dotdir()); (*run_nist_tests)(datadir, fname, nist_verbosity(action)); close_plugin(handle); view_file(fname, 0, 1, 78, 400, VIEW_CODEBOOK); g_free(datadir); g_free(fname); }
static int re_estimate_VECM (irfboot *b, GRETL_VAR *v, int targ, int shock, int iter, int scount) { static int (*jbr) (GRETL_VAR *, const DATASET *) = NULL; static void *handle = NULL; int err = 0; gretl_error_clear(); if (iter == 0) { /* first round: open the Johansen plugin */ jbr = get_plugin_function("johansen_boot_round", &handle); if (jbr == NULL) { return E_FOPEN; } } /* The various VECM matrices may need to be re-set to the sizes expected by johansen_stage_1() */ maybe_resize_vecm_matrices(v); err = johansen_stage_1(v, b->dset, OPT_NONE, NULL); if (!err) { /* call the plugin function */ err = jbr(v, b->dset); } #if BDEBUG gretl_matrix_print(v->jinfo->Beta, "var->jinfo->Beta"); gretl_matrix_print(v->jinfo->Alpha, "var->jinfo->Alpha"); gretl_matrix_print(v->S, "var->S (Omega)"); gretl_matrix_print(v->B, "var->B"); #endif if (!err) { err = gretl_VAR_do_error_decomp(v->S, v->C, v->ord); } if (!err) { err = recalculate_impulse_responses(b, v, targ, shock, iter); } if (iter == BOOT_ITERS - 1 || VAR_FATAL(err, iter, scount)) { if (handle != NULL) { close_plugin(handle); handle = NULL; jbr = NULL; } } return err; }
void send_file (char *fullname) { int (*email_file) (const char *, const char *); void *handle; email_file = gui_get_plugin_function("email_file", &handle); if (email_file == NULL) { return; } email_file(fullname, gretl_dotdir()); close_plugin(handle); }
static void close_modules (void) { int count = index_count (plugins); for (int i = 0; i < count; i ++) close_plugin (index_get (plugins, i)); index_delete (plugins, 0, count); count = index_count (modules); for (int i = 0; i < count; i ++) g_module_close (index_get (modules, i)); index_delete (modules, 0, count); }
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); }
static void hfile_exit() { pthread_mutex_lock(&plugins_lock); kh_destroy(scheme_string, schemes); while (plugins != NULL) { struct hFILE_plugin_list *p = plugins; if (p->plugin.destroy) p->plugin.destroy(); #ifdef ENABLE_PLUGINS if (p->plugin.obj) close_plugin(p->plugin.obj); #endif plugins = p->next; free(p); } pthread_mutex_unlock(&plugins_lock); pthread_mutex_destroy(&plugins_lock); }
/* * Load a specific plugin and check if the plugin had the correct * entry points, the license is compatible and the initialize the plugin. */ static bool load_a_plugin(void *binfo, void *bfuncs, const char *plugin_pathname, const char *plugin_name, const char *type, alist *plugin_list, bool is_plugin_compatible(Plugin *plugin)) { t_loadPlugin loadPlugin; Plugin *plugin = NULL; plugin = new_plugin(); plugin->file = bstrdup(plugin_name); plugin->file_len = strstr(plugin->file, type) - plugin->file; plugin->pHandle = dlopen(plugin_pathname, LT_LAZY_OR_NOW | LT_GLOBAL); if (!plugin->pHandle) { const char *error = dlerror(); Jmsg(NULL, M_ERROR, 0, _("dlopen plugin %s failed: ERR=%s\n"), plugin_pathname, NPRT(error)); Dmsg2(dbglvl, "dlopen plugin %s failed: ERR=%s\n", plugin_pathname, NPRT(error)); close_plugin(plugin); return false; } /* * Get two global entry points */ loadPlugin = (t_loadPlugin)dlsym(plugin->pHandle, "loadPlugin"); if (!loadPlugin) { Jmsg(NULL, M_ERROR, 0, _("Lookup of loadPlugin in plugin %s failed: ERR=%s\n"), plugin_pathname, NPRT(dlerror())); Dmsg2(dbglvl, "Lookup of loadPlugin in plugin %s failed: ERR=%s\n", plugin_pathname, NPRT(dlerror())); close_plugin(plugin); return false; } plugin->unloadPlugin = (t_unloadPlugin)dlsym(plugin->pHandle, "unloadPlugin"); if (!plugin->unloadPlugin) { Jmsg(NULL, M_ERROR, 0, _("Lookup of unloadPlugin in plugin %s failed: ERR=%s\n"), plugin_pathname, NPRT(dlerror())); Dmsg2(dbglvl, "Lookup of unloadPlugin in plugin %s failed: ERR=%s\n", plugin_pathname, NPRT(dlerror())); close_plugin(plugin); return false; } /* * Initialize the plugin */ if (loadPlugin(binfo, bfuncs, &plugin->pinfo, &plugin->pfuncs) != bRC_OK) { close_plugin(plugin); return false; } if (!is_plugin_compatible) { Dmsg0(50, "Plugin compatibility pointer not set.\n"); } else if (!is_plugin_compatible(plugin)) { close_plugin(plugin); return false; } plugin_list->append(plugin); return true; }