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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user