uint8_t *knot_rdata_data(const knot_rdata_t *);
size_t knot_rdata_array_size(uint16_t);
knot_rdata_t *knot_rdataset_at(const knot_rdataset_t *, size_t);
+int knot_rdataset_merge(knot_rdataset_t *, const knot_rdataset_t *, knot_mm_t *);
int knot_rrset_add_rdata(knot_rrset_t *, const uint8_t *, const uint16_t, const uint32_t, knot_mm_t *);
void knot_rrset_init_empty(knot_rrset_t *);
uint32_t knot_rrset_ttl(const knot_rrset_t *);
if ret ~= 0 then return nil, knot_strerror(ret) end
return true
end,
+ -- Merge data from another RR set into the current one
+ merge_rdata = function (rr, source)
+ assert(ffi.istype(knot_rrset_t, rr))
+ assert(ffi.istype(knot_rrset_t, source))
+ local ret = knot.knot_rdataset_merge(rr.rrs, source.rrs, nil)
+ if ret ~= 0 then return nil, knot_strerror(ret) end
+ return true
+ end,
-- Return type covered by this RRSIG
type_covered = function(rr, pos)
assert(ffi.istype(knot_rrset_t, rr))
same(rr:class(kres.class.IN), kres.class.IN, 'can restore a class')
same(rr.type, kres.type.A, 'created RR has correct type')
-- test adding rdata
- local rdata = '\1\2\3\4'
- ok(rr:add_rdata(rdata, #rdata, 66), 'adding RDATA works')
+ ok(rr:add_rdata('\1\2\3\4', 4, 66), 'adding RDATA works')
-- test conversion to text
- same(rr:txt_dump(), 'com. 66 A 1.2.3.4\n', 'RR to text works')
+ local expect = 'com. 66 A 1.2.3.4\n'
+ same(rr:txt_dump(), expect, 'RR to text works')
-- create a dummy rrsig
local rrsig = kres.rrset(kres.str2dname('com.'), kres.type.RRSIG, kres.class.IN)
rrsig:add_rdata('\0\1', 2, 0)
-- check rrsig matching
same(rr.type, rrsig:type_covered(), 'rrsig type covered matches covered RR type')
ok(rr:is_covered_by(rrsig), 'rrsig is covering a record')
+ -- test rrset merging
+ local copy = kres.rrset(rr:owner(), rr.type)
+ ok(copy:add_rdata('\4\3\2\1', 4, 66), 'adding second RDATA works')
+ ok(rr:merge_rdata(copy), 'merge_rdata works')
+ expect = 'com. 66 A 1.2.3.4\n' ..
+ 'com. 66 A 4.3.2.1\n'
+ same(rr:txt_dump(), expect, 'merge_rdata actually merged RDATA')
end
-- test dns library packet interface