// For subnet search and bogons
struct loc_network_list* stack;
+ struct loc_network_list* subnets;
// For bogons
struct in6_addr gap6_start;
if (enumerator->stack)
loc_network_list_unref(enumerator->stack);
+ if (enumerator->subnets)
+ loc_network_list_unref(enumerator->subnets);
+
free(enumerator);
}
return 0;
struct loc_network* subnet = NULL;
- struct loc_network_list* subnets;
// Create a list with all subnets
- r = loc_network_list_new(enumerator->ctx, &subnets);
- if (r)
- return r;
+ if (!enumerator->subnets) {
+ r = loc_network_list_new(enumerator->ctx, &enumerator->subnets);
+ if (r)
+ return r;
+ }
// Search all subnets from the database
while (1) {
r = __loc_database_enumerator_next_network(enumerator, &subnet, 0);
if (r) {
loc_network_unref(subnet);
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
return r;
}
// Collect all subnets in a list
if (loc_network_is_subnet(*network, subnet)) {
- r = loc_network_list_push(subnets, subnet);
+ r = loc_network_list_push(enumerator->subnets, subnet);
if (r) {
loc_network_unref(subnet);
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
return r;
}
r = loc_network_list_push(enumerator->stack, subnet);
if (r) {
loc_network_unref(subnet);
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
return r;
}
break;
}
- DEBUG(enumerator->ctx, "Found %zu subnet(s)\n", loc_network_list_size(subnets));
+ DEBUG(enumerator->ctx, "Found %zu subnet(s)\n",
+ loc_network_list_size(enumerator->subnets));
// We can abort here if the network has no subnets
- if (loc_network_list_empty(subnets)) {
- loc_network_list_unref(subnets);
+ if (loc_network_list_empty(enumerator->subnets)) {
+ loc_network_list_clear(enumerator->subnets);
return 0;
}
// If the network has any subnets, we will break it into smaller parts
// without the subnets.
- struct loc_network_list* excluded = loc_network_exclude_list(*network, subnets);
+ struct loc_network_list* excluded = loc_network_exclude_list(*network, enumerator->subnets);
if (!excluded) {
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
return -1;
}
// Merge subnets onto the stack
- r = loc_network_list_merge(enumerator->stack, subnets);
+ r = loc_network_list_merge(enumerator->stack, enumerator->subnets);
if (r) {
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
loc_network_list_unref(excluded);
return r;
// Push excluded list onto the stack
r = loc_network_list_merge(enumerator->stack, excluded);
if (r) {
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
loc_network_list_unref(excluded);
return r;
}
- loc_network_list_unref(subnets);
+ loc_network_list_clear(enumerator->subnets);
loc_network_list_unref(excluded);
// Drop the network and restart the whole process again to pick the next network