isc_result_t
dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
- isc_region_t *region, unsigned int reservelen,
- uint32_t limit);
+ isc_region_t *region, uint32_t limit);
+isc_result_t
+dns_rdataslab_raw_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
+ isc_region_t *region, uint32_t limit);
/*%<
- * Slabify a rdataset. The slab area will be allocated and returned
- * in 'region'.
+ * Allocate space for a slab to hold the data in rdataset, and copy the
+ * data into it. The resulting slab will be returned in 'region'.
+ *
+ * The dns_rdataslab_raw_fromrdataset() function allocates and fills only
+ * the memory needed for a raw slab. dns_rdataslab_fromrdataset() also
+ * allocates space for a dns_slabheader object.
*
* Requires:
*\li 'rdataset' is valid.
result = dns_rdataset_getnoqname(rdataset, &name, &neg, &negsig);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_rdataslab_fromrdataset(&neg, mctx, &r1, 0, maxrrperset);
+ result = dns_rdataslab_raw_fromrdataset(&neg, mctx, &r1, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
- result = dns_rdataslab_fromrdataset(&negsig, mctx, &r2, 0, maxrrperset);
+ result = dns_rdataslab_raw_fromrdataset(&negsig, mctx, &r2,
+ maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
result = dns_rdataset_getclosest(rdataset, &name, &neg, &negsig);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_rdataslab_fromrdataset(&neg, mctx, &r1, 0, maxrrperset);
+ result = dns_rdataslab_raw_fromrdataset(&neg, mctx, &r1, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
- result = dns_rdataslab_fromrdataset(&negsig, mctx, &r2, 0, maxrrperset);
+ result = dns_rdataslab_raw_fromrdataset(&negsig, mctx, &r2,
+ maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
REQUIRE(version == NULL);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx,
- ®ion, sizeof(dns_slabheader_t),
- qpdb->maxrrperset);
+ ®ion, qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb,
loading_addnode(loadctx, name, rdataset->type, rdataset->covers, &node);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx,
- ®ion, sizeof(dns_slabheader_t),
- qpdb->maxrrperset);
+ ®ion, qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb, name,
rdataset->covers != dns_rdatatype_nsec3));
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx,
- ®ion, sizeof(dns_slabheader_t),
- qpdb->maxrrperset);
+ ®ion, qpdb->maxrrperset);
if (result != ISC_R_SUCCESS) {
if (result == DNS_R_TOOMANYRECORDS) {
dns__db_logtoomanyrecords((dns_db_t *)qpdb, &node->name,
dns_name_copy(&node->name, nodename);
result = dns_rdataslab_fromrdataset(rdataset, qpdb->common.mctx,
- ®ion, sizeof(dns_slabheader_t),
- 0);
+ ®ion, 0);
if (result != ISC_R_SUCCESS) {
return result;
}
* The rdataslab structure allows iteration to occur in both load order
* and DNSSEC order. The structure is as follows:
*
- * header (reservelen bytes)
+ * header (dns_slabheader_t)
* record count (2 bytes)
* offset table (4 x record count bytes in load order)
* data records
* meta data (1 byte for RRSIG's)
* data (data length bytes)
*
+ * A "raw" rdataslab is the same but without the header.
+ *
* DNSSEC order traversal is performed by walking the data records.
*
* The order is stored with record to allow for efficient reconstruction
return dns_rdata_compare(p1, p2);
}
-isc_result_t
-dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
- isc_region_t *region, unsigned int reservelen,
- uint32_t maxrrperset) {
+static isc_result_t
+makeslab(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
+ uint32_t maxrrperset, bool raw) {
/*
* Use &removed as a sentinel pointer for duplicate
* rdata as rdata.data == NULL is valid.
static unsigned char removed;
dns_rdata_t *rdata = NULL;
unsigned char *rawbuf = NULL;
+ unsigned int headerlen = raw ? 0 : sizeof(dns_slabheader_t);
unsigned int buflen;
isc_result_t result;
unsigned int nitems;
unsigned int length;
unsigned int i;
- buflen = reservelen + 2;
+ buflen = headerlen + 2;
nitems = dns_rdataset_count(rdataset);
rawbuf = isc_mem_get(mctx, buflen);
region->base = rawbuf;
region->length = buflen;
- rawbuf += reservelen;
+ rawbuf += headerlen;
*rawbuf++ = 0;
*rawbuf = 0;
return ISC_R_SUCCESS;
* Don't forget the last item!
*/
buflen += (2 + rdata[i - 1].length);
+
/*
* Provide space to store the per RR meta data.
*/
region->base = rawbuf;
region->length = buflen;
- rawbuf += reservelen;
+ rawbuf += headerlen;
put_uint16(rawbuf, nitems);
length++;
}
INSIST(length <= 0xffff);
+
put_uint16(rawbuf, length);
/*
return result;
}
+isc_result_t
+dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
+ isc_region_t *region, uint32_t maxrrperset) {
+ return makeslab(rdataset, mctx, region, maxrrperset, false);
+}
+
+isc_result_t
+dns_rdataslab_raw_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
+ isc_region_t *region, uint32_t maxrrperset) {
+ return makeslab(rdataset, mctx, region, maxrrperset, true);
+}
+
unsigned int
dns_rdataslab_sizeraw(unsigned char *slab) {
REQUIRE(slab != NULL);