aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/config/backends/local_backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/config/backends/local_backend.c')
-rw-r--r--src/charon/config/backends/local_backend.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/charon/config/backends/local_backend.c b/src/charon/config/backends/local_backend.c
index e3449fef6..be6fc923b 100644
--- a/src/charon/config/backends/local_backend.c
+++ b/src/charon/config/backends/local_backend.c
@@ -171,20 +171,38 @@ static peer_cfg_t *get_peer_cfg(private_local_backend_t *this,
static peer_cfg_t *get_peer_cfg_by_name(private_local_backend_t *this,
char *name)
{
- iterator_t *iterator;
+ iterator_t *i1, *i2;
peer_cfg_t *current, *found = NULL;
+ child_cfg_t *child;
- iterator = this->cfgs->create_iterator(this->cfgs, TRUE);
- while (iterator->iterate(iterator, (void**)&current))
+ i1 = this->cfgs->create_iterator(this->cfgs, TRUE);
+ while (i1->iterate(i1, (void**)&current))
{
+ /* compare peer_cfgs name first */
if (streq(current->get_name(current), name))
{
found = current;
found->get_ref(found);
break;
}
+ /* compare all child_cfg names otherwise */
+ i2 = current->create_child_cfg_iterator(current);
+ while (i2->iterate(i2, (void**)&child))
+ {
+ if (streq(child->get_name(child), name))
+ {
+ found = current;
+ found->get_ref(found);
+ break;
+ }
+ }
+ i2->destroy(i2);
+ if (found)
+ {
+ break;
+ }
}
- iterator->destroy(iterator);
+ i1->destroy(i1);
return found;
}
@@ -224,8 +242,8 @@ local_backend_t *local_backend_create(void)
this->public.backend.get_ike_cfg = (ike_cfg_t*(*)(backend_t*, host_t *, host_t *))get_ike_cfg;
this->public.backend.get_peer_cfg = (peer_cfg_t*(*)(backend_t*, identification_t *, identification_t *))get_peer_cfg;
- this->public.backend.get_peer_cfg_by_name = (peer_cfg_t*(*)(backend_t*, char *))get_peer_cfg_by_name;
- this->public.create_peer_cfg_iterator = (iterator_t*(*)(local_backend_t*))create_peer_cfg_iterator;
+ this->public.create_peer_cfg_iterator = (iterator_t*(*)(local_backend_t*))create_peer_cfg_iterator;
+ this->public.get_peer_cfg_by_name = (peer_cfg_t*(*)(local_backend_t*, char *))get_peer_cfg_by_name;
this->public.add_peer_cfg = (void(*)(local_backend_t*, peer_cfg_t *))add_peer_cfg;
this->public.destroy = (void(*)(local_backend_t*))destroy;