#include "lib/cache.h"
#include "lib/defines.h"
+#include "lib/utils.h"
/* Key size */
#define KEY_HSIZE (1 + sizeof(uint16_t))
return kr_error(ENOMEM);
}
- knot_rdata_t *rd = knot_rdataset_at(&src->rrs, 0);
- knot_rdata_t *rd_dst = NULL;
+ /* Copy valid records */
+ knot_rdata_t *rd = src->rrs.data;
for (uint16_t i = 0; i < src->rrs.rr_count; ++i) {
if (knot_rdata_ttl(rd) >= drift) {
- /* Append record */
if (knot_rdataset_add(&dst->rrs, rd, mm) != 0) {
knot_rrset_clear(dst, mm);
return kr_error(ENOMEM);
}
- /* Fixup TTL time drift */
- rd_dst = knot_rdataset_at(&dst->rrs, dst->rrs.rr_count - 1);
- knot_rdata_set_ttl(rd_dst, knot_rdata_ttl(rd) - drift);
}
- rd += knot_rdata_array_size(knot_rdata_rdlen(rd));
+ rd = kr_rdataset_next(rd);
+ }
+ /* Fixup TTL by time passed */
+ rd = dst->rrs.data;
+ for (uint16_t i = 0; i < dst->rrs.rr_count; ++i) {
+ knot_rdata_set_ttl(rd, knot_rdata_ttl(rd) - drift);
+ rd = kr_rdataset_next(rd);
}
return kr_ok();
.ttl = 0,
.count = rr->rrs.rr_count
};
+ knot_rdata_t *rd = rr->rrs.data;
for (uint16_t i = 0; i < rr->rrs.rr_count; ++i) {
- knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, i);
if (knot_rdata_ttl(rd) > header.ttl) {
header.ttl = knot_rdata_ttl(rd);
}
+ rd = kr_rdataset_next(rd);
}
namedb_val_t data = { rr->rrs.data, knot_rdataset_size(&rr->rrs) };
static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query)
{
if (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA) {
- const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, 0);
+ const knot_rdata_t *rdata = rr->rrs.data;
int ret = kr_zonecut_add(&query->zone_cut, rr->owner, rdata);
if (ret != 0) {
return KNOT_STATE_FAIL;
static void adjust_ttl(knot_rrset_t *rr, uint32_t drift)
{
- knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, 0);
+ knot_rdata_t *rd = rr->rrs.data;
for (uint16_t i = 0; i < rr->rrs.rr_count; ++i) {
uint32_t ttl = knot_rdata_ttl(rd);
if (ttl >= drift) {
knot_rdata_set_ttl(rd, ttl - drift);
}
- rd += knot_rdata_array_size(knot_rdata_rdlen(rd));
+ rd = kr_rdataset_next(rd);
}
}
if (rr->type == KNOT_RRTYPE_OPT || rr->type == KNOT_RRTYPE_TSIG) {
continue;
}
- knot_rdata_t *rd = knot_rdataset_at(&rr->rrs, 0);
+ knot_rdata_t *rd = rr->rrs.data;
for (uint16_t j = 0; j < rr->rrs.rr_count; ++j) {
if (knot_rdata_ttl(rd) < ttl) {
ttl = knot_rdata_ttl(rd);
has_ttl = true;
}
- rd += knot_rdata_array_size(knot_rdata_rdlen(rd));
+ rd = kr_rdataset_next(rd);
}
}
}
knot_pkt_parse_question((pkt)); \
} while (0)
+/** @internal Next RDATA shortcut. */
+#define kr_rdataset_next(rd) (rd + knot_rdata_array_size(knot_rdata_rdlen(rd)))
+
/** Concatenate N strings. */
char* kr_strcatdup(unsigned n, ...);
return;
}
- knot_rdata_t *rd = knot_rdataset_at(&cached_rr.rrs, 0);
+ knot_rdata_t *rd = cached_rr.rrs.data;
for (uint16_t i = 0; i < cached_rr.rrs.rr_count; ++i) {
if (knot_rdata_ttl(rd) > timestamp) {
(void) kr_zonecut_add(cut, ns, rd);
}
- rd += knot_rdata_array_size(knot_rdata_rdlen(rd));
+ rd = kr_rdataset_next(rd);
}
}