From: Martin Willi Date: Thu, 2 Sep 2010 07:46:09 +0000 (+0200) Subject: Added an enumerator for registered credential builders X-Git-Tag: 4.5.0~351 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ac49c3292c84a6b39f01e3d985de24f23c42dc1;p=thirdparty%2Fstrongswan.git Added an enumerator for registered credential builders --- diff --git a/src/libstrongswan/credentials/credential_factory.c b/src/libstrongswan/credentials/credential_factory.c index 4be52df8be..c9444503af 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 e8ffb6b9df..ee1351b15e 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.