diff options
author | Andreas Steffen <andreas.steffen@strongswan.org> | 2010-11-16 20:14:48 +0100 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2010-11-16 20:14:48 +0100 |
commit | 92477a0625c5fba739d416cddd81edd9ae3caefe (patch) | |
tree | 592c8605d6f6c858d61a2d358f29ae9e3ee96f59 /src/libcharon/tnc/tnccs/tnccs_manager.c | |
parent | 4d178affbb2e042b72b361242d833687ea332c9a (diff) | |
download | strongswan-92477a0625c5fba739d416cddd81edd9ae3caefe.tar.bz2 strongswan-92477a0625c5fba739d416cddd81edd9ae3caefe.tar.xz |
implement GetAttribute() callback function
Diffstat (limited to 'src/libcharon/tnc/tnccs/tnccs_manager.c')
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs_manager.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.c b/src/libcharon/tnc/tnccs/tnccs_manager.c index 0c59e0c26..d99ed85e7 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.c +++ b/src/libcharon/tnc/tnccs/tnccs_manager.c @@ -57,13 +57,13 @@ struct tnccs_connection_entry_t { */ tnccs_t *tnccs; - /** TNCCS send message function - * + /** + * TNCCS send message function */ tnccs_send_message_t send_message; - /** collection of IMV recommendations - * + /** + * collection of IMV recommendations */ recommendations_t *recs; }; @@ -296,6 +296,65 @@ METHOD(tnccs_manager_t, provide_recommendation, TNC_Result, return TNC_RESULT_FATAL; } +METHOD(tnccs_manager_t, get_attribute, TNC_Result, + private_tnccs_manager_t *this, TNC_IMVID imv_id, + TNC_ConnectionID id, + TNC_AttributeID attribute_id, + TNC_UInt32 buffer_len, + TNC_BufferReference buffer, + TNC_UInt32 *out_value_len) +{ + enumerator_t *enumerator; + tnccs_connection_entry_t *entry; + recommendations_t *recs = NULL; + + if (attribute_id != TNC_ATTRIBUTEID_PREFERRED_LANGUAGE) + { + return TNC_RESULT_INVALID_PARAMETER; + } + + this->connection_lock->read_lock(this->connection_lock); + enumerator = this->connections->create_enumerator(this->connections); + while (enumerator->enumerate(enumerator, &entry)) + { + if (id == entry->id) + { + recs = entry->recs; + break; + } + } + enumerator->destroy(enumerator); + this->connection_lock->unlock(this->connection_lock); + + if (recs) + { + chunk_t pref_lang; + + pref_lang = recs->get_preferred_language(recs); + if (pref_lang.len == 0) + { + return TNC_RESULT_INVALID_PARAMETER; + } + *out_value_len = pref_lang.len; + if (buffer && buffer_len <= pref_lang.len) + { + memcpy(buffer, pref_lang.ptr, pref_lang.len); + } + return TNC_RESULT_SUCCESS; + } + return TNC_RESULT_INVALID_PARAMETER; +} + +METHOD(tnccs_manager_t, set_attribute, TNC_Result, + private_tnccs_manager_t *this, TNC_IMVID imv_id, + TNC_ConnectionID id, + TNC_AttributeID attribute_id, + TNC_UInt32 buffer_len, + TNC_BufferReference buffer) +{ + return TNC_RESULT_INVALID_PARAMETER; +} + METHOD(tnccs_manager_t, destroy, void, private_tnccs_manager_t *this) { @@ -322,6 +381,8 @@ tnccs_manager_t *tnccs_manager_create() .remove_connection = _remove_connection, .send_message = _send_message, .provide_recommendation = _provide_recommendation, + .get_attribute = _get_attribute, + .set_attribute = _set_attribute, .destroy = _destroy, }, .protocols = linked_list_create(), |