From: Miek Gieben Date: Thu, 24 Feb 2005 12:05:10 +0000 (+0000) Subject: totally untested rr compare function X-Git-Tag: release-0.50~382 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bfc751255d79d4d4733688a146206fa594df38cf;p=thirdparty%2Fldns.git totally untested rr compare function rr_uncompressed_size added LDNS_SECTION_ANY added. Not sure if we want to keep that --- diff --git a/ldns/packet.h b/ldns/packet.h index 9c007d9a..02d73e95 100644 --- a/ldns/packet.h +++ b/ldns/packet.h @@ -92,7 +92,8 @@ enum ldns_enum_pkt_section { LDNS_SECTION_QUESTION = 0, LDNS_SECTION_ANSWER = 1, LDNS_SECTION_AUTHORITY = 2, - LDNS_SECTION_ADDITIONAL = 3 + LDNS_SECTION_ADDITIONAL = 3, + LDNS_SECTION_ANY = 4 /* bogus section, if not interested */ }; typedef enum ldns_enum_pkt_section ldns_pkt_section; diff --git a/ldns/rr.h b/ldns/rr.h index b241c4c1..8c84ea38 100644 --- a/ldns/rr.h +++ b/ldns/rr.h @@ -18,6 +18,16 @@ #include #include +/** Maximum length of a dname label */ +#define MAX_LABELLEN 63 +/** Maximum length of a complete dname */ +#define MAX_DOMAINLEN 255 +/** Maximum number of pointers in 1 dname */ +#define MAX_POINTERS 65535 +/** The bytes TTL, CLASS and length use up in an rr */ +#define RR_OVERHEAD 10 + + /** * \brief The different RR classes. */ @@ -167,13 +177,6 @@ enum ldns_enum_rr_type }; typedef enum ldns_enum_rr_type ldns_rr_type; -/** Maximum length of a dname label */ -#define MAX_LABELLEN 63 -/** Maximum length of a complete dname */ -#define MAX_DOMAINLEN 255 -/** Maximum number of pointers in 1 dname */ -#define MAX_POINTERS 65535 - /** * \brief Resource Record type * @@ -262,6 +265,10 @@ size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *); ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *, size_t); ldns_rr_type ldns_rr_get_type_by_name(char *); ldns_rr_class ldns_get_class_by_name(char *); +size_t ldns_rr_uncompressed_size(ldns_rr *); +int ldns_rr_compare(ldns_rr *, ldns_rr *); +ldns_status ldns_rr_sort(ldns_rr_list **); + #endif /* _LDNS_RR_H */ diff --git a/packet.c b/packet.c index 3c0fb995..e011ba49 100644 --- a/packet.c +++ b/packet.c @@ -168,6 +168,8 @@ ldns_pkt_xxcount(ldns_pkt *packet, ldns_pkt_section s) return ldns_pkt_nscount(packet); case LDNS_SECTION_ADDITIONAL: return ldns_pkt_arcount(packet); + case LDNS_SECTION_ANY: + return 0; } return 0; } @@ -184,6 +186,8 @@ ldns_pkt_xxsection(ldns_pkt *packet, ldns_pkt_section s) return ldns_pkt_authority(packet); case LDNS_SECTION_ADDITIONAL: return ldns_pkt_additional(packet); + case LDNS_SECTION_ANY: + return 0; } return NULL; } @@ -315,6 +319,8 @@ ldns_pkt_set_xxcount(ldns_pkt *packet, ldns_pkt_section s, uint16_t count) case LDNS_SECTION_ADDITIONAL: ldns_pkt_set_arcount(packet, count); break; + case LDNS_SECTION_ANY: + break; } } @@ -353,6 +359,8 @@ ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr) case LDNS_SECTION_ADDITIONAL: ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) + 1); break; + case LDNS_SECTION_ANY: + break; } return true; } diff --git a/rr.c b/rr.c index 71a6c0ab..b7e5dbeb 100644 --- a/rr.c +++ b/rr.c @@ -613,3 +613,89 @@ ldns_get_class_by_name(char *name) } return 0; } + +/** + * sort an rr_list. the sorting is done inband + * \param[in] unsorted the rr_list to be sorted + * \return ldns_status wether or not we are succesfull + */ +ldns_status +ldns_rr_sort(ldns_rr_list **unsorted) +{ + return LDNS_STATUS_OK; +} + + +/** + * Compare two rr + * \param[in] rr1 the first one + * \parma[in] rr2 the second one + * \return 0 if equal + * -1 if rr1 comes before rr2 + * +1 if rr2 comes before rr1 + */ +int +ldns_rr_compare(ldns_rr *rr1, ldns_rr *rr2) +{ + ldns_buffer *rr1_buf; + ldns_buffer *rr2_buf; + size_t rr1_len; + size_t rr2_len; + size_t i; + + rr1_len = ldns_rr_uncompressed_size(rr1); + rr2_len = ldns_rr_uncompressed_size(rr2); + + if (rr1_len < rr2_len) { + return -1; + } else if (rr1_len > rr2_len) { + return +1; + } else { + /* equal length */ + + rr1_buf = ldns_buffer_new(rr1_len); + rr2_buf = ldns_buffer_new(rr2_len); + + if (ldns_rr2buffer_wire(rr1_buf, rr1, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { + return 0; /* XXX uhm, tja */ + } + if (ldns_rr2buffer_wire(rr2_buf, rr2, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { + return 0; + } + /* now compare the buffer's byte for byte */ + /* < or <= ??? XXX */ + for(i = 0; i < rr1_len; i++) { + if (ldns_buffer_at(rr1_buf, i) < + ldns_buffer_at(rr2_buf, i)) { + return -1; + } else if (ldns_buffer_at(rr1_buf, i) > + ldns_buffer_at(rr2_buf, i)) { + return +1; + } + } + return 0; + } +} + + +/** + * calculate the uncompressed size of an RR + * \param[in] rr the rr to operate on + * \return size of the rr + */ +size_t +ldns_rr_uncompressed_size(ldns_rr *r) +{ + size_t rrsize; + uint16_t i; + + rrsize = 0; + /* add all the rdf sizes */ + for(i = 0; i < ldns_rr_rd_count(r); i++) { + rrsize += ldns_rdf_size(ldns_rr_rdf(r, i)); + } + /* ownername */ + rrsize += ldns_rdf_size(ldns_rr_owner(r)); + rrsize += RR_OVERHEAD; + return rrsize; +}