plugin-loader: Support a reload() callback for static features

This commit is contained in:
Martin Willi
2014-09-22 13:55:12 +02:00
parent 73ed38e74f
commit 5421092b75
9 changed files with 44 additions and 12 deletions
+1 -1
View File
@@ -174,5 +174,5 @@ void nm_backend_register()
PLUGIN_SDEPEND(CERT_DECODE, CERT_X509),
};
lib->plugins->add_static_features(lib->plugins, "nm-backend", features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
}
+1 -1
View File
@@ -296,7 +296,7 @@ int main(int argc, char *argv[])
PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"),
};
lib->plugins->add_static_features(lib->plugins, "tkm-backend", features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
if (!register_dh_mapping())
{
+2 -1
View File
@@ -159,7 +159,8 @@ int register_dh_mapping()
}
enumerator->destroy(enumerator);
lib->plugins->add_static_features(lib->plugins, "tkm-dh", f, countof(f), TRUE);
lib->plugins->add_static_features(lib->plugins, "tkm-dh", f, countof(f),
TRUE, NULL, NULL);
if (count > 0)
{
+1 -1
View File
@@ -64,7 +64,7 @@ static bool test_runner_init(bool init)
PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"),
};
lib->plugins->add_static_features(lib->plugins, "tkm-tests", features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
lib->settings->set_int(lib->settings, "%s.dh_mapping.%d", 1,
lib->ns, MODP_3072_BIT);
@@ -543,7 +543,7 @@ static void charonservice_init(JNIEnv *env, jobject service, jobject builder,
charonservice = &this->public;
lib->plugins->add_static_features(lib->plugins, "androidbridge", features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
#ifdef USE_BYOD
if (byod)
@@ -556,7 +556,7 @@ static void charonservice_init(JNIEnv *env, jobject service, jobject builder,
};
lib->plugins->add_static_features(lib->plugins, "android-byod",
byod_features, countof(byod_features), TRUE);
byod_features, countof(byod_features), TRUE, NULL, NULL);
}
#endif
}
+1 -1
View File
@@ -593,7 +593,7 @@ METHOD(daemon_t, initialize, bool,
PLUGIN_DEPENDS(CUSTOM, "socket"),
};
lib->plugins->add_static_features(lib->plugins, lib->ns, features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
/* load plugins, further infrastructure may need it */
if (!lib->plugins->load(lib->plugins, plugins))
+28 -3
View File
@@ -217,6 +217,16 @@ typedef struct {
*/
char *name;
/**
* Optional reload function for features
*/
bool (*reload)(void *data);
/**
* User data to pass to reload function
*/
void *reload_data;
/**
* Static plugin features
*/
@@ -242,6 +252,16 @@ METHOD(plugin_t, get_static_features, int,
return this->count;
}
METHOD(plugin_t, static_reload, bool,
static_features_t *this)
{
if (this->reload)
{
return this->reload(this->reload_data);
}
return FALSE;
}
METHOD(plugin_t, static_destroy, void,
static_features_t *this)
{
@@ -254,7 +274,8 @@ METHOD(plugin_t, static_destroy, void,
* Create a wrapper around static plugin features.
*/
static plugin_t *static_features_create(const char *name,
plugin_feature_t features[], int count)
plugin_feature_t features[], int count,
bool (*reload)(void*), void *reload_data)
{
static_features_t *this;
@@ -262,9 +283,12 @@ static plugin_t *static_features_create(const char *name,
.public = {
.get_name = _get_static_name,
.get_features = _get_static_features,
.reload = _static_reload,
.destroy = _static_destroy,
},
.name = strdup(name),
.reload = reload,
.reload_data = reload_data,
.features = calloc(count, sizeof(plugin_feature_t)),
.count = count,
);
@@ -904,12 +928,13 @@ static void purge_plugins(private_plugin_loader_t *this)
METHOD(plugin_loader_t, add_static_features, void,
private_plugin_loader_t *this, const char *name,
plugin_feature_t features[], int count, bool critical)
plugin_feature_t features[], int count, bool critical,
bool (*reload)(void*), void *reload_data)
{
plugin_entry_t *entry;
plugin_t *plugin;
plugin = static_features_create(name, features, count);
plugin = static_features_create(name, features, count, reload, reload_data);
INIT(entry,
.plugin = plugin,
+7 -1
View File
@@ -44,6 +44,9 @@ struct plugin_loader_t {
* If critical is TRUE load() will fail if any of the added features could
* not be loaded.
*
* If a reload callback function is given, it gets invoked for the
* registered feature set when reload() is invoked on the plugin_loader.
*
* @note The name should be unique otherwise a plugin with the same name is
* not loaded.
*
@@ -51,10 +54,13 @@ struct plugin_loader_t {
* @param features array of plugin features
* @param count number of features in the array
* @param critical TRUE if the features are critical
* @param reload feature reload callback, or NULL
* @param reload_data user data to pass to reload callback
*/
void (*add_static_features) (plugin_loader_t *this, const char *name,
struct plugin_feature_t *features, int count,
bool critical);
bool critical, bool (*reload)(void*),
void *reload_data);
/**
* Load a list of plugins.
+1 -1
View File
@@ -227,7 +227,7 @@ static void init()
options = options_create();
lib->plugins->add_static_features(lib->plugins, "pt-tls-client", features,
countof(features), TRUE);
countof(features), TRUE, NULL, NULL);
if (!lib->plugins->load(lib->plugins,
lib->settings->get_str(lib->settings, "pt-tls-client.load", PLUGINS)))
{