From: Tobias Brunner Date: Fri, 16 Oct 2015 10:40:10 +0000 (+0200) Subject: vici: Replace child configs atomically X-Git-Tag: 5.4.0rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=101abed566099b5b9ac53a86a88e03af27bbf1d5;p=thirdparty%2Fstrongswan.git vici: Replace child configs atomically This also leaves unmodified configs as they are. --- diff --git a/src/libcharon/plugins/vici/vici_config.c b/src/libcharon/plugins/vici/vici_config.c index 6cf127b74d..27268a5128 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); }