aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-04-11 19:40:30 +0200
committerMartin Willi <martin@revosec.ch>2011-04-15 10:07:13 +0200
commited49e9a30313a3e9967dc0cbb5a1f05dcf5f930c (patch)
treef5e54b3f4907f75254662d6759ea4346566f4eea /src
parentc55818ebb0560798b1b18672731c48b6adc9bf93 (diff)
downloadstrongswan-ed49e9a30313a3e9967dc0cbb5a1f05dcf5f930c.tar.bz2
strongswan-ed49e9a30313a3e9967dc0cbb5a1f05dcf5f930c.tar.xz
Added plugin_loader method to reload plugin configurations
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/plugins/plugin_loader.c47
-rw-r--r--src/libstrongswan/plugins/plugin_loader.h8
2 files changed, 55 insertions, 0 deletions
diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c
index dafe64798..b4d7bf7c7 100644
--- a/src/libstrongswan/plugins/plugin_loader.c
+++ b/src/libstrongswan/plugins/plugin_loader.c
@@ -230,6 +230,52 @@ METHOD(plugin_loader_t, create_plugin_enumerator, enumerator_t*,
return this->plugins->create_enumerator(this->plugins);
}
+/**
+ * Reload a plugin by name, NULL for all
+ */
+static u_int reload_by_name(private_plugin_loader_t *this, char *name)
+{
+ u_int reloaded = 0;
+ enumerator_t *enumerator;
+ plugin_t *plugin;
+
+ enumerator = create_plugin_enumerator(this);
+ while (enumerator->enumerate(enumerator, &plugin))
+ {
+ if (name == NULL || streq(name, plugin->get_name(plugin)))
+ {
+ if (plugin->reload(plugin))
+ {
+ DBG2(DBG_LIB, "reloaded configuration of '%s' plugin",
+ plugin->get_name(plugin));
+ reloaded++;
+ }
+ }
+ }
+ enumerator->destroy(enumerator);
+ return reloaded;
+}
+
+METHOD(plugin_loader_t, reload, u_int,
+ private_plugin_loader_t *this, char *list)
+{
+ u_int reloaded = 0;
+ enumerator_t *enumerator;
+ char *name;
+
+ if (list == NULL)
+ {
+ return reload_by_name(this, NULL);
+ }
+ enumerator = enumerator_create_token(list, " ", "");
+ while (enumerator->enumerate(enumerator, &name))
+ {
+ reloaded += reload_by_name(this, name);
+ }
+ enumerator->destroy(enumerator);
+ return reloaded;
+}
+
METHOD(plugin_loader_t, destroy, void,
private_plugin_loader_t *this)
{
@@ -247,6 +293,7 @@ plugin_loader_t *plugin_loader_create()
INIT(this,
.public = {
.load = _load_plugins,
+ .reload = _reload,
.unload = _unload,
.create_plugin_enumerator = _create_plugin_enumerator,
.destroy = _destroy,
diff --git a/src/libstrongswan/plugins/plugin_loader.h b/src/libstrongswan/plugins/plugin_loader.h
index 417b6fedb..e03da4543 100644
--- a/src/libstrongswan/plugins/plugin_loader.h
+++ b/src/libstrongswan/plugins/plugin_loader.h
@@ -44,6 +44,14 @@ struct plugin_loader_t {
bool (*load)(plugin_loader_t *this, char *path, char *list);
/**
+ * Reload the configuration of one or multiple plugins.
+ *
+ * @param space separated plugin names to reload, NULL for all
+ * @return number of plugins that did support reloading
+ */
+ u_int (*reload)(plugin_loader_t *this, char *list);
+
+ /**
* Unload all loaded plugins.
*/
void (*unload)(plugin_loader_t *this);