aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/sql
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-06-11 11:18:33 +0200
committerTobias Brunner <tobias@strongswan.org>2013-06-11 11:36:40 +0200
commit5744226e92127f074e7623865bc94ecc12ba22ee (patch)
tree8bd68bee608ff4925ca45ce2ba11c9e1291e2f53 /src/libcharon/plugins/sql
parentc50da645b8ade875d265802c2850f12792fbb633 (diff)
parent31a416a5b2d0b63bade04d50083b4b9b75daa1ae (diff)
downloadstrongswan-5744226e92127f074e7623865bc94ecc12ba22ee.tar.bz2
strongswan-5744226e92127f074e7623865bc94ecc12ba22ee.tar.xz
Merge branch 'plugin-loader'
Improves how plugin loader resolves dependencies between plugins. The old loader had problems if plugins had dependencies on features provided by plugins listed later in the plugin list. For instance, it was not possible to use the X.509 implementation provided by the x509 plugin while using all the crypto primitives provided by the openssl plugin. Because the x509 plugin has a dependency on SHA1, the old loader skipped that plugin until it loaded a SHA1 implementation. Because the loader also loaded all features with resolved dependencies provided by a specific plugin it would, while loading the openssl plugin's SHA1 implementation, also load its X.509 implementation. So to use the x509 plugin it was necessary to load the sha1 plugin before it so that its dependencies could be properly resolved. With the new implementation the plugins don't have to be in a specific order to resolve dependencies. But the order still matters if two plugins provide the same feature. Also, support for the get_features() interface was added to all plugins.
Diffstat (limited to 'src/libcharon/plugins/sql')
-rw-r--r--src/libcharon/plugins/sql/sql_plugin.c95
1 files changed, 62 insertions, 33 deletions
diff --git a/src/libcharon/plugins/sql/sql_plugin.c b/src/libcharon/plugins/sql/sql_plugin.c
index afbb89c83..c1b4461d2 100644
--- a/src/libcharon/plugins/sql/sql_plugin.c
+++ b/src/libcharon/plugins/sql/sql_plugin.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2008 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -16,6 +17,8 @@
#include "sql_plugin.h"
#include <daemon.h>
+#include <plugins/plugin_feature.h>
+
#include "sql_config.h"
#include "sql_cred.h"
#include "sql_logger.h"
@@ -59,16 +62,67 @@ METHOD(plugin_t, get_name, char*,
return "sql";
}
+/**
+ * Connect to database
+ */
+static bool open_database(private_sql_plugin_t *this,
+ plugin_feature_t *feature, bool reg, void *cb_data)
+{
+ if (reg)
+ {
+ char *uri;
+
+ uri = lib->settings->get_str(lib->settings, "%s.plugins.sql.database",
+ NULL, charon->name);
+ if (!uri)
+ {
+ DBG1(DBG_CFG, "sql plugin: database URI not set");
+ return FALSE;
+ }
+
+ this->db = lib->db->create(lib->db, uri);
+ if (!this->db)
+ {
+ DBG1(DBG_CFG, "sql plugin failed to connect to database");
+ return FALSE;
+ }
+ this->config = sql_config_create(this->db);
+ this->cred = sql_cred_create(this->db);
+ this->logger = sql_logger_create(this->db);
+
+ charon->backends->add_backend(charon->backends, &this->config->backend);
+ lib->credmgr->add_set(lib->credmgr, &this->cred->set);
+ charon->bus->add_logger(charon->bus, &this->logger->logger);
+ }
+ else
+ {
+ charon->backends->remove_backend(charon->backends,
+ &this->config->backend);
+ lib->credmgr->remove_set(lib->credmgr, &this->cred->set);
+ charon->bus->remove_logger(charon->bus, &this->logger->logger);
+ this->config->destroy(this->config);
+ this->cred->destroy(this->cred);
+ this->logger->destroy(this->logger);
+ this->db->destroy(this->db);
+ }
+ return TRUE;
+}
+
+METHOD(plugin_t, get_features, int,
+ private_sql_plugin_t *this, plugin_feature_t *features[])
+{
+ static plugin_feature_t f[] = {
+ PLUGIN_CALLBACK((plugin_feature_callback_t)open_database, NULL),
+ PLUGIN_PROVIDE(CUSTOM, "sql"),
+ PLUGIN_DEPENDS(DATABASE, DB_ANY),
+ };
+ *features = f;
+ return countof(f);
+}
+
METHOD(plugin_t, destroy, void,
private_sql_plugin_t *this)
{
- charon->backends->remove_backend(charon->backends, &this->config->backend);
- lib->credmgr->remove_set(lib->credmgr, &this->cred->set);
- charon->bus->remove_logger(charon->bus, &this->logger->logger);
- this->config->destroy(this->config);
- this->cred->destroy(this->cred);
- this->logger->destroy(this->logger);
- this->db->destroy(this->db);
free(this);
}
@@ -77,42 +131,17 @@ METHOD(plugin_t, destroy, void,
*/
plugin_t *sql_plugin_create()
{
- char *uri;
private_sql_plugin_t *this;
- uri = lib->settings->get_str(lib->settings, "%s.plugins.sql.database",
- NULL, charon->name);
- if (!uri)
- {
- DBG1(DBG_CFG, "sql plugin: database URI not set");
- return NULL;
- }
-
INIT(this,
.public = {
.plugin = {
.get_name = _get_name,
- .reload = (void*)return_false,
+ .get_features = _get_features,
.destroy = _destroy,
},
},
- .db = lib->db->create(lib->db, uri),
);
- if (!this->db)
- {
- DBG1(DBG_CFG, "sql plugin failed to connect to database");
- free(this);
- return NULL;
- }
- this->config = sql_config_create(this->db);
- this->cred = sql_cred_create(this->db);
- this->logger = sql_logger_create(this->db);
-
- charon->backends->add_backend(charon->backends, &this->config->backend);
- lib->credmgr->add_set(lib->credmgr, &this->cred->set);
- charon->bus->add_logger(charon->bus, &this->logger->logger);
-
return &this->public.plugin;
}
-