Load arbitrary (non-host) attributes from strongswan.conf

This allows to e.g. load Cisco-specific attributes that contain FQDNs.
This commit is contained in:
Tobias Brunner
2013-03-19 15:21:30 +01:00
parent 824864f4e0
commit deafaf51f1
+32 -21
View File
@@ -185,6 +185,7 @@ static void load_entries(private_attr_provider_t *this)
configuration_attribute_type_t type; configuration_attribute_type_t type;
attribute_type_key_t *mapped = NULL; attribute_type_key_t *mapped = NULL;
attribute_entry_t *entry; attribute_entry_t *entry;
chunk_t data;
host_t *host; host_t *host;
char *pos; char *pos;
int i, mask = -1, family; int i, mask = -1, family;
@@ -218,34 +219,44 @@ static void load_entries(private_attr_provider_t *this)
host = host_create_from_string(token, 0); host = host_create_from_string(token, 0);
if (!host) if (!host)
{ {
DBG1(DBG_CFG, "invalid host in key %s: %s", key, token); if (!type)
continue; {
} DBG1(DBG_CFG, "invalid host in key %s: %s", key, token);
family = host->get_family(host); continue;
entry = malloc_thing(attribute_entry_t); }
entry->type = type ?: (family == AF_INET ? mapped->v4 : mapped->v6); /* store numeric attributes that are no IP addresses as strings */
if (mask == -1) data = chunk_clone(chunk_from_str(token));
{
entry->value = chunk_clone(host->get_address(host));
} }
else else
{ {
if (family == AF_INET) family = host->get_family(host);
{ /* IPv4 attributes contain a subnet mask */ if (mask == -1)
u_int32_t netmask; {
data = chunk_clone(host->get_address(host));
mask = 32 - mask;
netmask = htonl((0xFFFFFFFF >> mask) << mask);
entry->value = chunk_cat("cc", host->get_address(host),
chunk_from_thing(netmask));
} }
else else
{ /* IPv6 addresses the prefix only */ {
entry->value = chunk_cat("cc", host->get_address(host), if (family == AF_INET)
chunk_from_chars(mask)); { /* IPv4 attributes contain a subnet mask */
u_int32_t netmask;
mask = 32 - mask;
netmask = htonl((0xFFFFFFFF >> mask) << mask);
data = chunk_cat("cc", host->get_address(host),
chunk_from_thing(netmask));
}
else
{ /* IPv6 addresses the prefix only */
data = chunk_cat("cc", host->get_address(host),
chunk_from_chars(mask));
}
} }
host->destroy(host);
} }
host->destroy(host); INIT(entry,
.type = type ?: (family == AF_INET ? mapped->v4 : mapped->v6),
.value = data,
);
DBG2(DBG_CFG, "loaded attribute %N: %#B", DBG2(DBG_CFG, "loaded attribute %N: %#B",
configuration_attribute_type_names, entry->type, &entry->value); configuration_attribute_type_names, entry->type, &entry->value);
this->attributes->insert_last(this->attributes, entry); this->attributes->insert_last(this->attributes, entry);