aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/config/backends
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/config/backends')
-rw-r--r--src/charon/config/backends/local_backend.c30
-rw-r--r--src/charon/config/backends/local_backend.h9
2 files changed, 33 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;
diff --git a/src/charon/config/backends/local_backend.h b/src/charon/config/backends/local_backend.h
index 041725ae4..97c43b233 100644
--- a/src/charon/config/backends/local_backend.h
+++ b/src/charon/config/backends/local_backend.h
@@ -55,6 +55,15 @@ struct local_backend_t {
void (*add_peer_cfg)(local_backend_t *this, peer_cfg_t *config);
/**
+ * @brief Get a peer_config identified by name, or a name of its child_cfgs.
+ *
+ * @param this calling object
+ * @param name name of the peer config
+ * @return matching peer_config, or NULL if none found
+ */
+ peer_cfg_t *(*get_peer_cfg_by_name)(local_backend_t *this, char *name);
+
+ /**
* @brief Create an iterator over all peer configs.
*
* @param this calling object