aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2012-01-19 12:27:56 +0100
committerTobias Brunner <tobias@strongswan.org>2012-01-19 12:37:42 +0100
commitf1ba06c1c6eff3e7c6a5666bcb68d3f3e2e8a373 (patch)
treecf82f97e848a47f9d45ca1db048ca81c082d2c95 /src
parentfdf1f239ef33d9bb69a49138956c6fd52c74a053 (diff)
downloadstrongswan-f1ba06c1c6eff3e7c6a5666bcb68d3f3e2e8a373.tar.bz2
strongswan-f1ba06c1c6eff3e7c6a5666bcb68d3f3e2e8a373.tar.xz
Cache list of plugin names to further simplify its usage.
Also helpful for ipsec statusall to avoid having to enumerate plugins.
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/daemon.c16
-rw-r--r--src/libcharon/plugins/stroke/stroke_list.c8
-rw-r--r--src/libstrongswan/plugins/plugin_loader.c65
-rw-r--r--src/libstrongswan/plugins/plugin_loader.h4
-rw-r--r--src/pki/command.c5
-rw-r--r--src/pluto/log.c7
-rw-r--r--src/pluto/plutomain.c15
-rw-r--r--src/scepclient/scepclient.c15
8 files changed, 62 insertions, 73 deletions
diff --git a/src/libcharon/daemon.c b/src/libcharon/daemon.c
index f175826d5..3fb49d475 100644
--- a/src/libcharon/daemon.c
+++ b/src/libcharon/daemon.c
@@ -201,18 +201,6 @@ METHOD(daemon_t, start, void,
DEFAULT_THREADS));
}
-/**
- * Log loaded plugins
- */
-static void print_plugins()
-{
- char *plugins;
-
- plugins = lib->plugins->loaded_plugins(lib->plugins);
- DBG1(DBG_DMN, "loaded plugins: %s", plugins);
- free(plugins);
-}
-
METHOD(daemon_t, initialize, bool,
private_daemon_t *this)
{
@@ -233,8 +221,8 @@ METHOD(daemon_t, initialize, bool,
{
return FALSE;
}
-
- print_plugins();
+ DBG1(DBG_DMN, "loaded plugins: %s",
+ lib->plugins->loaded_plugins(lib->plugins));
this->public.ike_sa_manager = ike_sa_manager_create();
if (this->public.ike_sa_manager == NULL)
diff --git a/src/libcharon/plugins/stroke/stroke_list.c b/src/libcharon/plugins/stroke/stroke_list.c
index 8125d37bf..c056dce23 100644
--- a/src/libcharon/plugins/stroke/stroke_list.c
+++ b/src/libcharon/plugins/stroke/stroke_list.c
@@ -414,8 +414,7 @@ METHOD(stroke_list_t, status, void,
if (all)
{
peer_cfg_t *peer_cfg;
- plugin_t *plugin;
- char *pool, *plugins;
+ char *pool;
host_t *host;
u_int32_t dpd;
time_t since, now;
@@ -449,9 +448,8 @@ METHOD(stroke_list_t, status, void,
}
fprintf(out, ", scheduled: %d\n",
lib->scheduler->get_job_load(lib->scheduler));
- plugins = lib->plugins->loaded_plugins(lib->plugins);
- fprintf(out, " loaded plugins: %s\n", plugins);
- free(plugins);
+ fprintf(out, " loaded plugins: %s\n",
+ lib->plugins->loaded_plugins(lib->plugins));
first = TRUE;
enumerator = this->attribute->create_pool_enumerator(this->attribute);
diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c
index 1747cba6e..164b68e60 100644
--- a/src/libstrongswan/plugins/plugin_loader.c
+++ b/src/libstrongswan/plugins/plugin_loader.c
@@ -45,6 +45,11 @@ struct private_plugin_loader_t {
* List of plugins, as plugin_entry_t
*/
linked_list_t *plugins;
+
+ /**
+ * List of names of loaded plugins
+ */
+ char *loaded_plugins;
};
/**
@@ -204,6 +209,38 @@ METHOD(plugin_loader_t, create_plugin_enumerator, enumerator_t*,
}
/**
+ * Create a list of the names of all loaded plugins
+ */
+static char* loaded_plugins_list(private_plugin_loader_t *this)
+{
+ int buf_len = 128, len = 0;
+ char *buf, *name;
+ enumerator_t *enumerator;
+ plugin_t *plugin;
+
+ buf = malloc(buf_len);
+ buf[0] = '\0';
+ enumerator = create_plugin_enumerator(this);
+ while (enumerator->enumerate(enumerator, &plugin, NULL))
+ {
+ name = plugin->get_name(plugin);
+ if (len + (strlen(name) + 1) >= buf_len)
+ {
+ buf_len <<= 1;
+ buf = realloc(buf, buf_len);
+ }
+ len += snprintf(&buf[len], buf_len - len, "%s ", name);
+ }
+ enumerator->destroy(enumerator);
+ if (len > 0 && buf[len - 1] == ' ')
+ {
+ buf[len - 1] = '\0';
+ }
+ return buf;
+}
+
+
+/**
* Check if a plugin is already loaded
*/
static bool plugin_loaded(private_plugin_loader_t *this, char *name)
@@ -516,6 +553,11 @@ METHOD(plugin_loader_t, load_plugins, bool,
/* unload plugins that we were not able to load any features for */
purge_plugins(this);
}
+ if (!critical_failed)
+ {
+ free(this->loaded_plugins);
+ this->loaded_plugins = loaded_plugins_list(this);
+ }
return !critical_failed;
}
@@ -558,6 +600,8 @@ METHOD(plugin_loader_t, unload, void,
}
enumerator->destroy(enumerator);
}
+ free(this->loaded_plugins);
+ this->loaded_plugins = NULL;
}
/**
@@ -609,25 +653,7 @@ METHOD(plugin_loader_t, reload, u_int,
METHOD(plugin_loader_t, loaded_plugins, char*,
private_plugin_loader_t *this)
{
-#define BUF_LEN 512
- char *buf = malloc(BUF_LEN);
- int len = 0;
- enumerator_t *enumerator;
- plugin_t *plugin;
-
- buf[0] = '\0';
- enumerator = create_plugin_enumerator(this);
- while (len < BUF_LEN && enumerator->enumerate(enumerator, &plugin, NULL))
- {
- len += snprintf(&buf[len], BUF_LEN - len, "%s ",
- plugin->get_name(plugin));
- }
- enumerator->destroy(enumerator);
- if (len > 0 && buf[len - 1] == ' ')
- {
- buf[len - 1] = '\0';
- }
- return buf;
+ return this->loaded_plugins ?: "";
}
METHOD(plugin_loader_t, destroy, void,
@@ -635,6 +661,7 @@ METHOD(plugin_loader_t, destroy, void,
{
unload(this);
this->plugins->destroy(this->plugins);
+ free(this->loaded_plugins);
free(this);
}
diff --git a/src/libstrongswan/plugins/plugin_loader.h b/src/libstrongswan/plugins/plugin_loader.h
index 0f677c2fe..7fd07044d 100644
--- a/src/libstrongswan/plugins/plugin_loader.h
+++ b/src/libstrongswan/plugins/plugin_loader.h
@@ -71,7 +71,9 @@ struct plugin_loader_t {
/**
* Get a simple list the names of all loaded plugins.
*
- * @return list of the names of all loaded plugins (allocated)
+ * The function returns internal data, do not free.
+ *
+ * @return list of the names of all loaded plugins
*/
char* (*loaded_plugins)(plugin_loader_t *this);
diff --git a/src/pki/command.c b/src/pki/command.c
index e74072f9e..07ba5bb1d 100644
--- a/src/pki/command.c
+++ b/src/pki/command.c
@@ -179,9 +179,8 @@ int command_usage(char *error)
if (active == help_idx)
{
- char *plugins = lib->plugins->loaded_plugins(lib->plugins);
- fprintf(out, "loaded plugins: %s\n", plugins);
- free(plugins);
+ fprintf(out, "loaded plugins: %s\n",
+ lib->plugins->loaded_plugins(lib->plugins));
}
fprintf(out, "usage:\n");
diff --git a/src/pluto/log.c b/src/pluto/log.c
index 91bc57e1a..f6fa226d5 100644
--- a/src/pluto/log.c
+++ b/src/pluto/log.c
@@ -868,11 +868,8 @@ DBG_dump(const char *label, const void *p, size_t len)
static void show_loaded_plugins()
{
- char *plugins;
-
- plugins = lib->plugins->loaded_plugins(lib->plugins);
- whack_log(RC_COMMENT, "loaded plugins: %s", plugins);
- free(plugins);
+ whack_log(RC_COMMENT, "loaded plugins: %s",
+ lib->plugins->loaded_plugins(lib->plugins));
}
void show_status(bool all, const char *name)
diff --git a/src/pluto/plutomain.c b/src/pluto/plutomain.c
index 904ed82c1..dbc857ce2 100644
--- a/src/pluto/plutomain.c
+++ b/src/pluto/plutomain.c
@@ -264,18 +264,6 @@ static const char *pkcs11_init_args = NULL;
/* options read by optionsfrom */
options_t *options;
-/**
- * Log loaded plugins
- */
-static void print_plugins()
-{
- char *plugins;
-
- plugins = lib->plugins->loaded_plugins(lib->plugins);
- DBG1(DBG_DMN, "loaded plugins: %s", plugins);
- free(plugins);
-}
-
int main(int argc, char **argv)
{
bool fork_desired = TRUE;
@@ -693,7 +681,8 @@ int main(int argc, char **argv)
{
exit(SS_RC_INITIALIZATION_FAILED);
}
- print_plugins();
+ DBG1(DBG_DMN, "loaded plugins: %s",
+ lib->plugins->loaded_plugins(lib->plugins));
init_builder();
if (!init_secret() || !init_crypto())
diff --git a/src/scepclient/scepclient.c b/src/scepclient/scepclient.c
index efe13c264..0b54eeee3 100644
--- a/src/scepclient/scepclient.c
+++ b/src/scepclient/scepclient.c
@@ -276,18 +276,6 @@ usage(const char *message)
}
/**
- * Log loaded plugins
- */
-static void print_plugins()
-{
- char *plugins;
-
- plugins = lib->plugins->loaded_plugins(lib->plugins);
- DBG1(DBG_LIB, " loaded plugins: %s", plugins);
- free(plugins);
-}
-
-/**
* @brief main of scepclient
*
* @param argc number of arguments
@@ -752,7 +740,8 @@ int main(int argc, char **argv)
{
exit_scepclient("plugin loading failed");
}
- print_plugins();
+ DBG1(DBG_LIB, " loaded plugins: %s",
+ lib->plugins->loaded_plugins(lib->plugins));
if ((filetype_out == 0) && (!request_ca_certificate))
{