X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fplugin.c;h=4e0385a0984d65c1aa11cb0a7a2f073d65c53ce1;hb=705966df17b43ca8f1481834a80d19cd7cad874b;hp=08b32b295c3afe53c9251f0df280253e0c7e179b;hpb=5746309cb4be2073d550ad7a6885e918631dbc38;p=oweals%2Fgnunet.git diff --git a/src/util/plugin.c b/src/util/plugin.c index 08b32b295..4e0385a09 100644 --- a/src/util/plugin.c +++ b/src/util/plugin.c @@ -30,6 +30,8 @@ #include "gnunet_os_lib.h" #include "gnunet_plugin_lib.h" +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + /** * Linked list of active plugins. */ @@ -84,7 +86,7 @@ plugin_init () err = lt_dlinit (); if (err > 0) { - fprintf (stderr, _("Initialization of plugin mechanism failed: %s!\n"), + FPRINTF (stderr, _("Initialization of plugin mechanism failed: %s!\n"), lt_dlerror ()); return; } @@ -140,9 +142,9 @@ resolve_function (struct PluginList *plug, const char *name) if (mptr == NULL) mptr = lt_dlsym (plug->handle, initName); if (mptr == NULL) - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("`%s' failed to resolve method '%s' with error: %s\n"), - "lt_dlsym", &initName[1], lt_dlerror ()); + LOG (GNUNET_ERROR_TYPE_ERROR, + _("`%s' failed to resolve method '%s' with error: %s\n"), "lt_dlsym", + &initName[1], lt_dlerror ()); GNUNET_free (initName); return mptr; } @@ -151,7 +153,7 @@ resolve_function (struct PluginList *plug, const char *name) * Test if a plugin exists. * * Note that the library must export a symbol called - * "library_name_init" for the test to succeed. + * "library_name_init" for the test to succeed. * * @param library_name name of the plugin to test if it is installed * @return GNUNET_YES if the plugin exists, GNUNET_NO if not @@ -213,9 +215,9 @@ GNUNET_PLUGIN_load (const char *library_name, void *arg) libhandle = lt_dlopenext (library_name); if (libhandle == NULL) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("`%s' failed for library `%s' with error: %s\n"), - "lt_dlopenext", library_name, lt_dlerror ()); + LOG (GNUNET_ERROR_TYPE_ERROR, + _("`%s' failed for library `%s' with error: %s\n"), "lt_dlopenext", + library_name, lt_dlerror ()); return NULL; } plug = GNUNET_malloc (sizeof (struct PluginList)); @@ -282,5 +284,78 @@ GNUNET_PLUGIN_unload (const char *library_name, void *arg) } +struct LoadAllContext +{ + const char *basename; + void *arg; + GNUNET_PLUGIN_LoaderCallback cb; + void *cb_cls; +}; + + +static int +find_libraries (void *cls, const char *filename) +{ + struct LoadAllContext *lac = cls; + const char *slashpos; + const char *libname; + char *basename; + char *dot; + void *lib_ret; + size_t n; + + libname = filename; + while (NULL != (slashpos = strstr (libname, DIR_SEPARATOR_STR))) + libname = slashpos + 1; + n = strlen (libname); + if (0 != strncmp (lac->basename, libname, strlen (lac->basename))) + return GNUNET_OK; /* wrong name */ + if ((n > 3) && (0 == strcmp (&libname[n - 3], ".la"))) + return GNUNET_OK; /* .la file */ + basename = GNUNET_strdup (libname); + if (NULL != (dot = strstr (basename, "."))) + *dot = '\0'; + lib_ret = GNUNET_PLUGIN_load (basename, lac->arg); + if (NULL != lib_ret) + lac->cb (lac->cb_cls, basename, lib_ret); + GNUNET_free (basename); + return GNUNET_OK; +} + + +/** + * Load all compatible plugins with the given base name. + * + * Note that the library must export symbols called + * "basename_ANYTHING_init" and "basename_ANYTHING__done". These will + * be called when the library is loaded and unloaded respectively. + * + * @param basename basename of the plugins to load + * @param arg argument to the plugin initialization function + * @param cb function to call for each plugin found + * @param cb_cls closure for 'cb' + */ +void +GNUNET_PLUGIN_load_all (const char *basename, void *arg, + GNUNET_PLUGIN_LoaderCallback cb, void *cb_cls) +{ + struct LoadAllContext lac; + char *path; + + path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LIBDIR); + if (path == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Could not determine plugin installation path.\n")); + return; + } + lac.basename = basename; + lac.arg = arg; + lac.cb = cb; + lac.cb_cls = cb_cls; + GNUNET_DISK_directory_scan (path, &find_libraries, &lac); + GNUNET_free (path); +} + /* end of plugin.c */