a->n_ref = 1;
a->n_allocated = n;
a->set_items = TAKE_PTR(s);
-
return a;
}
static void dns_answer_flush(DnsAnswer *a) {
- DnsResourceRecord *rr;
+ DnsAnswerItem *item;
if (!a)
return;
a->set_items = set_free(a->set_items);
- DNS_ANSWER_FOREACH(rr, a)
- dns_resource_record_unref(rr);
+ DNS_ANSWER_FOREACH_ITEM(item, a)
+ dns_resource_record_unref(item->rr);
a->n_rrs = 0;
}
}
static int dns_answer_add_raw_all(DnsAnswer *a, DnsAnswer *source) {
- DnsResourceRecord *rr;
- DnsAnswerFlags flags;
- int ifindex, r;
+ DnsAnswerItem *item;
+ int r;
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, source) {
- r = dns_answer_add_raw(a, rr, ifindex, flags);
+ DNS_ANSWER_FOREACH_ITEM(item, source) {
+ r = dns_answer_add_raw(
+ a,
+ item->rr,
+ item->ifindex,
+ item->flags);
if (r < 0)
return r;
}
}
static int dns_answer_add_all(DnsAnswer *a, DnsAnswer *b) {
- DnsResourceRecord *rr;
- DnsAnswerFlags flags;
- int ifindex, r;
+ DnsAnswerItem *item;
+ int r;
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, b) {
- r = dns_answer_add(a, rr, ifindex, flags);
+ DNS_ANSWER_FOREACH_ITEM(item, b) {
+ r = dns_answer_add(a, item->rr, item->ifindex, item->flags);
if (r < 0)
return r;
}
if ((*a)->n_ref > 1) {
_cleanup_(dns_answer_unrefp) DnsAnswer *copy = NULL;
- DnsAnswerFlags flags;
- int ifindex;
+ DnsAnswerItem *item;
copy = dns_answer_new((*a)->n_rrs);
if (!copy)
return -ENOMEM;
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, *a) {
- r = dns_resource_key_equal(rr->key, key);
+ DNS_ANSWER_FOREACH_ITEM(item, *a) {
+ r = dns_resource_key_equal(item->rr->key, key);
if (r < 0)
return r;
if (r > 0)
continue;
- r = dns_answer_add_raw(copy, rr, ifindex, flags);
+ r = dns_answer_add_raw(copy, item->rr, item->ifindex, item->flags);
if (r < 0)
return r;
}
if ((*a)->n_ref > 1) {
_cleanup_(dns_answer_unrefp) DnsAnswer *copy = NULL;
- DnsAnswerFlags flags;
- int ifindex;
+ DnsAnswerItem *item;
copy = dns_answer_new((*a)->n_rrs);
if (!copy)
return -ENOMEM;
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, *a) {
- r = dns_resource_record_equal(rr, rm);
+ DNS_ANSWER_FOREACH_ITEM(item, *a) {
+ r = dns_resource_record_equal(item->rr, rm);
if (r < 0)
return r;
if (r > 0)
continue;
- r = dns_answer_add_raw(copy, rr, ifindex, flags);
+ r = dns_answer_add_raw(copy, item->rr, item->ifindex, item->flags);
if (r < 0)
return r;
}
}
int dns_answer_copy_by_key(DnsAnswer **a, DnsAnswer *source, const DnsResourceKey *key, DnsAnswerFlags or_flags) {
- DnsResourceRecord *rr_source;
- int ifindex_source, r;
- DnsAnswerFlags flags_source;
+ DnsAnswerItem *item;
+ int r;
assert(a);
assert(key);
/* Copy all RRs matching the specified key from source into *a */
- DNS_ANSWER_FOREACH_FULL(rr_source, ifindex_source, flags_source, source) {
+ DNS_ANSWER_FOREACH_ITEM(item, source) {
- r = dns_resource_key_equal(rr_source->key, key);
+ r = dns_resource_key_equal(item->rr->key, key);
if (r < 0)
return r;
if (r == 0)
if (r < 0)
return r;
- r = dns_answer_add(*a, rr_source, ifindex_source, flags_source|or_flags);
+ r = dns_answer_add(*a, item->rr, item->ifindex, item->flags|or_flags);
if (r < 0)
return r;
}
* This function is not used in the code base, but is useful when debugging. Do not delete.
*/
void dns_answer_dump(DnsAnswer *answer, FILE *f) {
- DnsResourceRecord *rr;
- DnsAnswerFlags flags;
- int ifindex;
+ DnsAnswerItem *item;
if (!f)
f = stdout;
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, answer) {
+ DNS_ANSWER_FOREACH_ITEM(item, answer) {
const char *t;
fputc('\t', f);
- t = dns_resource_record_to_string(rr);
+ t = dns_resource_record_to_string(item->rr);
if (!t) {
log_oom();
continue;
fputs(t, f);
- if (ifindex != 0 || flags != 0)
+ if (item->ifindex != 0 || item->flags != 0)
fputs("\t;", f);
- if (ifindex != 0)
- fprintf(f, " ifindex=%i", ifindex);
- if (flags & DNS_ANSWER_AUTHENTICATED)
+ if (item->ifindex != 0)
+ fprintf(f, " ifindex=%i", item->ifindex);
+ if (item->flags & DNS_ANSWER_AUTHENTICATED)
fputs(" authenticated", f);
- if (flags & DNS_ANSWER_CACHEABLE)
+ if (item->flags & DNS_ANSWER_CACHEABLE)
fputs(" cacheable", f);
- if (flags & DNS_ANSWER_SHARED_OWNER)
+ if (item->flags & DNS_ANSWER_SHARED_OWNER)
fputs(" shared-owner", f);
- if (flags & DNS_ANSWER_CACHE_FLUSH)
+ if (item->flags & DNS_ANSWER_CACHE_FLUSH)
fputs(" cache-flush", f);
- if (flags & DNS_ANSWER_GOODBYE)
+ if (item->flags & DNS_ANSWER_GOODBYE)
fputs(" goodbye", f);
fputc('\n', f);
#define DNS_ANSWER_FOREACH_FLAGS(kk, flags, a) _DNS_ANSWER_FOREACH_FLAGS(UNIQ, kk, flags, a)
-#define _DNS_ANSWER_FOREACH_FULL(q, kk, ifi, fl, a) \
+#define _DNS_ANSWER_FOREACH_ITEM(q, item, a) \
for (size_t UNIQ_T(i, q) = ({ \
- (kk) = ((a) && (a)->n_rrs > 0) ? (a)->items[0].rr : NULL; \
- (ifi) = ((a) && (a)->n_rrs > 0) ? (a)->items[0].ifindex : 0; \
- (fl) = ((a) && (a)->n_rrs > 0) ? (a)->items[0].flags : 0; \
+ (item) = dns_answer_isempty(a) ? NULL : (a)->items; \
0; \
}); \
- (a) && (UNIQ_T(i, q) < (a)->n_rrs); \
+ UNIQ_T(i, q) < dns_answer_size(a); \
UNIQ_T(i, q)++, \
- (kk) = ((UNIQ_T(i, q) < (a)->n_rrs) ? (a)->items[UNIQ_T(i, q)].rr : NULL), \
- (ifi) = ((UNIQ_T(i, q) < (a)->n_rrs) ? (a)->items[UNIQ_T(i, q)].ifindex : 0), \
- (fl) = ((UNIQ_T(i, q) < (a)->n_rrs) ? (a)->items[UNIQ_T(i, q)].flags : 0))
+ (item) = ((UNIQ_T(i, q) < dns_answer_size(a)) ? (a)->items + UNIQ_T(i, q) : NULL))
-#define DNS_ANSWER_FOREACH_FULL(kk, ifindex, flags, a) _DNS_ANSWER_FOREACH_FULL(UNIQ, kk, ifindex, flags, a)
+#define DNS_ANSWER_FOREACH_ITEM(item, a) _DNS_ANSWER_FOREACH_ITEM(UNIQ, item, a)
int owner_family,
const union in_addr_union *owner_address) {
- DnsResourceRecord *soa = NULL, *rr;
+ DnsResourceRecord *soa = NULL;
bool weird_rcode = false;
+ DnsAnswerItem *item;
DnsAnswerFlags flags;
unsigned cache_keys;
- int r, ifindex;
+ int r;
assert(c);
assert(owner_address);
timestamp = now(clock_boottime_or_monotonic());
/* Second, add in positive entries for all contained RRs */
- DNS_ANSWER_FOREACH_FULL(rr, ifindex, flags, answer) {
- if ((flags & DNS_ANSWER_CACHEABLE) == 0 ||
- !rr_eligible(rr))
+ DNS_ANSWER_FOREACH_ITEM(item, answer) {
+ if ((item->flags & DNS_ANSWER_CACHEABLE) == 0 ||
+ !rr_eligible(item->rr))
continue;
r = dns_cache_put_positive(
c,
- rr,
- flags & DNS_ANSWER_AUTHENTICATED,
- flags & DNS_ANSWER_SHARED_OWNER,
+ item->rr,
+ item->flags & DNS_ANSWER_AUTHENTICATED,
+ item->flags & DNS_ANSWER_SHARED_OWNER,
timestamp,
- ifindex,
+ item->ifindex,
owner_family, owner_address);
if (r < 0)
goto fail;
if (key)
dns_cache_remove_by_key(c, key);
- DNS_ANSWER_FOREACH_FLAGS(rr, flags, answer) {
- if ((flags & DNS_ANSWER_CACHEABLE) == 0)
+ DNS_ANSWER_FOREACH_ITEM(item, answer) {
+ if ((item->flags & DNS_ANSWER_CACHEABLE) == 0)
continue;
- dns_cache_remove_by_key(c, rr->key);
+ dns_cache_remove_by_key(c, item->rr->key);
}
return r;