diff --git a/src/dnslib/packet.c b/src/dnslib/packet.c index 4195beacf5a0a9a0a51f04f12412154160799cc7..fd6441bfe2905b408518d12084fca72960e900bb 100644 --- a/src/dnslib/packet.c +++ b/src/dnslib/packet.c @@ -675,7 +675,6 @@ dnslib_packet_t *dnslib_packet_new(dnslib_packet_prealloc_type_t prealloc) int dnslib_packet_parse_from_wire(dnslib_packet_t *packet, uint8_t *wireformat, size_t size, int question_only) { - /*! \todo Implement! */ if (packet == NULL || wireformat == NULL) { return DNSLIB_EBADARG; } @@ -819,7 +818,8 @@ const dnslib_rrset_t *dnslib_packet_additional_rrset( /*----------------------------------------------------------------------------*/ int dnslib_packet_contains(const dnslib_packet_t *packet, - const dnslib_rrset_t *rrset) + const dnslib_rrset_t *rrset, + dnslib_rrset_compare_type_t cmp) { for (int i = 0; i < packet->header.ancount; ++i) { if (packet->answer[i] == rrset) { diff --git a/src/dnslib/packet.h b/src/dnslib/packet.h index 5f645ea1a7c3fd166c913e6962062bab2b6de59c..70084385575d44cdd027c91b1837651021038173 100644 --- a/src/dnslib/packet.h +++ b/src/dnslib/packet.h @@ -185,8 +185,6 @@ uint16_t dnslib_packet_qtype(const dnslib_packet_t *packet); */ uint16_t dnslib_packet_qclass(const dnslib_packet_t *packet); -//int dnslib_packet_add_rrset_answer(dnslib_packet_t *packet); - /*! * \brief Returns number of RRSets in Answer section of the packet. * diff --git a/src/dnslib/rrset.c b/src/dnslib/rrset.c index 9959d7624e73bdf64d32d638a77ded970eecca87..70dbf38e2055f50fadc95e5670d4bccbe661a377 100644 --- a/src/dnslib/rrset.c +++ b/src/dnslib/rrset.c @@ -140,12 +140,32 @@ const dnslib_rrset_t *dnslib_rrset_rrsigs(const dnslib_rrset_t *rrset) /*----------------------------------------------------------------------------*/ -int dnslib_rrset_compare_no_rdata(const dnslib_rrset_t *r1, - const dnslib_rrset_t *r2) +int dnslib_rrset_compare(const dnslib_rrset_t *r1, + const dnslib_rrset_t *r2, + dnslib_rrset_compare_type_t cmp) { - return ((r1->rclass == r2->rclass) - && (r1->type == r2->type) - && dnslib_dname_compare(r1->owner, r2->owner) == 0); + if (cmp == DNSLIB_RRSET_COMPARE_PTR) { + return (r1 == r2); + } + + int res = ((r1->rclass == r2->rclass) + && (r1->type == r2->type) + && dnslib_dname_compare(r1->owner, r2->owner) == 0); + + if (cmp == DNSLIB_RRSET_COMPARE_WHOLE && res) { + dnslib_rrtype_descriptor_t *desc = + dnslib_rrtype_descriptor_by_type(r1->type); + + if (desc == NULL) { + return 0; + } + + /*! @todo Implement RDATA comparation */ + res = res && dnslib_rdata_compare(r1->rdata, r2->rdata, + desc->wireformat); + } + + return res; } /*----------------------------------------------------------------------------*/ diff --git a/src/dnslib/rrset.h b/src/dnslib/rrset.h index 9748d8e8daa69a510917f9537995fee1694da7e1..5f4b465919fd2bf918f26b70874f408b58faf48d 100644 --- a/src/dnslib/rrset.h +++ b/src/dnslib/rrset.h @@ -46,6 +46,14 @@ struct dnslib_rrset { typedef struct dnslib_rrset dnslib_rrset_t; +/*----------------------------------------------------------------------------*/ + +typedef enum { + DNSLIB_RRSET_COMPARE_PTR, + DNSLIB_RRSET_COMPARE_HEADER, + DNSLIB_RRSET_COMPARE_WHOLE +} dnslib_rrset_compare_type_t; + /*----------------------------------------------------------------------------*/ /*! * \brief Creates a new RRSet with the given properties. @@ -167,8 +175,9 @@ dnslib_rdata_t *dnslib_rrset_get_rdata(dnslib_rrset_t *rrset); */ const dnslib_rrset_t *dnslib_rrset_rrsigs(const dnslib_rrset_t *rrset); -int dnslib_rrset_compare_no_rdata(const dnslib_rrset_t *r1, - const dnslib_rrset_t *r2); +int dnslib_rrset_compare(const dnslib_rrset_t *r1, + const dnslib_rrset_t *r2, + dnslib_rrset_compare_type_t cmp); /*! * \brief Destroys the RRSet structure. diff --git a/src/knot/server/name-server.h b/src/knot/server/name-server.h index ad888f02f702a8d4a2bf22f4bfb9046845a6fd49..0a8ecb0c8d22bb8db09226a64a0a26b8c10d204f 100644 --- a/src/knot/server/name-server.h +++ b/src/knot/server/name-server.h @@ -170,7 +170,6 @@ int ns_answer_normal(ns_nameserver_t *nameserver, dnslib_response_t *resp, * \retval KNOT_ENOMEM * \retval KNOT_ERROR * - * \todo Implement. * \todo Maybe the place for the wire format should be passed in as in * the ns_answer_request() function...? */