diff options
author | Martin Willi <martin@revosec.ch> | 2010-03-24 15:28:14 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2010-03-25 14:29:10 +0100 |
commit | b262429e0b991ec8dbe7f7694c8f0418023f0fde (patch) | |
tree | 51012f3a4818c86cbf01b98a8d25c790274b8feb /src/libcharon/plugins/dhcp/dhcp_transaction.c | |
parent | 913eb696929d9c611cc9a85a0609c122467f696e (diff) | |
download | strongswan-b262429e0b991ec8dbe7f7694c8f0418023f0fde.tar.bz2 strongswan-b262429e0b991ec8dbe7f7694c8f0418023f0fde.tar.xz |
Include configuration payloads for DNS/WINS server received via DHCP
Diffstat (limited to 'src/libcharon/plugins/dhcp/dhcp_transaction.c')
-rw-r--r-- | src/libcharon/plugins/dhcp/dhcp_transaction.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libcharon/plugins/dhcp/dhcp_transaction.c b/src/libcharon/plugins/dhcp/dhcp_transaction.c index 27235ffb9..83f822dd8 100644 --- a/src/libcharon/plugins/dhcp/dhcp_transaction.c +++ b/src/libcharon/plugins/dhcp/dhcp_transaction.c @@ -15,6 +15,8 @@ #include "dhcp_transaction.h" +#include <utils/linked_list.h> + typedef struct private_dhcp_transaction_t private_dhcp_transaction_t; /** @@ -46,8 +48,21 @@ struct private_dhcp_transaction_t { * discovered DHCP server address */ host_t *server; + + /** + * List of added attributes, as attribute_entry_t + */ + linked_list_t *attributes; }; +/** + * Entry for an added attribute + */ +typedef struct { + configuration_attribute_type_t type; + chunk_t data; +} attribute_entry_t; + METHOD(dhcp_transaction_t, get_id, u_int32_t, private_dhcp_transaction_t *this) { @@ -86,12 +101,56 @@ METHOD(dhcp_transaction_t, get_server, host_t*, return this->server; } +METHOD(dhcp_transaction_t, add_attribute, void, + private_dhcp_transaction_t *this, configuration_attribute_type_t type, + chunk_t data) +{ + attribute_entry_t *entry; + + INIT(entry, + .type = type, + .data = chunk_clone(data), + ); + this->attributes->insert_last(this->attributes, entry); +} + +/** + * Filter function to map entries to type/data + */ +static bool attribute_filter(void *null, attribute_entry_t **entry, + configuration_attribute_type_t *type, + void **dummy, chunk_t *data) +{ + *type = (*entry)->type; + *data = (*entry)->data; + return TRUE; +} + +METHOD(dhcp_transaction_t, create_attribute_enumerator, enumerator_t*, + private_dhcp_transaction_t *this) +{ + return enumerator_create_filter( + this->attributes->create_enumerator(this->attributes), + (void*)attribute_filter, NULL, NULL); +} + +/** + * Clean up an attribute entry + */ +static void attribute_entry_destroy(attribute_entry_t *entry) +{ + free(entry->data.ptr); + free(entry); +} + METHOD(dhcp_transaction_t, destroy, void, private_dhcp_transaction_t *this) { this->identity->destroy(this->identity); DESTROY_IF(this->address); DESTROY_IF(this->server); + this->attributes->destroy_function(this->attributes, + (void*)attribute_entry_destroy); free(this); } @@ -111,10 +170,13 @@ dhcp_transaction_t *dhcp_transaction_create(u_int32_t id, .get_address = _get_address, .set_server = _set_server, .get_server = _get_server, + .add_attribute = _add_attribute, + .create_attribute_enumerator = _create_attribute_enumerator, .destroy = _destroy, }, .id = id, .identity = identity->clone(identity), + .attributes = linked_list_create(), ); return &this->public; |