aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-09-01 16:08:28 +0200
committerMartin Willi <martin@strongswan.org>2009-09-01 16:08:28 +0200
commitd6a45127dcce4263bd89710e4d065ee718177490 (patch)
treedf9516f961a503d04b63a83cb3ce0689db585f5c
parent9412bbfa7c2a78bd1ea1e681cacade86b2b8c405 (diff)
downloadstrongswan-d6a45127dcce4263bd89710e4d065ee718177490.tar.bz2
strongswan-d6a45127dcce4263bd89710e4d065ee718177490.tar.xz
plugins marked with a '!' are handled as critical: cancel if loading fails
-rw-r--r--src/libstrongswan/plugins/plugin_loader.c37
-rw-r--r--src/libstrongswan/plugins/plugin_loader.h14
2 files changed, 37 insertions, 14 deletions
diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c
index 459ba9ba9..49e643f25 100644
--- a/src/libstrongswan/plugins/plugin_loader.c
+++ b/src/libstrongswan/plugins/plugin_loader.c
@@ -110,26 +110,45 @@ static plugin_t* load_plugin(private_plugin_loader_t *this,
/**
* Implementation of plugin_loader_t.load_plugins.
*/
-static int load(private_plugin_loader_t *this, char *path, char *list)
+static bool load(private_plugin_loader_t *this, char *path, char *list)
{
- plugin_t *plugin;
enumerator_t *enumerator;
char *token;
- int count = 0;
+ bool critical_failed = FALSE;
enumerator = enumerator_create_token(list, " ", " ");
- while (enumerator->enumerate(enumerator, &token))
+ while (!critical_failed && enumerator->enumerate(enumerator, &token))
{
+ plugin_t *plugin;
+ bool critical = FALSE;
+ int len;
+
+ token = strdup(token);
+ len = strlen(token);
+ if (token[len-1] == '!')
+ {
+ critical = TRUE;
+ token[len-1] = '\0';
+ }
plugin = load_plugin(this, path, token);
if (plugin)
- { /* insert in front to destroy them in reverse order */
+ {
+ /* insert in front to destroy them in reverse order */
this->plugins->insert_last(this->plugins, plugin);
- this->names->insert_last(this->names, strdup(token));
- count++;
+ this->names->insert_last(this->names, token);
+ }
+ else
+ {
+ if (critical)
+ {
+ critical_failed = TRUE;
+ DBG1("loading critical plugin '%s' failed", token);
+ }
+ free(token);
}
}
enumerator->destroy(enumerator);
- return count;
+ return !critical_failed;
}
/**
@@ -176,7 +195,7 @@ plugin_loader_t *plugin_loader_create()
{
private_plugin_loader_t *this = malloc_thing(private_plugin_loader_t);
- this->public.load = (int(*)(plugin_loader_t*, char *path, char *prefix))load;
+ this->public.load = (bool(*)(plugin_loader_t*, char *path, char *prefix))load;
this->public.unload = (void(*)(plugin_loader_t*))unload;
this->public.create_plugin_enumerator = (enumerator_t*(*)(plugin_loader_t*))create_plugin_enumerator;
this->public.destroy = (void(*)(plugin_loader_t*))destroy;
diff --git a/src/libstrongswan/plugins/plugin_loader.h b/src/libstrongswan/plugins/plugin_loader.h
index 6230f9d68..3429e9224 100644
--- a/src/libstrongswan/plugins/plugin_loader.h
+++ b/src/libstrongswan/plugins/plugin_loader.h
@@ -33,11 +33,15 @@ struct plugin_loader_t {
/**
* Load a list of plugins from a directory.
*
+ * Each plugin in list may have a ending exclamation mark (!) to mark it
+ * as a critical plugin. If loading a critical plugin fails, plugin loading
+ * is aborted and FALSE is returned.
+ *
* @param path path containing loadable plugins
* @param list space separated list of plugins to load
- * @return number of successfully loaded plugins
+ * @return TRUE if all critical plugins loaded successfully
*/
- int (*load)(plugin_loader_t *this, char *path, char *list);
+ bool (*load)(plugin_loader_t *this, char *path, char *list);
/**
* Unload all loaded plugins.
@@ -52,9 +56,9 @@ struct plugin_loader_t {
enumerator_t* (*create_plugin_enumerator)(plugin_loader_t *this);
/**
- * Unload loaded plugins, destroy plugin_loader instance.
- */
- void (*destroy)(plugin_loader_t *this);
+ * Unload loaded plugins, destroy plugin_loader instance.
+ */
+ void (*destroy)(plugin_loader_t *this);
};
/**