diff options
Diffstat (limited to 'src/libknot/packet/query.c')
-rw-r--r-- | src/libknot/packet/query.c | 89 |
1 files changed, 9 insertions, 80 deletions
diff --git a/src/libknot/packet/query.c b/src/libknot/packet/query.c index 8f4cf18..4bededc 100644 --- a/src/libknot/packet/query.c +++ b/src/libknot/packet/query.c @@ -14,6 +14,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <config.h> #include <stdlib.h> #include "packet/query.h" #include "util/wire.h" @@ -21,74 +22,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) { @@ -153,9 +86,7 @@ int knot_query_set_question(knot_packet_t *query, query->header.qdcount = 1; // convert the Question to wire format right away - knot_packet_question_to_wire(query); - - return KNOT_EOK; + return knot_packet_question_to_wire(query); } /*----------------------------------------------------------------------------*/ @@ -203,26 +134,24 @@ int knot_query_add_rrset_authority(knot_packet_t *query, /* Write to wire. */ uint8_t *startp = query->wireformat + query->size; uint8_t *endp = query->wireformat + query->max_size; - + assert(endp - startp > query->opt_rr.size + query->tsig_size); // reserve space for OPT RR /*! \todo Why here??? */ endp -= query->opt_rr.size; /* 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 = 0; + uint16_t rr_count = 0; + int ret = knot_rrset_to_wire(rrset, startp, &written, query->max_size, + &rr_count, NULL); + if (ret != KNOT_EOK) { + return ret; } - - size_t written = (pos - startp); query->size += written; ++query->ns_rrsets; ++query->header.nscount; return KNOT_EOK; } - |