diff options
author | Tobias Brunner <tobias@strongswan.org> | 2013-06-07 14:44:52 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2013-06-11 11:18:17 +0200 |
commit | 8a6cc1e35f95d58ea72d2b07065d93d586e2d19c (patch) | |
tree | 46cae882041f2d5cf3ffea96b60f02338834822a | |
parent | 270e425b2460989bdd9f9e7580ff98bc4d7861f6 (diff) | |
download | strongswan-8a6cc1e35f95d58ea72d2b07065d93d586e2d19c.tar.bz2 strongswan-8a6cc1e35f95d58ea72d2b07065d93d586e2d19c.tar.xz |
plugin-feature: Function added to exactly compare plugin features
-rw-r--r-- | src/libstrongswan/plugins/plugin_feature.c | 51 | ||||
-rw-r--r-- | src/libstrongswan/plugins/plugin_feature.h | 15 | ||||
-rw-r--r-- | src/libstrongswan/plugins/plugin_loader.c | 4 |
3 files changed, 66 insertions, 4 deletions
diff --git a/src/libstrongswan/plugins/plugin_feature.c b/src/libstrongswan/plugins/plugin_feature.c index 6c954f76d..1ee726a42 100644 --- a/src/libstrongswan/plugins/plugin_feature.c +++ b/src/libstrongswan/plugins/plugin_feature.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Tobias Brunner + * Copyright (C) 2012-2013 Tobias Brunner * Hochschule fuer Technik Rapperswil * * Copyright (C) 2011 Martin Willi @@ -172,6 +172,55 @@ bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b) /** * See header. */ +bool plugin_feature_equals(plugin_feature_t *a, plugin_feature_t *b) +{ + if (a->type == b->type) + { + switch (a->type) + { + case FEATURE_NONE: + case FEATURE_CRYPTER: + case FEATURE_AEAD: + case FEATURE_SIGNER: + case FEATURE_HASHER: + case FEATURE_PRF: + case FEATURE_DH: + case FEATURE_NONCE_GEN: + case FEATURE_PRIVKEY: + case FEATURE_PRIVKEY_GEN: + case FEATURE_PUBKEY: + case FEATURE_PRIVKEY_SIGN: + case FEATURE_PUBKEY_VERIFY: + case FEATURE_PRIVKEY_DECRYPT: + case FEATURE_PUBKEY_ENCRYPT: + case FEATURE_CERT_DECODE: + case FEATURE_CERT_ENCODE: + case FEATURE_CONTAINER_DECODE: + case FEATURE_CONTAINER_ENCODE: + case FEATURE_EAP_SERVER: + case FEATURE_EAP_PEER: + case FEATURE_CUSTOM: + case FEATURE_XAUTH_SERVER: + case FEATURE_XAUTH_PEER: + return plugin_feature_matches(a, b); + case FEATURE_RNG: + return a->arg.rng_quality == b->arg.rng_quality; + case FEATURE_DATABASE: + return a->arg.database == b->arg.database; + case FEATURE_FETCHER: + if (a->arg.fetcher && b->arg.fetcher) + { + return streq(a->arg.fetcher, b->arg.fetcher); + } + return !a->arg.fetcher && !b->arg.fetcher; + } + } + return FALSE; +} + +/** + * See header. + */ char* plugin_feature_get_string(plugin_feature_t *feature) { char *str = NULL; diff --git a/src/libstrongswan/plugins/plugin_feature.h b/src/libstrongswan/plugins/plugin_feature.h index 7667fff3e..0f29bf69e 100644 --- a/src/libstrongswan/plugins/plugin_feature.h +++ b/src/libstrongswan/plugins/plugin_feature.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Tobias Brunner + * Copyright (C) 2012-2013 Tobias Brunner * Hochschule fuer Technik Rapperswil * * Copyright (C) 2011 Martin Willi @@ -340,6 +340,10 @@ u_int32_t plugin_feature_hash(plugin_feature_t *feature); /** * Check if feature a matches to feature b. * + * This is no check for equality. For instance, for FEATURE_RNG a matches b if + * a's strength is at least the strength of b. Or for FEATURE_SQL if a is + * DB_ANY it will match b if it is of the same type. + * * @param a feature to check * @param b feature to match against * @return TRUE if a matches b @@ -347,6 +351,15 @@ u_int32_t plugin_feature_hash(plugin_feature_t *feature); bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b); /** + * Check if feature a equals feature b. + * + * @param a feature + * @param b feature to compare + * @return TRUE if a equals b + */ +bool plugin_feature_equals(plugin_feature_t *a, plugin_feature_t *b); + +/** * Get a string describing feature. * * @param feature feature to describe diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c index cea219e92..109f78a86 100644 --- a/src/libstrongswan/plugins/plugin_loader.c +++ b/src/libstrongswan/plugins/plugin_loader.c @@ -179,7 +179,7 @@ static plugin_t *static_features_create(const char *name, /** * Compare function for hashtable of loaded features. */ -static bool plugin_feature_equals(plugin_feature_t *a, plugin_feature_t *b) +static bool plugin_feature_equals_ptr(plugin_feature_t *a, plugin_feature_t *b) { return a == b; } @@ -850,7 +850,7 @@ plugin_loader_t *plugin_loader_create() .plugins = linked_list_create(), .loaded_features = hashtable_create( (hashtable_hash_t)plugin_feature_hash, - (hashtable_equals_t)plugin_feature_equals, 64), + (hashtable_equals_t)plugin_feature_equals_ptr, 64), ); return &this->public; |