]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
totally untested rr compare function
authorMiek Gieben <miekg@NLnetLabs.nl>
Thu, 24 Feb 2005 12:05:10 +0000 (12:05 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Thu, 24 Feb 2005 12:05:10 +0000 (12:05 +0000)
rr_uncompressed_size added
LDNS_SECTION_ANY added. Not sure if we want to keep that

ldns/packet.h
ldns/rr.h
packet.c
rr.c

index 9c007d9a38788e93bc7ecb4107d120a8afeb933c..02d73e9538a85591dc60b2137ca3f9bf57d005a9 100644 (file)
@@ -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;   
 
index b241c4c1f32c4be80c27ee132771728710689196..8c84ea38cc63d28ca94f9a4c1eb0903ce56571a7 100644 (file)
--- a/ldns/rr.h
+++ b/ldns/rr.h
 #include <ldns/rr.h>
 #include <ldns/error.h>
 
+/** 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 */
index 3c0fb99548da3b333e51c7d400a4ed32a958f451..e011ba49ac730ee7bda04e76c6934d8115354929 100644 (file)
--- 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 71a6c0ab73446808e7fac5ccea860923df437e73..b7e5dbeb6348d08b1a2b3bbd2390a0f084105dd2 100644 (file)
--- 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;
+}