From ad5793a32dbf47294626a83baf7196cf433d9a5c Mon Sep 17 00:00:00 2001
From: Jan Kadlec <jan.kadlec@nic.cz>
Date: Wed, 20 Feb 2013 18:32:40 +0100
Subject: [PATCH] NAPTR handling in rrset.c.

- Removed unused API function.
---
 src/libknot/rrset.c | 73 ++++++++++++---------------------------------
 src/libknot/rrset.h |  3 --
 2 files changed, 19 insertions(+), 57 deletions(-)

diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index fb20b2ccf..03ef0de2b 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -789,7 +789,6 @@ const knot_rrset_t *knot_rrset_rrsigs(const knot_rrset_t *rrset)
 knot_rrset_t *knot_rrset_get_rrsigs(knot_rrset_t *rrset)
 {
 	if (rrset == NULL) {
-		assert(0);	/* [code-review] This should not be here. */
 		return NULL;
 	} else {
 		return rrset->rrsigs;
@@ -1008,7 +1007,6 @@ dbg_rrset_exec_detail(
 			parsed += remainder_size;
 		} else {
 			assert(rrset->type = KNOT_RRTYPE_NAPTR);
-			assert(0);
 			/* Read fixed part - 2 shorts. */
 			const size_t naptr_fixed_part_size = 4;
 			int ret = knot_rrset_rdata_store_binary(rdata_buffer,
@@ -1954,7 +1952,7 @@ knot_dname_t **knot_rrset_get_next_rr_dname(const knot_rrset_t *rrset,
 	} else {
 		/*
 		 * Return DNAME from normal RR, if any.
-		 * Find DNAME in blocks. No need to check remainder. TODO: NAPTR.
+		 * Find DNAME in blocks. No need to check remainder.
 		 */
 		if (prev_dname) {
 			/* Nothing left to return. */
@@ -1969,6 +1967,9 @@ knot_dname_t **knot_rrset_get_next_rr_dname(const knot_rrset_t *rrset,
 			} else if (descriptor_item_is_fixed(desc->block_types[i])) {
 				offset += desc->block_types[i];
 			} else if (!descriptor_item_is_remainder(desc->block_types[i])) {
+				offset +=
+					rrset_rdata_naptr_bin_chunk_size(rrset,
+				                                         rr_pos);
 				assert(rrset->type == KNOT_RRTYPE_NAPTR);
 				return (knot_dname_t **)(rdata + offset);
 			}
@@ -2033,6 +2034,9 @@ knot_dname_t **knot_rrset_get_next_dname(const knot_rrset_t *rrset,
 				offset += desc->block_types[i];
 			} else if (!descriptor_item_is_remainder(desc->block_types[i])) {
 				assert(rrset->type == KNOT_RRTYPE_NAPTR);
+				offset +=
+					rrset_rdata_naptr_bin_chunk_size(rrset,
+				                                         pos);
 				return (knot_dname_t **)(rdata + offset);
 			}
 		}
@@ -2041,53 +2045,6 @@ knot_dname_t **knot_rrset_get_next_dname(const knot_rrset_t *rrset,
 	return NULL;
 }
 
-uint8_t *knot_rrset_rdata_prealloc(const knot_rrset_t *rrset,
-                                   size_t *rdata_size)
-{
-	/*
-	 * Length of data can be sometimes guessed
-	 * easily. Well, for some types anyway.
-	 */
-	const rdata_descriptor_t *desc = get_rdata_descriptor(rrset->type);
-	assert(desc);
-	*rdata_size = 0;
-	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
-		int item = desc->block_types[i];
-		if (descriptor_item_is_fixed(item)) {
-			*rdata_size += item;
-		} else if (descriptor_item_is_dname(item)) {
-			*rdata_size += sizeof(knot_dname_t *);
-		} else if (descriptor_item_is_remainder(item)) {
-			//TODO
-			switch(rrset->type) {
-				case KNOT_RRTYPE_DS:
-					*rdata_size += 64;
-				break;
-				case KNOT_RRTYPE_RRSIG:
-					*rdata_size += 256;
-				break;
-				case KNOT_RRTYPE_DNSKEY:
-					*rdata_size += 1024;
-				break;
-				default:
-					*rdata_size += 512;
-			} //switch
-		} else {
-			assert(0);
-		}
-	}
-	
-	uint8_t *ret = malloc(*rdata_size);
-	if (ret == NULL) {
-		ERR_ALLOC_FAILED;
-		*rdata_size = 0;
-		return NULL;
-	}
-	/* TODO do properly. */
-	
-	return ret;
-}
-
 void knot_rrset_dump(const knot_rrset_t *rrset)
 {
 	if (rrset == NULL) {
@@ -2153,9 +2110,14 @@ static size_t rrset_binary_size_one(const knot_rrset_t *rrset,
 			size += rrset_rdata_item_size(rrset, rdata_pos) -
 			        offset;
 		} else {
-			fprintf(stderr, "NAPTR, failing miserably\n");
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
-			assert(0);
+			size_t naptr_chunk_size =
+				rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
+			size += naptr_chunk_size;
+			offset += naptr_chunk_size;
+			const knot_dname_t *dname =
+				*((const knot_dname_t **)(rdata + offset));
+			size += knot_dname_size(dname) + 1; // extra 1 - we need a size
 		}
 	}
 	
@@ -2211,14 +2173,17 @@ static void rrset_serialize_rr(const knot_rrset_t *rrset, size_t rdata_pos,
 			offset += item;
 			*size += item;
 		} else if (descriptor_item_is_remainder(item)) {
-			uint32_t remainder_size =
+			uint16_t remainder_size =
 				rrset_rdata_item_size(rrset,
 			                              rdata_pos) - offset;
 			memcpy(stream + *size, rdata + offset, remainder_size);
 			*size += remainder_size;
 		} else {
-			fprintf(stderr, "NAPTR, failing miserably\n");
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
+			/* Copy static chunk. */
+			uint16_t naptr_chunk_size =
+				rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
+			memcpy(stream + *size, rdata + offset, naptr_chunk_size);
 			assert(0);
 		}
 	}
diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h
index c954f8947..e0cd6cb33 100644
--- a/src/libknot/rrset.h
+++ b/src/libknot/rrset.h
@@ -486,9 +486,6 @@ const knot_dname_t *knot_rrset_rdata_srv_name(const knot_rrset_t *rrset,
 const knot_dname_t *knot_rrset_rdata_name(const knot_rrset_t *rrset,
                                           size_t rdata_pos);
 
-uint8_t *knot_rrset_rdata_prealloc(const knot_rrset_t *rrset,
-                                   size_t *size);
-
 void knot_rrset_dump(const knot_rrset_t *rrset);
 
 //TODO test
-- 
GitLab