From dcee630fc8d7031461dcbb5938d3fafeeec88a79 Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek.vavrusa@nic.cz>
Date: Mon, 17 Dec 2012 16:37:06 +0100
Subject: [PATCH] Ported query to new rrset structures.

Reused wire writing from rrset (knot_rrset_to_wire).
---
 src/Makefile.am             |  2 +
 src/libknot/packet/packet.c |  1 -
 src/libknot/packet/query.c  | 79 ++-----------------------------------
 src/libknot/packet/query.h  |  5 +--
 src/libknot/rrset.h         |  1 +
 5 files changed, 8 insertions(+), 80 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 0942c967b..62197bf32 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,6 +31,8 @@ knot_zcompile_SOURCES =				\
 	libknot/util/wire.h			\
 	libknot/packet/packet.h			\
 	libknot/packet/packet.c			\
+	libknot/packet/query.h			\
+	libknot/packet/query.c			\
 	libknot/zone/zone.c			\
 	libknot/zone/zone-contents.c		\
 	libknot/zone/zone-tree.c		\
diff --git a/src/libknot/packet/packet.c b/src/libknot/packet/packet.c
index 88b6efa2a..28df0f6d4 100644
--- a/src/libknot/packet/packet.c
+++ b/src/libknot/packet/packet.c
@@ -404,7 +404,6 @@ static int knot_packet_parse_rdata(knot_rrset_t *rr, const uint8_t *wire,
 			memcpy(rd, wire + *pos, rchunk);
 			rd += rchunk;
 			*pos += rchunk;
-			break;
 		} else {
 			//NAPTR
 			assert(knot_rrset_type(rr) == KNOT_RRTYPE_NAPTR);
diff --git a/src/libknot/packet/query.c b/src/libknot/packet/query.c
index 8f4cf1881..84b04c91d 100644
--- a/src/libknot/packet/query.c
+++ b/src/libknot/packet/query.c
@@ -21,74 +21,6 @@
 
 /*----------------------------------------------------------------------------*/
 
-int knot_query_rr_to_wire(const knot_rrset_t *rrset, const knot_rdata_t *rdata,
-			  uint8_t **wire, uint8_t *endp)
-{
-	/* Store owner. */
-	knot_dname_t *owner = rrset->owner;
-	if (*wire + owner->size > endp) {
-		return KNOT_ENOMEM;
-	}
-	memcpy(*wire, owner->name, owner->size);
-	*wire += owner->size;
-
-	if (*wire + 10 > endp) {
-		return KNOT_ENOMEM;
-	}
-
-	/* Write RR header. */
-	knot_wire_write_u16(*wire, rrset->type); *wire += 2;
-	knot_wire_write_u16(*wire, rrset->rclass); *wire += 2;
-	knot_wire_write_u32(*wire, rrset->ttl); *wire += 4;
-	knot_wire_write_u16(*wire, 0); *wire += 2; /* RDLENGTH reserve. */
-	uint8_t *rdlength_p = *wire - 2;
-	uint16_t rdlength = 0;
-
-	/* Write data. */
-	knot_dname_t *dname = 0;
-	uint16_t *raw_data = 0;
-	knot_rrtype_descriptor_t *desc =
-		knot_rrtype_descriptor_by_type(rrset->type);
-
-	for (int i = 0; i < rdata->count; ++i) {
-		switch (desc->wireformat[i]) {
-		case KNOT_RDATA_WF_COMPRESSED_DNAME:
-		case KNOT_RDATA_WF_UNCOMPRESSED_DNAME:
-		case KNOT_RDATA_WF_LITERAL_DNAME:
-
-			/* Check space for dname. */
-			dname = knot_rdata_item(rdata, i)->dname;
-			if (*wire + dname->size > endp) {
-				return KNOT_ESPACE;
-			}
-
-			/* Save domain name. */
-			memcpy(*wire, dname->name, dname->size);
-			*wire += dname->size;
-			rdlength += dname->size;
-			break;
-		default:
-			raw_data = knot_rdata_item(rdata, i)->raw_data;
-			if (*wire + raw_data[0] > endp) {
-				return KNOT_ESPACE;
-			}
-
-			/* Copy data. */
-			memcpy(*wire, raw_data + 1, raw_data[0]);
-			*wire += raw_data[0];
-			rdlength += raw_data[0];
-			break;
-
-		}
-	}
-
-	/* Store rdlength. */
-	knot_wire_write_u16(rdlength_p, rdlength);
-
-	return KNOT_EOK;
-}
-/*----------------------------------------------------------------------------*/
-
 int knot_query_dnssec_requested(const knot_packet_t *query)
 {
 	if (query == NULL) {
@@ -211,14 +143,9 @@ int knot_query_add_rrset_authority(knot_packet_t *query,
 	/* Reserve space for TSIG RR */
 	endp -= query->tsig_size;
 	
-	uint8_t *pos = startp;
-
-	const knot_rdata_t *rdata = 0;
-	while ((rdata = knot_rrset_rdata_next(rrset, rdata))) {
-		knot_query_rr_to_wire(rrset, rdata, &pos, endp);
-	}
-
-	size_t written = (pos - startp);
+	size_t written = 0;
+	int rr_count = 0;
+	knot_rrset_to_wire(rrset, startp, &written, &rr_count);
 	query->size += written;
 	++query->ns_rrsets;
 	++query->header.nscount;
diff --git a/src/libknot/packet/query.h b/src/libknot/packet/query.h
index 3ca4fd31d..4a5a2f0db 100644
--- a/src/libknot/packet/query.h
+++ b/src/libknot/packet/query.h
@@ -81,9 +81,8 @@ int knot_query_set_opcode(knot_packet_t *query, uint8_t opcode);
 int knot_query_add_rrset_authority(knot_packet_t *query,
                                    const knot_rrset_t *rrset);
 
-int knot_query_rr_to_wire(const knot_rrset_t *rrset, const knot_rdata_t *rdata,
-			  uint8_t **wire, uint8_t *endp);
-
+int knot_query_rr_to_wire(const knot_rrset_t *rrset, size_t rid,
+                          uint8_t **wire, uint8_t *endp);
 #endif /* _KNOT_QUERY_H_ */
 
 /*! @} */
diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h
index efef9c816..aefb97db3 100644
--- a/src/libknot/rrset.h
+++ b/src/libknot/rrset.h
@@ -250,6 +250,7 @@ knot_rrset_t *knot_rrset_get_rrsigs(knot_rrset_t *rrset);
 
 int knot_rrset_compare_rdata(const knot_rrset_t *r1, const knot_rrset_t *r2);
 
+/*! \todo Should support (optional) dname compression. */
 int knot_rrset_to_wire(const knot_rrset_t *rrset, uint8_t *wire, size_t *size,
                        int *rr_count);
 
-- 
GitLab