aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libstrongswan/credentials/credential_factory.c26
-rw-r--r--src/libstrongswan/credentials/credential_factory.h6
2 files changed, 32 insertions, 0 deletions
diff --git a/src/libstrongswan/credentials/credential_factory.c b/src/libstrongswan/credentials/credential_factory.c
index 4be52df8b..c9444503a 100644
--- a/src/libstrongswan/credentials/credential_factory.c
+++ b/src/libstrongswan/credentials/credential_factory.c
@@ -149,6 +149,31 @@ METHOD(credential_factory_t, create, void*,
return construct;
}
+/**
+ * Filter function for builder enumerator
+ */
+static bool builder_filter(void *null, entry_t **entry, credential_type_t *type,
+ void *dummy1, int *subtype,
+ void *dummy2, builder_function_t *constructor)
+{
+ *type = (*entry)->type;
+ *subtype = (*entry)->subtype;
+ if (constructor)
+ {
+ *constructor = (*entry)->constructor;
+ }
+ return TRUE;
+}
+
+METHOD(credential_factory_t, create_builder_enumerator, enumerator_t*,
+ private_credential_factory_t *this)
+{
+ this->lock->read_lock(this->lock);
+ return enumerator_create_filter(
+ this->constructors->create_enumerator(this->constructors),
+ (void*)builder_filter, this->lock, (void*)this->lock->unlock);
+}
+
METHOD(credential_factory_t, destroy, void,
private_credential_factory_t *this)
{
@@ -168,6 +193,7 @@ credential_factory_t *credential_factory_create()
INIT(this,
.public = {
.create = _create,
+ .create_builder_enumerator = _create_builder_enumerator,
.add_builder = _add_builder,
.remove_builder = _remove_builder,
.destroy = _destroy,
diff --git a/src/libstrongswan/credentials/credential_factory.h b/src/libstrongswan/credentials/credential_factory.h
index e8ffb6b9d..ee1351b15 100644
--- a/src/libstrongswan/credentials/credential_factory.h
+++ b/src/libstrongswan/credentials/credential_factory.h
@@ -64,6 +64,12 @@ struct credential_factory_t {
*/
void* (*create)(credential_factory_t *this, credential_type_t type,
int subtype, ...);
+ /**
+ * Create an enumerator over registered builder functions.
+ *
+ * @return enumerator (credential_type_t, int, build_function_t)
+ */
+ enumerator_t* (*create_builder_enumerator)(credential_factory_t *this);
/**
* Register a credential builder function.