diff --git a/src/knot/conf/conf.c b/src/knot/conf/conf.c index d69094916019b9655782f571a5b4ad760eddf82c..c49dc5cb353e09f896a3379967334666ac6d4799 100644 --- a/src/knot/conf/conf.c +++ b/src/knot/conf/conf.c @@ -539,9 +539,10 @@ bool conf_val_equal( return false; } -conf_mix_iter_t conf_mix_iter( +void conf_mix_iter_init( conf_t *conf, - conf_val_t *mix_id) + conf_val_t *mix_id, + conf_mix_iter_t *iter) { assert(mix_id != NULL && mix_id->item != NULL); assert(mix_id->item->type == YP_TREF && @@ -550,27 +551,24 @@ conf_mix_iter_t conf_mix_iter( mix_id->item->var.r.ref->var.g.id->type == YP_TSTR && mix_id->item->var.r.grp_ref->var.g.id->type == YP_TSTR); - conf_mix_iter_t iter = { - .conf = conf, - .mix_id = mix_id, - .id = mix_id - }; + iter->conf = conf; + iter->mix_id = mix_id; + iter->id = mix_id; + iter->nested = false; if (mix_id->code != KNOT_EOK) { - return iter; + return; } - iter.sub_id = conf_id_get_txn(conf, &conf->read_txn, - mix_id->item->var.r.grp_ref_name, - mix_id->item->var.r.ref_name, - mix_id); - if (iter.sub_id.code == KNOT_EOK) { - conf_val(&iter.sub_id); - iter.id = &iter.sub_id; - iter.nested = true; + iter->sub_id = conf_id_get_txn(conf, &conf->read_txn, + mix_id->item->var.r.grp_ref_name, + mix_id->item->var.r.ref_name, + mix_id); + if (iter->sub_id.code == KNOT_EOK) { + conf_val(&iter->sub_id); + iter->id = &iter->sub_id; + iter->nested = true; } - - return iter; } void conf_mix_iter_next( @@ -581,6 +579,7 @@ void conf_mix_iter_next( if (iter->id->code == KNOT_EOK) { return; } + assert(iter->id->code == KNOT_EOF); conf_val_next(iter->mix_id); if (iter->mix_id->code != KNOT_EOK) { return; diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h index e45b3ec73310a9bf1161ff82478415f21fd59397..0e90a528295840ee091f28ecb9a3f11ea1959cc4 100644 --- a/src/knot/conf/conf.h +++ b/src/knot/conf/conf.h @@ -422,18 +422,18 @@ bool conf_val_equal( ); /*! - * Prepares a mixed reference iterator. + * Initializes a mixed reference iterator. * - * The following access is through val->id. + * The following access is through iter->id. * * \param[in] conf Configuration. * \param[in] mix_id First mixed reference. - * - * \return Mixed reference iterator. + * \param[out] iter Iterator to be initialized. */ -conf_mix_iter_t conf_mix_iter( +void conf_mix_iter_init( conf_t *conf, - conf_val_t *mix_id + conf_val_t *mix_id, + conf_mix_iter_t *iter ); /*! diff --git a/src/knot/dnssec/context.c b/src/knot/dnssec/context.c index 2b94ac4e17619bb9ecfcef25f35220ce0e267a4b..15d99f363c0fec9e08cc846ac144ccc5f77d2b13 100644 --- a/src/knot/dnssec/context.c +++ b/src/knot/dnssec/context.c @@ -117,7 +117,8 @@ static void policy_load(knot_kasp_policy_t *policy, conf_t *conf, conf_val_t *id policy->ksk_sbm_timeout = conf_int(&val); val = conf_id_get(conf, C_SBM, C_PARENT, &ksk_sbm); - conf_mix_iter_t iter = conf_mix_iter(conf, &val); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, &val, &iter); while (iter.id->code == KNOT_EOK) { conf_val_t addr = conf_id_get(conf, C_RMT, C_ADDR, iter.id); knot_kasp_parent_t p = { .addrs = conf_val_count(&addr) }; diff --git a/src/knot/events/handlers/ds_push.c b/src/knot/events/handlers/ds_push.c index 9a1f94ab0c38f3cceb1592cd39cb2afdc35a5dba..03bba2bfe5c488797dae56cae504a80072cba096 100644 --- a/src/knot/events/handlers/ds_push.c +++ b/src/knot/events/handlers/ds_push.c @@ -240,7 +240,8 @@ int event_ds_push(conf_t *conf, zone_t *zone) conf_val_t policy_id = conf_zone_get(conf, C_DNSSEC_POLICY, zone->name); conf_id_fix_default(&policy_id); conf_val_t ds_push = conf_id_get(conf, C_POLICY, C_DS_PUSH, &policy_id); - conf_mix_iter_t iter = conf_mix_iter(conf, &ds_push); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, &ds_push, &iter); while (iter.id->code == KNOT_EOK) { conf_val_t addr = conf_id_get(conf, C_RMT, C_ADDR, iter.id); size_t addr_count = conf_val_count(&addr); diff --git a/src/knot/events/handlers/notify.c b/src/knot/events/handlers/notify.c index 74136c6fa726226e02cc49fd6baccd0bdae07750..b7cbdf1ee3f2024529fa60d51881bde8976cdc92 100644 --- a/src/knot/events/handlers/notify.c +++ b/src/knot/events/handlers/notify.c @@ -143,7 +143,8 @@ int event_notify(conf_t *conf, zone_t *zone) // send NOTIFY to each remote, use working address conf_val_t notify = conf_zone_get(conf, C_NOTIFY, zone->name); - conf_mix_iter_t iter = conf_mix_iter(conf, ¬ify); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, ¬ify, &iter); while (iter.id->code == KNOT_EOK) { conf_val_t addr = conf_id_get(conf, C_RMT, C_ADDR, iter.id); size_t addr_count = conf_val_count(&addr); diff --git a/src/knot/updates/acl.c b/src/knot/updates/acl.c index 090dd3603fe5b43d5fa696474c474be35adaf483..c3e0a28a3355e6bc0f5c7e1b38ab3ef22a7cbde1 100644 --- a/src/knot/updates/acl.c +++ b/src/knot/updates/acl.c @@ -234,7 +234,8 @@ bool acl_allowed(conf_t *conf, conf_val_t *acl, acl_action_t action, /* Check if a remote matches given address and key. */ conf_val_t addr_val, key_val; - conf_mix_iter_t iter = conf_mix_iter(conf, &rmt_val); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, &rmt_val, &iter); while (iter.id->code == KNOT_EOK) { addr_val = conf_id_get(conf, C_RMT, C_ADDR, iter.id); key_val = conf_id_get(conf, C_RMT, C_KEY, iter.id); diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c index fca45581d520c025427e9168216a5c0deb6e0983..321f3f5e66661a8b48ddd325e295a61482e133a0 100644 --- a/src/knot/zone/zone.c +++ b/src/knot/zone/zone.c @@ -491,7 +491,8 @@ int static preferred_master(conf_t *conf, zone_t *zone, conf_remote_t *master) } conf_val_t masters = conf_zone_get(conf, C_MASTER, zone->name); - conf_mix_iter_t iter = conf_mix_iter(conf, &masters); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, &masters, &iter); while (iter.id->code == KNOT_EOK) { conf_val_t addr = conf_id_get(conf, C_RMT, C_ADDR, iter.id); size_t addr_count = conf_val_count(&addr); @@ -558,7 +559,8 @@ int zone_master_try(conf_t *conf, zone_t *zone, zone_master_cb callback, bool success = false; conf_val_t masters = conf_zone_get(conf, C_MASTER, zone->name); - conf_mix_iter_t iter = conf_mix_iter(conf, &masters); + conf_mix_iter_t iter; + conf_mix_iter_init(conf, &masters, &iter); while (iter.id->code == KNOT_EOK && fallback.remote) { conf_val_t addr = conf_id_get(conf, C_RMT, C_ADDR, iter.id); size_t addr_count = conf_val_count(&addr); diff --git a/tests/knot/test_conf.c b/tests/knot/test_conf.c index a5c69c977dad3cfb0acc15167ffd3bd17c14bda9..d9dc657dadb52e249dacf0d2e45c617155ab8472 100644 --- a/tests/knot/test_conf.c +++ b/tests/knot/test_conf.c @@ -234,7 +234,8 @@ static void test_mix_ref(void) size_t cnt1 = 0; conf_val_t test1 = conf_rawid_get(conf(), C_SBM, C_PARENT, (const uint8_t *)"t1", 3); - conf_mix_iter_t iter1 = conf_mix_iter(conf(), &test1); + conf_mix_iter_t iter1; + conf_mix_iter_init(conf(), &test1, &iter1); while (iter1.id->code == KNOT_EOK) { cnt1++; conf_mix_iter_next(&iter1); @@ -243,7 +244,8 @@ static void test_mix_ref(void) size_t cnt2 = 0; conf_val_t test2 = conf_rawid_get(conf(), C_SBM, C_PARENT, (const uint8_t *)"t2", 3); - conf_mix_iter_t iter2 = conf_mix_iter(conf(), &test2); + conf_mix_iter_t iter2; + conf_mix_iter_init(conf(), &test2, &iter2); while (iter2.id->code == KNOT_EOK) { cnt2++; conf_mix_iter_next(&iter2);