diff->size += 1;
}
+void
+dns_diff_appendlist(dns_diff_t *dst, dns_diff_t *src) {
+ REQUIRE(DNS_DIFF_VALID(dst));
+ REQUIRE(DNS_DIFF_VALID(src));
+
+ ISC_LIST_APPENDLIST(dst->tuples, src->tuples, link);
+ dst->size += src->size;
+ src->size = 0;
+ ENSURE(ISC_LIST_EMPTY(src->tuples));
+}
+
void
dns_diff_unlink(dns_diff_t *diff, dns_difftuple_t *tuple) {
REQUIRE(DNS_DIFF_VALID(diff));
* \li The tuple has been freed, or will be freed when the diff is cleared.
*/
+void
+dns_diff_appendlist(dns_diff_t *dst, dns_diff_t *src);
+/*%<
+ * Move all tuples from 'src' to the end of 'dst'.
+ *
+ * Requires:
+ * \li 'dst' is a valid diff.
+ * \li 'src' is a valid diff.
+ *
+ * Ensures:
+ * \li 'src' is empty.
+ */
+
void
dns_diff_unlink(dns_diff_t *diff, dns_difftuple_t *tuple);
/*%<
for (i = 0; i < 2; i++) {
if (!have[!i]) {
- ISC_LIST_FOREACH(diff[i].tuples, tuple, link) {
- dns_diff_unlink(&diff[i], tuple);
- dns_diff_append(resultdiff, &tuple);
- }
+ dns_diff_appendlist(resultdiff, &diff[i]);
have[i] = false;
goto next;
}
t = dns_name_compare(dns_fixedname_name(&fixname[0]),
dns_fixedname_name(&fixname[1]));
if (t < 0) {
- ISC_LIST_FOREACH(diff[0].tuples, tuple, link) {
- dns_diff_unlink(&diff[0], tuple);
- dns_diff_append(resultdiff, &tuple);
- }
+ dns_diff_appendlist(resultdiff, &diff[0]);
have[0] = false;
continue;
}
if (t > 0) {
- ISC_LIST_FOREACH(diff[1].tuples, tuple, link) {
- dns_diff_unlink(&diff[1], tuple);
- dns_diff_append(resultdiff, &tuple);
- }
+ dns_diff_appendlist(resultdiff, &diff[1]);
have[1] = false;
continue;
}
return DNS_R_CONTINUE;
}
}
- ISC_LIST_FOREACH(state->work.tuples, t, link) {
- dns_diff_unlink(&state->work, t);
- dns_diff_append(diff, &t);
- }
+ dns_diff_appendlist(diff, &state->work);
update_log(log, zone, ISC_LOG_DEBUG(3),
"updated data signatures");
CHECK(namelist_append_subdomain(db, &t->name,
&state->affected));
}
- ISC_LIST_FOREACH(state->diffnames.tuples, t, link) {
- dns_diff_unlink(&state->diffnames, t);
- dns_diff_append(&state->affected, &t);
- }
+ dns_diff_appendlist(&state->affected, &state->diffnames);
CHECK(uniqify_name_list(&state->affected));
return DNS_R_CONTINUE;
}
}
- ISC_LIST_FOREACH(state->work.tuples, t, link) {
- dns_diff_unlink(&state->work, t);
- dns_diff_append(&state->affected, &t);
- }
+ dns_diff_appendlist(&state->affected, &state->work);
/*
* Now we know which names are part of the NSEC chain.
return DNS_R_CONTINUE;
}
}
- ISC_LIST_FOREACH(state->work.tuples, t, link) {
- dns_diff_unlink(&state->work, t);
- dns_diff_append(&state->nsec_mindiff, &t);
- }
+ dns_diff_appendlist(&state->nsec_mindiff, &state->work);
FALLTHROUGH;
case update_nsec3:
state->state = update_nsec3;
return DNS_R_CONTINUE;
}
}
- ISC_LIST_FOREACH(state->work.tuples, t, link) {
- dns_diff_unlink(&state->work, t);
- dns_diff_append(&state->affected, &t);
- }
+ dns_diff_appendlist(&state->affected, &state->work);
/*
* Minimize the set of NSEC3 updates so that we don't
return DNS_R_CONTINUE;
}
}
- ISC_LIST_FOREACH(state->work.tuples, t, link) {
- dns_diff_unlink(&state->work, t);
- dns_diff_append(&state->nsec_mindiff, &t);
- }
+ dns_diff_appendlist(&state->nsec_mindiff, &state->work);
/* Record our changes for the journal. */
ISC_LIST_FOREACH(state->sig_diff.tuples, t, link) {
}
dns_diff_init(xfr->mctx, &data->diff);
- ISC_LIST_FOREACH(xfr->diff.tuples, tuple, link) {
- dns_diff_unlink(&xfr->diff, tuple);
- dns_diff_append(&data->diff, &tuple);
- }
+ dns_diff_appendlist(&data->diff, &xfr->diff);
(void)cds_wfcq_enqueue(&xfr->diff_head, &xfr->diff_tail,
&data->wfcq_node);
* them yet because "name" still points into one
* of them. Move them on a temporary list.
*/
- ISC_LIST_FOREACH(u_rrs.tuples, trash_tuple, link) {
- dns_diff_unlink(&u_rrs, trash_tuple);
- dns_diff_append(&trash, &trash_tuple);
- }
- ISC_LIST_FOREACH(d_rrs.tuples, trash_tuple, link) {
- dns_diff_unlink(&d_rrs, trash_tuple);
- dns_diff_append(&trash, &trash_tuple);
- }
+ dns_diff_appendlist(&trash, &u_rrs);
+ dns_diff_appendlist(&trash, &d_rrs);
dns_rdataset_disassociate(&rdataset);
continue;