]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
vici: Replace child configs atomically
authorTobias Brunner <tobias@strongswan.org>
Fri, 16 Oct 2015 10:40:10 +0000 (12:40 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 8 Mar 2016 09:21:58 +0000 (10:21 +0100)
This also leaves unmodified configs as they are.

src/libcharon/plugins/vici/vici_config.c

index 6cf127b74d5df6ae0b2b40899bec7ae8ae3f3104..27268a512822ff1ee112ff8c6760a9402c2be75f 100644 (file)
@@ -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);
 }