aboutsummaryrefslogtreecommitdiff
path: root/src/wire/wire.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wire/wire.c')
-rw-r--r--src/wire/wire.c157
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 = &section[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 */