fixed removal of child configs

purge empty peer configs
This commit is contained in:
Martin Willi
2009-05-06 12:56:21 +02:00
parent 5bbfd264ec
commit a8d938ca18
+25 -9
View File
@@ -853,34 +853,50 @@ static void del(private_stroke_config_t *this, stroke_msg_t *msg)
enumerator_t *enumerator, *children; enumerator_t *enumerator, *children;
peer_cfg_t *peer; peer_cfg_t *peer;
child_cfg_t *child; child_cfg_t *child;
bool deleted = FALSE;
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
enumerator = this->list->create_enumerator(this->list); enumerator = this->list->create_enumerator(this->list);
while (enumerator->enumerate(enumerator, (void**)&peer)) while (enumerator->enumerate(enumerator, (void**)&peer))
{ {
/* remove peer config with such a name */ bool keep = FALSE;
if (streq(peer->get_name(peer), msg->del_conn.name))
{
this->list->remove_at(this->list, enumerator);
peer->destroy(peer);
continue;
}
/* remove any child with such a name */ /* remove any child with such a name */
children = peer->create_child_cfg_enumerator(peer); children = peer->create_child_cfg_enumerator(peer);
while (children->enumerate(children, &child)) while (children->enumerate(children, &child))
{ {
if (streq(child->get_name(child), msg->del_conn.name)) if (streq(child->get_name(child), msg->del_conn.name))
{ {
peer->remove_child_cfg(peer, enumerator); peer->remove_child_cfg(peer, children);
child->destroy(child); child->destroy(child);
deleted = TRUE;
}
else
{
keep = TRUE;
} }
} }
children->destroy(children); children->destroy(children);
/* if peer config matches, or has no children anymore, remove it */
if (!keep || streq(peer->get_name(peer), msg->del_conn.name))
{
this->list->remove_at(this->list, enumerator);
peer->destroy(peer);
deleted = TRUE;
}
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
this->mutex->unlock(this->mutex); this->mutex->unlock(this->mutex);
DBG1(DBG_CFG, "deleted connection '%s'", msg->del_conn.name); if (deleted)
{
DBG1(DBG_CFG, "deleted connection '%s'", msg->del_conn.name);
}
else
{
DBG1(DBG_CFG, "connection '%s' not found", msg->del_conn.name);
}
} }
/** /**