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:
@@ -105,31 +105,38 @@ METHOD(eap_manager_t, remove_method, void,
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* filter the registered methods
|
||||
*/
|
||||
static bool filter_methods(uintptr_t role, eap_entry_t **entry,
|
||||
eap_type_t *type, void *in, uint32_t *vendor)
|
||||
CALLBACK(filter_methods, bool,
|
||||
uintptr_t role, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if ((*entry)->role != (eap_role_t)role)
|
||||
eap_entry_t *entry;
|
||||
eap_type_t *type;
|
||||
uint32_t *vendor;
|
||||
|
||||
VA_ARGS_VGET(args, type, vendor);
|
||||
|
||||
while (orig->enumerate(orig, &entry))
|
||||
{
|
||||
return FALSE;
|
||||
if (entry->role != (eap_role_t)role)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (entry->vendor == 0 &&
|
||||
(entry->type < 4 || entry->type == EAP_EXPANDED ||
|
||||
entry->type > EAP_EXPERIMENTAL))
|
||||
{ /* filter invalid types */
|
||||
continue;
|
||||
}
|
||||
if (type)
|
||||
{
|
||||
*type = entry->type;
|
||||
}
|
||||
if (vendor)
|
||||
{
|
||||
*vendor = entry->vendor;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if ((*entry)->vendor == 0 &&
|
||||
((*entry)->type < 4 || (*entry)->type == EAP_EXPANDED ||
|
||||
(*entry)->type > EAP_EXPERIMENTAL))
|
||||
{ /* filter invalid types */
|
||||
return FALSE;
|
||||
}
|
||||
if (type)
|
||||
{
|
||||
*type = (*entry)->type;
|
||||
}
|
||||
if (vendor)
|
||||
{
|
||||
*vendor = (*entry)->vendor;
|
||||
}
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(eap_manager_t, create_enumerator, enumerator_t*,
|
||||
@@ -139,7 +146,7 @@ METHOD(eap_manager_t, create_enumerator, enumerator_t*,
|
||||
return enumerator_create_cleaner(
|
||||
enumerator_create_filter(
|
||||
this->methods->create_enumerator(this->methods),
|
||||
(void*)filter_methods, (void*)(uintptr_t)role, NULL),
|
||||
filter_methods, (void*)(uintptr_t)role, NULL),
|
||||
(void*)this->lock->unlock, this->lock);
|
||||
}
|
||||
|
||||
|
||||
+32
-17
@@ -1200,12 +1200,20 @@ METHOD(ike_sa_t, generate_message, status_t,
|
||||
return status;
|
||||
}
|
||||
|
||||
static bool filter_fragments(private_ike_sa_t *this, packet_t **fragment,
|
||||
packet_t **packet)
|
||||
CALLBACK(filter_fragments, bool,
|
||||
private_ike_sa_t *this, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*packet = (*fragment)->clone(*fragment);
|
||||
set_dscp(this, *packet);
|
||||
return TRUE;
|
||||
packet_t *fragment, **packet;
|
||||
|
||||
VA_ARGS_VGET(args, packet);
|
||||
|
||||
if (orig->enumerate(orig, &fragment))
|
||||
{
|
||||
*packet = fragment->clone(fragment);
|
||||
set_dscp(this, *packet);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(ike_sa_t, generate_message_fragmented, status_t,
|
||||
@@ -1265,7 +1273,7 @@ METHOD(ike_sa_t, generate_message_fragmented, status_t,
|
||||
{
|
||||
charon->bus->message(charon->bus, message, FALSE, FALSE);
|
||||
}
|
||||
*packets = enumerator_create_filter(fragments, (void*)filter_fragments,
|
||||
*packets = enumerator_create_filter(fragments, filter_fragments,
|
||||
this, NULL);
|
||||
}
|
||||
return status;
|
||||
@@ -2623,24 +2631,31 @@ METHOD(ike_sa_t, add_configuration_attribute, void,
|
||||
array_insert(this->attributes, ARRAY_TAIL, &entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerator filter for attributes
|
||||
*/
|
||||
static bool filter_attribute(void *null, attribute_entry_t **in,
|
||||
configuration_attribute_type_t *type, void *in2,
|
||||
chunk_t *data, void *in3, bool *handled)
|
||||
CALLBACK(filter_attribute, bool,
|
||||
void *null, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*type = (*in)->type;
|
||||
*data = (*in)->data;
|
||||
*handled = (*in)->handler != NULL;
|
||||
return TRUE;
|
||||
attribute_entry_t *entry;
|
||||
configuration_attribute_type_t *type;
|
||||
chunk_t *data;
|
||||
bool *handled;
|
||||
|
||||
VA_ARGS_VGET(args, type, data, handled);
|
||||
|
||||
if (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*type = entry->type;
|
||||
*data = entry->data;
|
||||
*handled = entry->handler != NULL;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(ike_sa_t, create_attribute_enumerator, enumerator_t*,
|
||||
private_ike_sa_t *this)
|
||||
{
|
||||
return enumerator_create_filter(array_create_enumerator(this->attributes),
|
||||
(void*)filter_attribute, NULL, NULL);
|
||||
filter_attribute, NULL, NULL);
|
||||
}
|
||||
|
||||
METHOD(ike_sa_t, create_task_enumerator, enumerator_t*,
|
||||
|
||||
@@ -1562,42 +1562,52 @@ METHOD(ike_sa_manager_t, checkout_by_name, ike_sa_t*,
|
||||
return ike_sa;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator filter function, waiting variant
|
||||
*/
|
||||
static bool enumerator_filter_wait(private_ike_sa_manager_t *this,
|
||||
entry_t **in, ike_sa_t **out, u_int *segment)
|
||||
CALLBACK(enumerator_filter_wait, bool,
|
||||
private_ike_sa_manager_t *this, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (wait_for_entry(this, *in, *segment))
|
||||
entry_t *entry;
|
||||
u_int segment;
|
||||
ike_sa_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &entry, &segment))
|
||||
{
|
||||
*out = (*in)->ike_sa;
|
||||
charon->bus->set_sa(charon->bus, *out);
|
||||
return TRUE;
|
||||
if (wait_for_entry(this, entry, segment))
|
||||
{
|
||||
*out = entry->ike_sa;
|
||||
charon->bus->set_sa(charon->bus, *out);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* enumerator filter function, skipping variant
|
||||
*/
|
||||
static bool enumerator_filter_skip(private_ike_sa_manager_t *this,
|
||||
entry_t **in, ike_sa_t **out, u_int *segment)
|
||||
CALLBACK(enumerator_filter_skip, bool,
|
||||
private_ike_sa_manager_t *this, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (!(*in)->driveout_new_threads &&
|
||||
!(*in)->driveout_waiting_threads &&
|
||||
!(*in)->checked_out)
|
||||
entry_t *entry;
|
||||
u_int segment;
|
||||
ike_sa_t **out;
|
||||
|
||||
VA_ARGS_VGET(args, out);
|
||||
|
||||
while (orig->enumerate(orig, &entry, &segment))
|
||||
{
|
||||
*out = (*in)->ike_sa;
|
||||
charon->bus->set_sa(charon->bus, *out);
|
||||
return TRUE;
|
||||
if (!entry->driveout_new_threads &&
|
||||
!entry->driveout_waiting_threads &&
|
||||
!entry->checked_out)
|
||||
{
|
||||
*out = entry->ike_sa;
|
||||
charon->bus->set_sa(charon->bus, *out);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset threads SA after enumeration
|
||||
*/
|
||||
static void reset_sa(void *data)
|
||||
CALLBACK(reset_sa, void,
|
||||
void *data)
|
||||
{
|
||||
charon->bus->set_sa(charon->bus, NULL);
|
||||
}
|
||||
|
||||
@@ -2079,13 +2079,20 @@ METHOD(task_manager_t, reset, void,
|
||||
this->reset = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter queued tasks
|
||||
*/
|
||||
static bool filter_queued(void *unused, queued_task_t **queued, task_t **task)
|
||||
CALLBACK(filter_queued, bool,
|
||||
void *unused, enumerator_t *orig, va_list args)
|
||||
{
|
||||
*task = (*queued)->task;
|
||||
return TRUE;
|
||||
queued_task_t *queued;
|
||||
task_t **task;
|
||||
|
||||
VA_ARGS_VGET(args, task);
|
||||
|
||||
if (orig->enumerate(orig, &queued))
|
||||
{
|
||||
*task = queued->task;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(task_manager_t, create_task_enumerator, enumerator_t*,
|
||||
@@ -2100,7 +2107,7 @@ METHOD(task_manager_t, create_task_enumerator, enumerator_t*,
|
||||
case TASK_QUEUE_QUEUED:
|
||||
return enumerator_create_filter(
|
||||
array_create_enumerator(this->queued_tasks),
|
||||
(void*)filter_queued, NULL, NULL);
|
||||
filter_queued, NULL, NULL);
|
||||
default:
|
||||
return enumerator_create_empty();
|
||||
}
|
||||
|
||||
@@ -381,14 +381,24 @@ METHOD(shunt_manager_t, uninstall, bool,
|
||||
}
|
||||
|
||||
CALLBACK(filter_entries, bool,
|
||||
void *unused, entry_t **entry, char **ns, void **in, child_cfg_t **cfg)
|
||||
void *unused, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (ns)
|
||||
entry_t *entry;
|
||||
child_cfg_t **cfg;
|
||||
char **ns;
|
||||
|
||||
VA_ARGS_VGET(args, ns, cfg);
|
||||
|
||||
if (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*ns = (*entry)->ns;
|
||||
if (ns)
|
||||
{
|
||||
*ns = entry->ns;
|
||||
}
|
||||
*cfg = entry->cfg;
|
||||
return TRUE;
|
||||
}
|
||||
*cfg = (*entry)->cfg;
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(shunt_manager_t, create_enumerator, enumerator_t*,
|
||||
@@ -397,7 +407,7 @@ METHOD(shunt_manager_t, create_enumerator, enumerator_t*,
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(
|
||||
this->shunts->create_enumerator(this->shunts),
|
||||
(void*)filter_entries, this->lock,
|
||||
filter_entries, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
|
||||
|
||||
@@ -335,25 +335,32 @@ METHOD(trap_manager_t, uninstall, bool,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* convert enumerated entries to peer_cfg, child_sa
|
||||
*/
|
||||
static bool trap_filter(rwlock_t *lock, entry_t **entry, peer_cfg_t **peer_cfg,
|
||||
void *none, child_sa_t **child_sa)
|
||||
CALLBACK(trap_filter, bool,
|
||||
rwlock_t *lock, enumerator_t *orig, va_list args)
|
||||
{
|
||||
if (!(*entry)->child_sa)
|
||||
{ /* skip entries that are currently being installed */
|
||||
return FALSE;
|
||||
}
|
||||
if (peer_cfg)
|
||||
entry_t *entry;
|
||||
peer_cfg_t **peer_cfg;
|
||||
child_sa_t **child_sa;
|
||||
|
||||
VA_ARGS_VGET(args, peer_cfg, child_sa);
|
||||
|
||||
while (orig->enumerate(orig, &entry))
|
||||
{
|
||||
*peer_cfg = (*entry)->peer_cfg;
|
||||
if (!entry->child_sa)
|
||||
{ /* skip entries that are currently being installed */
|
||||
continue;
|
||||
}
|
||||
if (peer_cfg)
|
||||
{
|
||||
*peer_cfg = entry->peer_cfg;
|
||||
}
|
||||
if (child_sa)
|
||||
{
|
||||
*child_sa = entry->child_sa;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (child_sa)
|
||||
{
|
||||
*child_sa = (*entry)->child_sa;
|
||||
}
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
METHOD(trap_manager_t, create_enumerator, enumerator_t*,
|
||||
@@ -361,7 +368,7 @@ METHOD(trap_manager_t, create_enumerator, enumerator_t*,
|
||||
{
|
||||
this->lock->read_lock(this->lock);
|
||||
return enumerator_create_filter(this->traps->create_enumerator(this->traps),
|
||||
(void*)trap_filter, this->lock,
|
||||
trap_filter, this->lock,
|
||||
(void*)this->lock->unlock);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user