aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-06-07 14:44:52 +0200
committerTobias Brunner <tobias@strongswan.org>2013-06-11 11:18:17 +0200
commit8a6cc1e35f95d58ea72d2b07065d93d586e2d19c (patch)
tree46cae882041f2d5cf3ffea96b60f02338834822a
parent270e425b2460989bdd9f9e7580ff98bc4d7861f6 (diff)
downloadstrongswan-8a6cc1e35f95d58ea72d2b07065d93d586e2d19c.tar.bz2
strongswan-8a6cc1e35f95d58ea72d2b07065d93d586e2d19c.tar.xz
plugin-feature: Function added to exactly compare plugin features
-rw-r--r--src/libstrongswan/plugins/plugin_feature.c51
-rw-r--r--src/libstrongswan/plugins/plugin_feature.h15
-rw-r--r--src/libstrongswan/plugins/plugin_loader.c4
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;