Change interface for enumerator_create_filter() callback
This avoids the unportable 5 pointer hack, but requires enumerating in the callback.
This commit is contained in:
@@ -75,17 +75,23 @@ typedef struct {
|
||||
ike_version_t ike;
|
||||
} enumerator_data_t;
|
||||
|
||||
/**
|
||||
* convert enumerator value from attribute_entry
|
||||
*/
|
||||
static bool attr_enum_filter(enumerator_data_t *data, attribute_entry_t **in,
|
||||
configuration_attribute_type_t *type, void* none, chunk_t *value)
|
||||
CALLBACK(attr_enum_filter, bool,
|
||||
enumerator_data_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if ((*in)->ike == IKE_ANY || (*in)->ike == data->ike)
|
||||
configuration_attribute_type_t *type;
|
||||
attribute_entry_t *entry;
|
||||
chunk_t *value;
|
||||
|
||||
VA_ARGS_VGET(args, type, value);
|
||||
|
||||
while (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*type = (*in)->type;
|
||||
*value = (*in)->value;
|
||||
return TRUE;
|
||||
if (entry->ike == IKE_ANY || entry->ike == data->ike)
|
||||
{
|
||||
*type = entry->type;
|
||||
*value = entry->value;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -112,7 +118,7 @@ METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(
|
||||
this->attributes->create_enumerator(this->attributes),
|
||||
(void*)attr_enum_filter, data, attr_enum_destroy);
|
||||
attr_enum_filter, data, attr_enum_destroy);
|
||||
}
|
||||
return enumerator_create_empty();
|
||||
}
|
||||
|
||||
@@ -114,16 +114,22 @@ METHOD(dhcp_transaction_t, add_attribute, void,
|
||||
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)
|
||||
CALLBACK(attribute_filter, bool,
|
||||
void *null, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*type = (*entry)->type;
|
||||
*data = (*entry)->data;
|
||||
return TRUE;
|
||||
configuration_attribute_type_t *type;
|
||||
attribute_entry_t *entry;
|
||||
chunk_t *data;
|
||||
|
||||
VA_ARGS_VGET(args, type, data);
|
||||
|
||||
if (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*type = entry->type;
|
||||
*data = entry->data;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(dhcp_transaction_t, create_attribute_enumerator, enumerator_t*,
|
||||
@@ -131,7 +137,7 @@ METHOD(dhcp_transaction_t, create_attribute_enumerator, enumerator_t*,
|
||||
{
|
||||
return enumerator_create_filter(
|
||||
this->attributes->create_enumerator(this->attributes),
|
||||
(void*)attribute_filter, NULL, NULL);
|
||||
attribute_filter, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -613,17 +613,23 @@ METHOD(listener_t, ike_update, bool,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter to map entries to ts/mark
|
||||
*/
|
||||
static bool ts_filter(entry_t *entry, traffic_selector_t **ts,
|
||||
traffic_selector_t **out, void *dummy, uint32_t *mark,
|
||||
void *dummy2, bool *reinject)
|
||||
CALLBACK(ts_filter, bool,
|
||||
entry_t *entry, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*out = *ts;
|
||||
*mark = entry->mark;
|
||||
*reinject = entry->reinject;
|
||||
return TRUE;
|
||||
traffic_selector_t *ts, **out;
|
||||
uint32_t *mark;
|
||||
bool *reinject;
|
||||
|
||||
VA_ARGS_VGET(args, out, mark, reinject);
|
||||
|
||||
if (orig->enumerate(orig, &ts))
|
||||
{
|
||||
*out = ts;
|
||||
*mark = entry->mark;
|
||||
*reinject = entry->reinject;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -632,7 +638,7 @@ static bool ts_filter(entry_t *entry, traffic_selector_t **ts,
|
||||
static enumerator_t* create_inner_local(entry_t *entry, rwlock_t *lock)
|
||||
{
|
||||
return enumerator_create_filter(array_create_enumerator(entry->lts),
|
||||
(void*)ts_filter, entry, NULL);
|
||||
ts_filter, entry, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -641,7 +647,7 @@ static enumerator_t* create_inner_local(entry_t *entry, rwlock_t *lock)
|
||||
static enumerator_t* create_inner_remote(entry_t *entry, rwlock_t *lock)
|
||||
{
|
||||
return enumerator_create_filter(array_create_enumerator(entry->rts),
|
||||
(void*)ts_filter, entry, NULL);
|
||||
ts_filter, entry, NULL);
|
||||
}
|
||||
|
||||
METHOD(forecast_listener_t, create_enumerator, enumerator_t*,
|
||||
|
||||
@@ -1518,35 +1518,39 @@ typedef struct {
|
||||
kernel_address_type_t which;
|
||||
} address_enumerator_t;
|
||||
|
||||
/**
|
||||
* cleanup function for address enumerator
|
||||
*/
|
||||
static void address_enumerator_destroy(address_enumerator_t *data)
|
||||
CALLBACK(address_enumerator_destroy, void,
|
||||
address_enumerator_t *data)
|
||||
{
|
||||
data->this->lock->unlock(data->this->lock);
|
||||
free(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter for addresses
|
||||
*/
|
||||
static bool filter_addresses(address_enumerator_t *data,
|
||||
addr_entry_t** in, host_t** out)
|
||||
CALLBACK(filter_addresses, bool,
|
||||
address_enumerator_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_VIRTUAL) && (*in)->refcount)
|
||||
{ /* skip virtual interfaces added by us */
|
||||
return FALSE;
|
||||
addr_entry_t *addr;
|
||||
host_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &addr))
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_VIRTUAL) && addr->refcount)
|
||||
{ /* skip virtual interfaces added by us */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_REGULAR) && !addr->refcount)
|
||||
{ /* address is regular, but not requested */
|
||||
continue;
|
||||
}
|
||||
if (addr->scope >= RT_SCOPE_LINK)
|
||||
{ /* skip addresses with a unusable scope */
|
||||
continue;
|
||||
}
|
||||
*out = addr->ip;
|
||||
return TRUE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->refcount)
|
||||
{ /* address is regular, but not requested */
|
||||
return FALSE;
|
||||
}
|
||||
if ((*in)->scope >= RT_SCOPE_LINK)
|
||||
{ /* skip addresses with a unusable scope */
|
||||
return FALSE;
|
||||
}
|
||||
*out = (*in)->ip;
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1556,30 +1560,35 @@ static enumerator_t *create_iface_enumerator(iface_entry_t *iface,
|
||||
address_enumerator_t *data)
|
||||
{
|
||||
return enumerator_create_filter(
|
||||
iface->addrs->create_enumerator(iface->addrs),
|
||||
(void*)filter_addresses, data, NULL);
|
||||
iface->addrs->create_enumerator(iface->addrs),
|
||||
filter_addresses, data, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter for interfaces
|
||||
*/
|
||||
static bool filter_interfaces(address_enumerator_t *data, iface_entry_t** in,
|
||||
iface_entry_t** out)
|
||||
CALLBACK(filter_interfaces, bool,
|
||||
address_enumerator_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_IGNORED) && !(*in)->usable)
|
||||
{ /* skip interfaces excluded by config */
|
||||
return FALSE;
|
||||
iface_entry_t *iface, **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &iface))
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_IGNORED) && !iface->usable)
|
||||
{ /* skip interfaces excluded by config */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_LOOPBACK) && (iface->flags & IFF_LOOPBACK))
|
||||
{ /* ignore loopback devices */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_DOWN) && !(iface->flags & IFF_UP))
|
||||
{ /* skip interfaces not up */
|
||||
continue;
|
||||
}
|
||||
*out = iface;
|
||||
return TRUE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_LOOPBACK) && ((*in)->flags & IFF_LOOPBACK))
|
||||
{ /* ignore loopback devices */
|
||||
return FALSE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_DOWN) && !((*in)->flags & IFF_UP))
|
||||
{ /* skip interfaces not up */
|
||||
return FALSE;
|
||||
}
|
||||
*out = *in;
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
|
||||
@@ -1596,9 +1605,9 @@ METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
|
||||
return enumerator_create_nested(
|
||||
enumerator_create_filter(
|
||||
this->ifaces->create_enumerator(this->ifaces),
|
||||
(void*)filter_interfaces, data, NULL),
|
||||
filter_interfaces, data, NULL),
|
||||
(void*)create_iface_enumerator, data,
|
||||
(void*)address_enumerator_destroy);
|
||||
address_enumerator_destroy);
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, get_interface_name, bool,
|
||||
|
||||
@@ -1054,41 +1054,45 @@ typedef struct {
|
||||
kernel_address_type_t which;
|
||||
} address_enumerator_t;
|
||||
|
||||
/**
|
||||
* cleanup function for address enumerator
|
||||
*/
|
||||
static void address_enumerator_destroy(address_enumerator_t *data)
|
||||
CALLBACK(address_enumerator_destroy, void,
|
||||
address_enumerator_t *data)
|
||||
{
|
||||
data->this->lock->unlock(data->this->lock);
|
||||
free(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter for addresses
|
||||
*/
|
||||
static bool filter_addresses(address_enumerator_t *data,
|
||||
addr_entry_t** in, host_t** out)
|
||||
CALLBACK(filter_addresses, bool,
|
||||
address_enumerator_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
host_t *ip;
|
||||
if (!(data->which & ADDR_TYPE_VIRTUAL) && (*in)->virtual)
|
||||
{ /* skip virtual interfaces added by us */
|
||||
return FALSE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->virtual)
|
||||
{ /* address is regular, but not requested */
|
||||
return FALSE;
|
||||
}
|
||||
ip = (*in)->ip;
|
||||
if (ip->get_family(ip) == AF_INET6)
|
||||
addr_entry_t *addr;
|
||||
host_t *ip, **out;
|
||||
struct sockaddr_in6 *sin6;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &addr))
|
||||
{
|
||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)ip->get_sockaddr(ip);
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
|
||||
{ /* skip addresses with a unusable scope */
|
||||
return FALSE;
|
||||
if (!(data->which & ADDR_TYPE_VIRTUAL) && addr->virtual)
|
||||
{ /* skip virtual interfaces added by us */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_REGULAR) && !addr->virtual)
|
||||
{ /* address is regular, but not requested */
|
||||
continue;
|
||||
}
|
||||
ip = addr->ip;
|
||||
if (ip->get_family(ip) == AF_INET6)
|
||||
{
|
||||
sin6 = (struct sockaddr_in6 *)ip->get_sockaddr(ip);
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
|
||||
{ /* skip addresses with a unusable scope */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*out = ip;
|
||||
return TRUE;
|
||||
}
|
||||
*out = ip;
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1098,29 +1102,34 @@ static enumerator_t *create_iface_enumerator(iface_entry_t *iface,
|
||||
address_enumerator_t *data)
|
||||
{
|
||||
return enumerator_create_filter(iface->addrs->create_enumerator(iface->addrs),
|
||||
(void*)filter_addresses, data, NULL);
|
||||
filter_addresses, data, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter for interfaces
|
||||
*/
|
||||
static bool filter_interfaces(address_enumerator_t *data, iface_entry_t** in,
|
||||
iface_entry_t** out)
|
||||
CALLBACK(filter_interfaces, bool,
|
||||
address_enumerator_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_IGNORED) && !(*in)->usable)
|
||||
{ /* skip interfaces excluded by config */
|
||||
return FALSE;
|
||||
iface_entry_t *iface, **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &iface))
|
||||
{
|
||||
if (!(data->which & ADDR_TYPE_IGNORED) && !iface->usable)
|
||||
{ /* skip interfaces excluded by config */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_LOOPBACK) && (iface->flags & IFF_LOOPBACK))
|
||||
{ /* ignore loopback devices */
|
||||
continue;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_DOWN) && !(iface->flags & IFF_UP))
|
||||
{ /* skip interfaces not up */
|
||||
continue;
|
||||
}
|
||||
*out = iface;
|
||||
return TRUE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_LOOPBACK) && ((*in)->flags & IFF_LOOPBACK))
|
||||
{ /* ignore loopback devices */
|
||||
return FALSE;
|
||||
}
|
||||
if (!(data->which & ADDR_TYPE_DOWN) && !((*in)->flags & IFF_UP))
|
||||
{ /* skip interfaces not up */
|
||||
return FALSE;
|
||||
}
|
||||
*out = *in;
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
|
||||
@@ -1137,9 +1146,9 @@ METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
|
||||
return enumerator_create_nested(
|
||||
enumerator_create_filter(
|
||||
this->ifaces->create_enumerator(this->ifaces),
|
||||
(void*)filter_interfaces, data, NULL),
|
||||
filter_interfaces, data, NULL),
|
||||
(void*)create_iface_enumerator, data,
|
||||
(void*)address_enumerator_destroy);
|
||||
address_enumerator_destroy);
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, get_features, kernel_feature_t,
|
||||
|
||||
@@ -395,22 +395,28 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter function for shared keys, returning ID matches
|
||||
*/
|
||||
static bool shared_filter(void *null, shared_key_t **in, shared_key_t **out,
|
||||
void **un1, id_match_t *me, void **un2, id_match_t *other)
|
||||
CALLBACK(shared_filter, bool,
|
||||
void *null, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*out = *in;
|
||||
if (me)
|
||||
shared_key_t *key, **out;
|
||||
id_match_t *me, *other;
|
||||
|
||||
VA_ARGS_VGET(args, out, me, other);
|
||||
|
||||
if (orig->enumerate(orig, &key))
|
||||
{
|
||||
*me = ID_MATCH_ANY;
|
||||
*out = key;
|
||||
if (me)
|
||||
{
|
||||
*me = ID_MATCH_ANY;
|
||||
}
|
||||
if (other)
|
||||
{
|
||||
*other = ID_MATCH_ANY;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (other)
|
||||
{
|
||||
*other = ID_MATCH_ANY;
|
||||
}
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
|
||||
@@ -431,7 +437,7 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
|
||||
return NULL;
|
||||
}
|
||||
return enumerator_create_filter(enumerator_create_single(shared, NULL),
|
||||
(void*)shared_filter, NULL, NULL);
|
||||
shared_filter, NULL, NULL);
|
||||
}
|
||||
|
||||
METHOD(load_tester_creds_t, destroy, void,
|
||||
|
||||
@@ -178,28 +178,32 @@ METHOD(attribute_provider_t, release_address, bool,
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter function to convert host to DNS configuration attributes
|
||||
*/
|
||||
static bool attr_filter(void *lock, host_t **in,
|
||||
configuration_attribute_type_t *type,
|
||||
void *dummy, chunk_t *data)
|
||||
CALLBACK(attr_filter, bool,
|
||||
void *lock, enumerator_t *orig, va_list args)
|
||||
{
|
||||
host_t *host = *in;
|
||||
configuration_attribute_type_t *type;
|
||||
chunk_t *data;
|
||||
host_t *host;
|
||||
|
||||
switch (host->get_family(host))
|
||||
VA_ARGS_VGET(args, type, data);
|
||||
|
||||
while (orig->enumerate(orig, &host))
|
||||
{
|
||||
case AF_INET:
|
||||
*type = INTERNAL_IP4_DNS;
|
||||
break;
|
||||
case AF_INET6:
|
||||
*type = INTERNAL_IP6_DNS;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
switch (host->get_family(host))
|
||||
{
|
||||
case AF_INET:
|
||||
*type = INTERNAL_IP4_DNS;
|
||||
break;
|
||||
case AF_INET6:
|
||||
*type = INTERNAL_IP6_DNS;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
*data = host->get_address(host);
|
||||
return TRUE;
|
||||
}
|
||||
*data = host->get_address(host);
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
||||
@@ -223,7 +227,7 @@ METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
||||
enumerator->destroy(enumerator);
|
||||
return enumerator_create_filter(
|
||||
attr->dns->create_enumerator(attr->dns),
|
||||
(void*)attr_filter, this->lock,
|
||||
attr_filter, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
}
|
||||
@@ -338,24 +342,28 @@ METHOD(stroke_attribute_t, del_dns, void,
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pool enumerator filter function, converts pool_t to name, size, ...
|
||||
*/
|
||||
static bool pool_filter(void *lock, mem_pool_t **poolp, const char **name,
|
||||
void *d1, u_int *size, void *d2, u_int *online,
|
||||
void *d3, u_int *offline)
|
||||
CALLBACK(pool_filter, bool,
|
||||
void *lock, enumerator_t *orig, va_list args)
|
||||
{
|
||||
mem_pool_t *pool = *poolp;
|
||||
mem_pool_t *pool;
|
||||
const char **name;
|
||||
u_int *size, *online, *offline;
|
||||
|
||||
if (pool->get_size(pool) == 0)
|
||||
VA_ARGS_VGET(args, name, size, online, offline);
|
||||
|
||||
while (orig->enumerate(orig, &pool))
|
||||
{
|
||||
return FALSE;
|
||||
if (pool->get_size(pool) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
*name = pool->get_name(pool);
|
||||
*size = pool->get_size(pool);
|
||||
*online = pool->get_online(pool);
|
||||
*offline = pool->get_offline(pool);
|
||||
return TRUE;
|
||||
}
|
||||
*name = pool->get_name(pool);
|
||||
*size = pool->get_size(pool);
|
||||
*online = pool->get_online(pool);
|
||||
*offline = pool->get_offline(pool);
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(stroke_attribute_t, create_pool_enumerator, enumerator_t*,
|
||||
@@ -363,7 +371,7 @@ METHOD(stroke_attribute_t, create_pool_enumerator, enumerator_t*,
|
||||
{
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(this->pools->create_enumerator(this->pools),
|
||||
(void*)pool_filter,
|
||||
pool_filter,
|
||||
this->lock, (void*)this->lock->unlock);
|
||||
}
|
||||
|
||||
|
||||
@@ -171,26 +171,30 @@ typedef struct {
|
||||
identification_t *id;
|
||||
} cert_data_t;
|
||||
|
||||
/**
|
||||
* destroy cert_data
|
||||
*/
|
||||
static void cert_data_destroy(cert_data_t *data)
|
||||
CALLBACK(cert_data_destroy, void,
|
||||
cert_data_t *data)
|
||||
{
|
||||
data->this->lock->unlock(data->this->lock);
|
||||
free(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter function for certs enumerator
|
||||
*/
|
||||
static bool certs_filter(cert_data_t *data, ca_cert_t **in,
|
||||
certificate_t **out)
|
||||
CALLBACK(certs_filter, bool,
|
||||
cert_data_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
ca_cert_t *cacert;
|
||||
public_key_t *public;
|
||||
certificate_t *cert = (*in)->cert;
|
||||
certificate_t **out;
|
||||
|
||||
if (data->cert == CERT_ANY || data->cert == cert->get_type(cert))
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &cacert))
|
||||
{
|
||||
certificate_t *cert = cacert->cert;
|
||||
|
||||
if (data->cert != CERT_ANY && data->cert != cert->get_type(cert))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
public = cert->get_public_key(cert);
|
||||
if (public)
|
||||
{
|
||||
@@ -208,9 +212,9 @@ static bool certs_filter(cert_data_t *data, ca_cert_t **in,
|
||||
}
|
||||
else if (data->key != KEY_ANY)
|
||||
{
|
||||
return FALSE;
|
||||
continue;
|
||||
}
|
||||
if (data->id == NULL || cert->has_subject(cert, data->id))
|
||||
if (!data->id || cert->has_subject(cert, data->id))
|
||||
{
|
||||
*out = cert;
|
||||
return TRUE;
|
||||
@@ -235,8 +239,8 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
|
||||
|
||||
this->lock->read_lock(this->lock);
|
||||
enumerator = this->certs->create_enumerator(this->certs);
|
||||
return enumerator_create_filter(enumerator, (void*)certs_filter, data,
|
||||
(void*)cert_data_destroy);
|
||||
return enumerator_create_filter(enumerator, certs_filter, data,
|
||||
cert_data_destroy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -68,13 +68,20 @@ METHOD(backend_t, create_peer_cfg_enumerator, enumerator_t*,
|
||||
(void*)this->mutex->unlock, this->mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter function for ike configs
|
||||
*/
|
||||
static bool ike_filter(void *data, peer_cfg_t **in, ike_cfg_t **out)
|
||||
CALLBACK(ike_filter, bool,
|
||||
void *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*out = (*in)->get_ike_cfg(*in);
|
||||
return TRUE;
|
||||
peer_cfg_t *cfg;
|
||||
ike_cfg_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (orig->enumerate(orig, &cfg))
|
||||
{
|
||||
*out = cfg->get_ike_cfg(cfg);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(backend_t, create_ike_cfg_enumerator, enumerator_t*,
|
||||
@@ -82,7 +89,7 @@ METHOD(backend_t, create_ike_cfg_enumerator, enumerator_t*,
|
||||
{
|
||||
this->mutex->lock(this->mutex);
|
||||
return enumerator_create_filter(this->list->create_enumerator(this->list),
|
||||
(void*)ike_filter, this->mutex,
|
||||
ike_filter, this->mutex,
|
||||
(void*)this->mutex->unlock);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,35 +62,39 @@ static void attributes_destroy(attributes_t *this)
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter function to convert host to DNS configuration attributes
|
||||
*/
|
||||
static bool attr_filter(void *lock, host_t **in,
|
||||
configuration_attribute_type_t *type,
|
||||
void *dummy, chunk_t *data)
|
||||
CALLBACK(attr_filter, bool,
|
||||
void *lock, enumerator_t *orig, va_list args)
|
||||
{
|
||||
host_t *host = *in;
|
||||
configuration_attribute_type_t *type;
|
||||
chunk_t *data;
|
||||
host_t *host;
|
||||
|
||||
switch (host->get_family(host))
|
||||
VA_ARGS_VGET(args, type, data);
|
||||
|
||||
while (orig->enumerate(orig, &host))
|
||||
{
|
||||
case AF_INET:
|
||||
*type = INTERNAL_IP4_DNS;
|
||||
break;
|
||||
case AF_INET6:
|
||||
*type = INTERNAL_IP6_DNS;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
switch (host->get_family(host))
|
||||
{
|
||||
case AF_INET:
|
||||
*type = INTERNAL_IP4_DNS;
|
||||
break;
|
||||
case AF_INET6:
|
||||
*type = INTERNAL_IP6_DNS;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
if (host->is_anyaddr(host))
|
||||
{
|
||||
*data = chunk_empty;
|
||||
}
|
||||
else
|
||||
{
|
||||
*data = host->get_address(host);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (host->is_anyaddr(host))
|
||||
{
|
||||
*data = chunk_empty;
|
||||
}
|
||||
else
|
||||
{
|
||||
*data = host->get_address(host);
|
||||
}
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(attribute_handler_t, create_attribute_enumerator, enumerator_t*,
|
||||
@@ -114,7 +118,7 @@ METHOD(attribute_handler_t, create_attribute_enumerator, enumerator_t*,
|
||||
enumerator->destroy(enumerator);
|
||||
return enumerator_create_filter(
|
||||
attr->dns->create_enumerator(attr->dns),
|
||||
(void*)attr_filter, this->lock,
|
||||
attr_filter, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -411,24 +411,27 @@ typedef struct {
|
||||
ike_sa_id_t *id;
|
||||
} include_filter_t;
|
||||
|
||||
/**
|
||||
* Include enumerator filter function
|
||||
*/
|
||||
static bool include_filter(include_filter_t *data,
|
||||
entry_t **entry, traffic_selector_t **ts)
|
||||
CALLBACK(include_filter, bool,
|
||||
include_filter_t *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (data->id->equals(data->id, (*entry)->id))
|
||||
entry_t *entry;
|
||||
traffic_selector_t **ts;
|
||||
|
||||
VA_ARGS_VGET(args, ts);
|
||||
|
||||
while (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*ts = (*entry)->ts;
|
||||
return TRUE;
|
||||
if (data->id->equals(data->id, entry->id))
|
||||
{
|
||||
*ts = entry->ts;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy include filter data, unlock mutex
|
||||
*/
|
||||
static void destroy_filter(include_filter_t *data)
|
||||
CALLBACK(destroy_filter, void,
|
||||
include_filter_t *data)
|
||||
{
|
||||
data->mutex->unlock(data->mutex);
|
||||
free(data);
|
||||
@@ -446,7 +449,7 @@ METHOD(unity_handler_t, create_include_enumerator, enumerator_t*,
|
||||
data->mutex->lock(data->mutex);
|
||||
return enumerator_create_filter(
|
||||
this->include->create_enumerator(this->include),
|
||||
(void*)include_filter, data, (void*)destroy_filter);
|
||||
include_filter, data, destroy_filter);
|
||||
}
|
||||
|
||||
METHOD(unity_handler_t, destroy, void,
|
||||
|
||||
@@ -184,16 +184,22 @@ METHOD(attribute_provider_t, release_address, bool,
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter mapping attribute_t to enumerated type/value arguments
|
||||
*/
|
||||
static bool attr_filter(void *data, attribute_t **attr,
|
||||
configuration_attribute_type_t *type,
|
||||
void *in, chunk_t *value)
|
||||
CALLBACK(attr_filter, bool,
|
||||
void *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*type = (*attr)->type;
|
||||
*value = (*attr)->value;
|
||||
return TRUE;
|
||||
attribute_t *attr;
|
||||
configuration_attribute_type_t *type;
|
||||
chunk_t *value;
|
||||
|
||||
VA_ARGS_VGET(args, type, value);
|
||||
|
||||
if (orig->enumerate(orig, &attr))
|
||||
{
|
||||
*type = attr->type;
|
||||
*value = attr->value;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -203,7 +209,7 @@ CALLBACK(create_nested, enumerator_t*,
|
||||
pool_t *pool, void *this)
|
||||
{
|
||||
return enumerator_create_filter(array_create_enumerator(pool->attrs),
|
||||
(void*)attr_filter, NULL, NULL);
|
||||
attr_filter, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -141,13 +141,20 @@ METHOD(backend_t, create_peer_cfg_enumerator, enumerator_t*,
|
||||
(void*)this->lock->unlock, this->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerator filter function for ike configs
|
||||
*/
|
||||
static bool ike_filter(void *data, peer_cfg_t **in, ike_cfg_t **out)
|
||||
CALLBACK(ike_filter, bool,
|
||||
void *data, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*out = (*in)->get_ike_cfg(*in);
|
||||
return TRUE;
|
||||
peer_cfg_t *cfg;
|
||||
ike_cfg_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (orig->enumerate(orig, &cfg))
|
||||
{
|
||||
*out = cfg->get_ike_cfg(cfg);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(backend_t, create_ike_cfg_enumerator, enumerator_t*,
|
||||
@@ -155,7 +162,7 @@ METHOD(backend_t, create_ike_cfg_enumerator, enumerator_t*,
|
||||
{
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(this->conns->create_enumerator(this->conns),
|
||||
(void*)ike_filter, this->lock,
|
||||
ike_filter, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
|
||||
|
||||
@@ -119,14 +119,19 @@ METHOD(whitelist_listener_t, remove_, void,
|
||||
DESTROY_IF(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerator filter, from hashtable (key, value) to single identity
|
||||
*/
|
||||
static bool whitelist_filter(rwlock_t *lock, identification_t **key,
|
||||
identification_t **id, identification_t **value)
|
||||
CALLBACK(whitelist_filter, bool,
|
||||
rwlock_t *lock, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*id = *value;
|
||||
return TRUE;
|
||||
identification_t *key, *value, **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
if (orig->enumerate(orig, &key, &value))
|
||||
{
|
||||
*out = value;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(whitelist_listener_t, create_enumerator, enumerator_t*,
|
||||
@@ -134,7 +139,7 @@ METHOD(whitelist_listener_t, create_enumerator, enumerator_t*,
|
||||
{
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(this->ids->create_enumerator(this->ids),
|
||||
(void*)whitelist_filter, this->lock,
|
||||
whitelist_filter, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user