/*
This file is part of GNUnet
- (C) 2002, 2003, 2004, 2005, 2006, 2009 Christian Grothoff (and other contributing authors)
+ (C) 2002-2013 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
#include "platform.h"
#include <ltdl.h>
-#include "gnunet_common.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_plugin_lib.h"
+#include "gnunet_util_lib.h"
#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
*/
static char *old_dlsearchpath;
-
/**
* List of plugins we have loaded.
*/
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;
}
/**
* Lookup a function in the plugin.
+ *
+ * @param plug the plugin to check
+ * @param name name of the symbol to look for
+ * @return NULL if the symbol was not found
*/
static GNUNET_PLUGIN_Callback
resolve_function (struct PluginList *plug, const char *name)
GNUNET_asprintf (&initName, "_%s_%s", plug->name, name);
mptr = lt_dlsym (plug->handle, &initName[1]);
- if (mptr == NULL)
+ if (NULL == mptr)
mptr = lt_dlsym (plug->handle, initName);
- if (mptr == NULL)
+ if (NULL == mptr)
LOG (GNUNET_ERROR_TYPE_ERROR,
- _("`%s' failed to resolve method '%s' with error: %s\n"), "lt_dlsym",
+ _("`%s' failed to resolve method '%s' with error: %s\n"),
+ "lt_dlsym",
&initName[1], lt_dlerror ());
GNUNET_free (initName);
return mptr;
}
+
/**
* 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
+ * @return #GNUNET_YES if the plugin exists, #GNUNET_NO if not
*/
int
GNUNET_PLUGIN_test (const char *library_name)
GNUNET_PLUGIN_Callback init;
struct PluginList plug;
- if (!initialized)
+ if (! initialized)
{
initialized = GNUNET_YES;
plugin_init ();
}
libhandle = lt_dlopenext (library_name);
- if (libhandle == NULL)
+ if (NULL == libhandle)
return GNUNET_NO;
plug.handle = libhandle;
plug.name = (char *) library_name;
init = resolve_function (&plug, "init");
- if (init == NULL)
+ if (NULL == init)
{
GNUNET_break (0);
lt_dlclose (libhandle);
/**
- * Setup plugin (runs the "init" callback and returns whatever "init"
- * returned). If "init" returns NULL, the plugin is unloaded.
+ * Setup plugin (runs the `init` callback and returns whatever `init`
+ * returned). If `init` returns NULL, the plugin is unloaded.
*
* Note that the library must export symbols called
- * "library_name_init" and "library_name_done". These will be called
+ * `library_name_init` and `library_name_done`. These will be called
* when the library is loaded and unloaded respectively.
*
* @param library_name name of the plugin to load
if (libhandle == NULL)
{
LOG (GNUNET_ERROR_TYPE_ERROR,
- _("`%s' failed for library `%s' with error: %s\n"), "lt_dlopenext",
+ _("`%s' failed for library `%s' with error: %s\n"),
+ "lt_dlopenext",
library_name, lt_dlerror ());
return NULL;
}
- plug = GNUNET_malloc (sizeof (struct PluginList));
+ plug = GNUNET_new (struct PluginList);
plug->handle = libhandle;
plug->name = GNUNET_strdup (library_name);
plug->next = plugins;
/**
- * Unload plugin (runs the "done" callback and returns whatever "done"
+ * Unload plugin (runs the `done` callback and returns whatever `done`
* returned). The plugin is then unloaded.
*
* @param library_name name of the plugin to unload
* @return whatever the shutdown function returned
*/
void *
-GNUNET_PLUGIN_unload (const char *library_name, void *arg)
+GNUNET_PLUGIN_unload (const char *library_name,
+ void *arg)
{
struct PluginList *pos;
struct PluginList *prev;
prev = NULL;
pos = plugins;
- while ((pos != NULL) && (0 != strcmp (pos->name, library_name)))
+ while ((NULL != pos) && (0 != strcmp (pos->name, library_name)))
{
prev = pos;
pos = pos->next;
}
- if (pos == NULL)
+ if (NULL == pos)
return NULL;
done = resolve_function (pos, "done");
ret = NULL;
- if (done != NULL)
+ if (NULL != done)
ret = done (arg);
- if (prev == NULL)
+ if (NULL == prev)
plugins = pos->next;
else
prev->next = pos->next;
- /* lt_dlclose (pos->handle); */
+ lt_dlclose (pos->handle);
GNUNET_free (pos->name);
GNUNET_free (pos);
- if (plugins == NULL)
+ if (NULL == plugins)
{
- //plugin_fini ();
+ plugin_fini ();
initialized = GNUNET_NO;
}
return ret;
}
+/**
+ * Closure for #find_libraries().
+ */
struct LoadAllContext
{
+ /**
+ * Prefix the plugin names we find have to match.
+ */
const char *basename;
+
+ /**
+ * Argument to give to 'init' when loading the plugin.
+ */
void *arg;
+
+ /**
+ * Function to call for each plugin.
+ */
GNUNET_PLUGIN_LoaderCallback cb;
+
+ /**
+ * Closure for @e cb
+ */
void *cb_cls;
};
+/**
+ * Function called on each plugin in the directory. Loads
+ * the plugins that match the given basename.
+ *
+ * @param cls the `struct LoadAllContext` describing which
+ * plugins to load and what to do with them
+ * @param filename name of a plugin library to check
+ * @return #GNUNET_OK (continue loading)
+ */
static int
find_libraries (void *cls, const char *filename)
{
* 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
+ * `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'
+ * @param cb_cls closure for @a cb
*/
void
GNUNET_PLUGIN_load_all (const char *basename, void *arg,
char *path;
path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LIBDIR);
- if (path == NULL)
+ if (NULL == path)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Could not determine plugin installation path.\n"));