linked-list: Change interface of callback for invoke_function()
This avoids the unportable five pointer hack.
This commit is contained in:
@@ -542,10 +542,10 @@ static policy_sa_t *policy_sa_create(private_kernel_netlink_ipsec_t *this,
|
||||
/**
|
||||
* Destroy a policy_sa(_in)_t object
|
||||
*/
|
||||
static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t *dir,
|
||||
static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t dir,
|
||||
private_kernel_netlink_ipsec_t *this)
|
||||
{
|
||||
if (*dir == POLICY_OUT)
|
||||
if (dir == POLICY_OUT)
|
||||
{
|
||||
policy_sa_out_t *out = (policy_sa_out_t*)policy;
|
||||
out->src_ts->destroy(out->src_ts);
|
||||
@@ -555,6 +555,16 @@ static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t *dir,
|
||||
free(policy);
|
||||
}
|
||||
|
||||
CALLBACK(policy_sa_destroy_cb, void,
|
||||
policy_sa_t *policy, va_list args)
|
||||
{
|
||||
private_kernel_netlink_ipsec_t *this;
|
||||
policy_dir_t dir;
|
||||
|
||||
VA_ARGS_VGET(args, dir, this);
|
||||
policy_sa_destroy(policy, dir, this);
|
||||
}
|
||||
|
||||
typedef struct policy_entry_t policy_entry_t;
|
||||
|
||||
/**
|
||||
@@ -599,9 +609,8 @@ static void policy_entry_destroy(private_kernel_netlink_ipsec_t *this,
|
||||
}
|
||||
if (policy->used_by)
|
||||
{
|
||||
policy->used_by->invoke_function(policy->used_by,
|
||||
(linked_list_invoke_t)policy_sa_destroy,
|
||||
&policy->direction, this);
|
||||
policy->used_by->invoke_function(policy->used_by, policy_sa_destroy_cb,
|
||||
policy->direction, this);
|
||||
policy->used_by->destroy(policy->used_by);
|
||||
}
|
||||
free(policy);
|
||||
@@ -2768,7 +2777,7 @@ METHOD(kernel_ipsec_t, del_policy, status_t,
|
||||
ipsec_sa_equals(mapping->sa, &assigned_sa))
|
||||
{
|
||||
current->used_by->remove_at(current->used_by, enumerator);
|
||||
policy_sa_destroy(mapping, &id->dir, this);
|
||||
policy_sa_destroy(mapping, id->dir, this);
|
||||
break;
|
||||
}
|
||||
if (is_installed)
|
||||
|
||||
@@ -1125,9 +1125,13 @@ static bool is_interface_up_and_usable(private_kernel_netlink_net_t *this,
|
||||
*
|
||||
* this->lock must be locked when calling this function
|
||||
*/
|
||||
static void addr_entry_unregister(addr_entry_t *addr, iface_entry_t *iface,
|
||||
private_kernel_netlink_net_t *this)
|
||||
CALLBACK(addr_entry_unregister, void,
|
||||
addr_entry_t *addr, va_list args)
|
||||
{
|
||||
private_kernel_netlink_net_t *this;
|
||||
iface_entry_t *iface;
|
||||
|
||||
VA_ARGS_VGET(args, iface, this);
|
||||
if (addr->refcount)
|
||||
{
|
||||
addr_map_entry_remove(this->vips, addr, iface);
|
||||
@@ -1217,7 +1221,7 @@ static void process_link(private_kernel_netlink_net_t *this,
|
||||
* another interface? */
|
||||
this->ifaces->remove_at(this->ifaces, enumerator);
|
||||
current->addrs->invoke_function(current->addrs,
|
||||
(void*)addr_entry_unregister, current, this);
|
||||
addr_entry_unregister, current, this);
|
||||
iface_entry_destroy(current);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -464,10 +464,10 @@ static policy_sa_t *policy_sa_create(private_kernel_pfkey_ipsec_t *this,
|
||||
/**
|
||||
* Destroy a policy_sa(_in)_t object
|
||||
*/
|
||||
static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t *dir,
|
||||
static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t dir,
|
||||
private_kernel_pfkey_ipsec_t *this)
|
||||
{
|
||||
if (*dir == POLICY_OUT)
|
||||
if (dir == POLICY_OUT)
|
||||
{
|
||||
policy_sa_out_t *out = (policy_sa_out_t*)policy;
|
||||
out->src_ts->destroy(out->src_ts);
|
||||
@@ -477,6 +477,16 @@ static void policy_sa_destroy(policy_sa_t *policy, policy_dir_t *dir,
|
||||
free(policy);
|
||||
}
|
||||
|
||||
CALLBACK(policy_sa_destroy_cb, void,
|
||||
policy_sa_t *policy, va_list args)
|
||||
{
|
||||
private_kernel_pfkey_ipsec_t *this;
|
||||
policy_dir_t dir;
|
||||
|
||||
VA_ARGS_VGET(args, dir, this);
|
||||
policy_sa_destroy(policy, dir, this);
|
||||
}
|
||||
|
||||
typedef struct policy_entry_t policy_entry_t;
|
||||
|
||||
/**
|
||||
@@ -557,9 +567,8 @@ static void policy_entry_destroy(policy_entry_t *policy,
|
||||
}
|
||||
if (policy->used_by)
|
||||
{
|
||||
policy->used_by->invoke_function(policy->used_by,
|
||||
(linked_list_invoke_t)policy_sa_destroy,
|
||||
&policy->direction, this);
|
||||
policy->used_by->invoke_function(policy->used_by, policy_sa_destroy_cb,
|
||||
policy->direction, this);
|
||||
policy->used_by->destroy(policy->used_by);
|
||||
}
|
||||
DESTROY_IF(policy->src.net);
|
||||
@@ -567,6 +576,15 @@ static void policy_entry_destroy(policy_entry_t *policy,
|
||||
free(policy);
|
||||
}
|
||||
|
||||
CALLBACK(policy_entry_destroy_cb, void,
|
||||
policy_entry_t *policy, va_list args)
|
||||
{
|
||||
private_kernel_pfkey_ipsec_t *this;
|
||||
|
||||
VA_ARGS_VGET(args, this);
|
||||
policy_entry_destroy(policy, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* compares two policy_entry_t
|
||||
*/
|
||||
@@ -2860,7 +2878,7 @@ METHOD(kernel_ipsec_t, del_policy, status_t,
|
||||
if (policy->used_by->get_count(policy->used_by) > 0)
|
||||
{ /* policy is used by more SAs, keep in kernel */
|
||||
DBG2(DBG_KNL, "policy still used by another CHILD_SA, not removed");
|
||||
policy_sa_destroy(mapping, &id->dir, this);
|
||||
policy_sa_destroy(mapping, id->dir, this);
|
||||
|
||||
if (!is_installed)
|
||||
{ /* no need to update as the policy was not installed for this SA */
|
||||
@@ -2915,7 +2933,7 @@ METHOD(kernel_ipsec_t, del_policy, status_t,
|
||||
}
|
||||
|
||||
this->policies->remove(this->policies, found, NULL);
|
||||
policy_sa_destroy(mapping, &id->dir, this);
|
||||
policy_sa_destroy(mapping, id->dir, this);
|
||||
policy_entry_destroy(policy, this);
|
||||
this->mutex->unlock(this->mutex);
|
||||
|
||||
@@ -3088,8 +3106,7 @@ METHOD(kernel_ipsec_t, destroy, void,
|
||||
lib->watcher->remove(lib->watcher, this->socket_events);
|
||||
close(this->socket_events);
|
||||
}
|
||||
this->policies->invoke_function(this->policies,
|
||||
(linked_list_invoke_t)policy_entry_destroy,
|
||||
this->policies->invoke_function(this->policies, policy_entry_destroy_cb,
|
||||
this);
|
||||
this->policies->destroy(this->policies);
|
||||
this->excludes->destroy(this->excludes);
|
||||
|
||||
Reference in New Issue
Block a user