diff options
Diffstat (limited to 'src/wire/wire.c')
-rw-r--r-- | src/wire/wire.c | 157 |
1 files changed, 79 insertions, 78 deletions
diff --git a/src/wire/wire.c b/src/wire/wire.c index c799334f..aeb8689e 100644 --- a/src/wire/wire.c +++ b/src/wire/wire.c @@ -1,6 +1,6 @@ /* This file is part of TALER - (C) 2015, 2016, 2017 GNUnet e.V. + (C) 2015, 2016, 2017, 2018 GNUnet e.V. TALER 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 @@ -23,6 +23,50 @@ #include "taler_util.h" #include "taler_wire_lib.h" + +/** + * A wire plugin that we have loaded. + */ +struct WirePlugin +{ + /** + * We keep these in a DLL. + */ + struct WirePlugin *next; + + /** + * We keep these in a DLL. + */ + struct WirePlugin *prev; + + /** + * Type of this wire plugin. + */ + char *type; + + /** + * Wire plugin + */ + struct TALER_WIRE_Plugin *plugin; + + /** + * Reference counter for the plugin. + */ + unsigned int rc; +}; + + +/** + * Head of the DLL of loaded wire plugins. + */ +static struct WirePlugin *wp_head; + +/** + * Tail of the DLL of loaded wire plugins. + */ +static struct WirePlugin *wp_tail; + + /** * Load a WIRE plugin. * @@ -36,7 +80,15 @@ TALER_WIRE_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg, { char *lib_name; struct TALER_WIRE_Plugin *plugin; - + struct WirePlugin *wp; + + for (wp = wp_head; NULL != wp; wp = wp->next) + if (0 == strcasecmp (plugin_name, + wp->type)) + { + wp->rc++; + return wp->plugin; + } (void) GNUNET_asprintf (&lib_name, "libtaler_plugin_wire_%s", plugin_name); @@ -46,6 +98,15 @@ TALER_WIRE_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg, plugin->library_name = lib_name; else GNUNET_free (lib_name); + if (NULL == plugin) + return NULL; + wp = GNUNET_new (struct WirePlugin); + wp->plugin = plugin; + wp->type = GNUNET_strdup (plugin_name); + GNUNET_CONTAINER_DLL_insert (wp_head, + wp_tail, + wp); + wp->rc = 1; return plugin; } @@ -58,10 +119,26 @@ TALER_WIRE_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg, void TALER_WIRE_plugin_unload (struct TALER_WIRE_Plugin *plugin) { + struct WirePlugin *wp; char *lib_name; if (NULL == plugin) return; + for (wp = wp_head; NULL != wp; wp = wp->next) + { + if (plugin == wp->plugin) + { + wp->rc--; + if (0 < wp->rc) + return; + GNUNET_CONTAINER_DLL_remove (wp_head, + wp_tail, + wp); + GNUNET_free (wp->type); + GNUNET_free (wp); + break; + } + } lib_name = plugin->library_name; GNUNET_assert (NULL == GNUNET_PLUGIN_unload (lib_name, plugin)); @@ -69,80 +146,4 @@ TALER_WIRE_plugin_unload (struct TALER_WIRE_Plugin *plugin) } -/** - * Closure of #check_for_wire. - */ -struct FindEnabledWireContext -{ - /** - * Configuration we are usign. - */ - const struct GNUNET_CONFIGURATION_Handle *cfg; - - /** - * Callback to invoke. - */ - TALER_WIRE_EnabledCallback cb; - - /** - * Closure for @e cb. - */ - void *cb_cls; -}; - - -/** - * Check if @a section begins with "exchange-wire-", and if - * so if the "ENABLE" option is set to "YES". If both are - * true, call the callback from the context with the - * rest of the section name. - * - * @param cls our `struct FindEnabledWireContext` - * @param section name of a section in the configuration - */ -static void -check_for_wire (void *cls, - const char *section) -{ - struct FindEnabledWireContext *ctx = cls; - const char *name; - - if (0 != strncasecmp (section, - "exchange-wire-", - strlen ("exchange-wire-"))) - return; - if (GNUNET_YES != - GNUNET_CONFIGURATION_get_value_yesno (ctx->cfg, - section, - "ENABLE")) - return; - name = §ion[strlen ("exchange-wire-")]; - ctx->cb (ctx->cb_cls, - name); -} - - -/** - * Check which wire plugins are enabled in @a cfg and call @a cb for each one. - * - * @param cfg configuration to use - * @param cb callback to invoke - * @param cb_cls closure for @a cb - */ -void -TALER_WIRE_find_enabled (const struct GNUNET_CONFIGURATION_Handle *cfg, - TALER_WIRE_EnabledCallback cb, - void *cb_cls) -{ - struct FindEnabledWireContext ctx; - - ctx.cfg = cfg; - ctx.cb = cb; - ctx.cb_cls = cb_cls; - GNUNET_CONFIGURATION_iterate_sections (cfg, - &check_for_wire, - &ctx); -} - - /* end of wire.c */ |