aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2015-10-16 12:40:10 +0200
committerTobias Brunner <tobias@strongswan.org>2016-03-08 10:21:58 +0100
commit101abed566099b5b9ac53a86a88e03af27bbf1d5 (patch)
tree3a895a6d400168349c12863b5d6832af6d261073 /src
parent622c2b2c3386dd8fad321fc3bbd4d019b99fbb71 (diff)
downloadstrongswan-101abed566099b5b9ac53a86a88e03af27bbf1d5.tar.bz2
strongswan-101abed566099b5b9ac53a86a88e03af27bbf1d5.tar.xz
vici: Replace child configs atomically
This also leaves unmodified configs as they are.
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/plugins/vici/vici_config.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/libcharon/plugins/vici/vici_config.c b/src/libcharon/plugins/vici/vici_config.c
index 6cf127b74..27268a512 100644
--- a/src/libcharon/plugins/vici/vici_config.c
+++ b/src/libcharon/plugins/vici/vici_config.c
@@ -1847,22 +1847,19 @@ static void replace_children(private_vici_config_t *this,
{
enumerator_t *enumerator;
child_cfg_t *child;
+ bool added;
- enumerator = to->create_child_cfg_enumerator(to);
- while (enumerator->enumerate(enumerator, &child))
+ enumerator = to->replace_child_cfgs(to, from);
+ while (enumerator->enumerate(enumerator, &child, &added))
{
- to->remove_child_cfg(to, enumerator);
- clear_start_action(this, to->get_name(to), child);
- child->destroy(child);
- }
- enumerator->destroy(enumerator);
-
- enumerator = from->create_child_cfg_enumerator(from);
- while (enumerator->enumerate(enumerator, &child))
- {
- from->remove_child_cfg(from, enumerator);
- to->add_child_cfg(to, child);
- run_start_action(this, to, child);
+ if (added)
+ {
+ run_start_action(this, to, child);
+ }
+ else
+ {
+ clear_start_action(this, to->get_name(to), child);
+ }
}
enumerator->destroy(enumerator);
}