From: Michael Tremer Date: Thu, 6 Mar 2025 16:37:09 +0000 (+0000) Subject: tree: Try harder to merge networks X-Git-Tag: 0.9.18~22 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=913d2904941286acc27ed2cdb49914c05eadd31b;p=location%2Flibloc.git tree: Try harder to merge networks Signed-off-by: Michael Tremer --- diff --git a/src/network-tree.c b/src/network-tree.c index c2627e3..179ba3e 100644 --- a/src/network-tree.c +++ b/src/network-tree.c @@ -451,6 +451,7 @@ static int loc_network_tree_merge(struct loc_network_tree* tree) { .networks = NULL, .merged = 0, }; + unsigned int total_merged = 0; int r; // Create a new list @@ -458,12 +459,23 @@ static int loc_network_tree_merge(struct loc_network_tree* tree) { if (r) goto ERROR; - // Walk through the entire tree - r = loc_network_tree_walk(tree, NULL, loc_network_tree_merge_step, &ctx); - if (r) - goto ERROR; + // This is a fix for a very interesting problem which only occurs on non-Debian + // systems where the algorithm seems to miss some merges. If we run it multiple + // times it will however find them... + do { + // Reset merges + ctx.merged = 0; + + // Walk through the entire tree + r = loc_network_tree_walk(tree, NULL, loc_network_tree_merge_step, &ctx); + if (r) + goto ERROR; + + // Count all merges + total_merged += ctx.merged; + } while (ctx.merged > 0); - DEBUG(tree->ctx, "%u network(s) have been merged\n", ctx.merged); + DEBUG(tree->ctx, "%u network(s) have been merged\n", total_merged); ERROR: if (ctx.networks)