]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
moved stuff to dname.c
authorMiek Gieben <miekg@NLnetLabs.nl>
Tue, 15 Feb 2005 10:18:48 +0000 (10:18 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Tue, 15 Feb 2005 10:18:48 +0000 (10:18 +0000)
added ldns/dname.h
updated Makefile
Added LDNS_ROOT_LABEL define

Makefile.in
dname.c [new file with mode: 0644]
ldns/dns.h
ldns/rdata.h
rdata.c
run-test1.c
str2host.c

index 02b986fb95e3722fa0da1391b9f3f83776eddc91..d3b959f315f1af4360f6516adcd470959917f4f0 100644 (file)
@@ -23,7 +23,7 @@ LINTFLAGS     = +quiet -weak -warnposix -unrecog -Din_addr_t=uint32_t -Du_int=unsign
 
 LIBDNS_SOURCES =       rdata.c util.c rr.c packet.c wire2host.c \
                        host2str.c buffer.c str2host.c resolver.c \
-                       net.c host2wire.c
+                       net.c host2wire.c dname.c
 LIBDNS_HEADERS =       ldns/error.h            \
                        ldns/packet.h           \
                        ldns/prototype.h        \
@@ -36,6 +36,7 @@ LIBDNS_HEADERS        =       ldns/error.h            \
                        ldns/buffer.h           \
                        ldns/resolver.h         \
                        ldns/net.h              \
+                       ldns/dname.h            \
                        util.h
 LIBDNS_OBJECTS =       $(LIBDNS_SOURCES:.c=.o)
 
diff --git a/dname.c b/dname.c
new file mode 100644 (file)
index 0000000..ec33477
--- /dev/null
+++ b/dname.c
@@ -0,0 +1,114 @@
+/*
+ * dname.c
+ *
+ * dname specific rdata implementations
+ * A dname is a rdf structure with type LDNS_RDF_TYPE_DNAME
+ *
+ * a Net::DNS like library for C
+ *
+ * (c) NLnet Labs, 2004
+ *
+ * See the file LICENSE for the license
+ */
+
+#include <config.h>
+
+#include <ldns/rdata.h>
+#include <ldns/error.h>
+#include <ldns/str2host.h>
+#include <ldns/dns.h>
+
+#include "util.h"
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+
+/**
+ * concatenate two dnames together
+ * \param[in] rd1 the leftside
+ * \param[in] rd2 the rightside
+ * \return a new rdf with leftside/rightside
+ */
+ldns_rdf *
+ldns_dname_concat(ldns_rdf *rd1, ldns_rdf *rd2)
+{
+       ldns_rdf *new;
+       uint16_t new_size;
+       uint8_t *buf;
+
+       if (ldns_rdf_get_type(rd1) != LDNS_RDF_TYPE_DNAME ||
+                       ldns_rdf_get_type(rd2) != LDNS_RDF_TYPE_DNAME)
+       {
+               return NULL;
+       }
+
+       /* we overwrite the nullbyte of rd1 */
+       new_size = ldns_rdf_size(rd1) + ldns_rdf_size(rd2) - 1;
+       buf = XMALLOC(uint8_t*, new_size);
+       if (!buf) {
+               return NULL;
+       }
+
+       /* put the two dname's after each other */
+       memcpy(buf, ldns_rdf_data(rd1), ldns_rdf_size(rd1) - 1);
+       memcpy(buf + ldns_rdf_size(rd1),
+                       ldns_rdf_data(rd2), ldns_rdf_size(rd2));
+       
+       new = ldns_rdf_new_frm_data(new_size, LDNS_RDF_TYPE_DNAME,
+                       buf);
+
+       FREE(buf);
+       return new;
+}
+
+/**
+ * count the number of labels inside a LDNS_RDF_DNAME type
+ * rdf
+ * \param[in] *r the rdf
+ * \return the number of labels
+ */     
+uint8_t         
+ldns_rdf_dname_label_count(ldns_rdf *r)
+{       
+        uint8_t src_pos;
+        uint8_t len;
+        uint8_t i;
+        size_t r_size;
+
+        i = 0; src_pos = 0;
+        r_size = ldns_rdf_size(r);
+
+        if (ldns_rdf_get_type(r) != LDNS_RDF_TYPE_DNAME) {
+                return 0;
+        } else {
+                len = ldns_rdf_data(r)[src_pos]; /* start of the label */
+
+                /* single root label */
+                if (1 == r_size) {
+                        return 0; 
+                } else {
+                        while ((len > 0) && src_pos < r_size) {
+                                src_pos++;
+                                src_pos += len;
+                                len = ldns_rdf_data(r)[src_pos];
+                                i++;
+                        }
+                }
+                return i;
+        }
+}
+
+/**
+ * Create a new dname rdf from a string
+ * \param[in] str string to use
+ * \param[in] t   type to use
+ * \return ldns_rdf*
+ */
+ldns_rdf *
+ldns_dname_new_frm_str(const char *str)
+{
+       return 
+               ldns_rdf_new_frm_str(str, LDNS_RDF_TYPE_DNAME);
+}
index 64e6ea9b9050d7ee528253bc405aa9932e5ffbf5..b8eafd541cb5c34fc6460cc393171896356a21e5 100644 (file)
@@ -14,5 +14,6 @@
 #define LDNS_IP4ADDRLEN      (32/8)
 #define LDNS_IP6ADDRLEN      (128/8)
 #define LDNS_PORT      53
+#define LDNS_ROOT_LABEL        '\0'
 
 #endif /* _DNS_H_ */
index e69ed58b33c1c70506e441e3844a3110d16af3b1..2ec5d2d7b6ff35ee736be1ad529f9aefa9bb35a7 100644 (file)
@@ -105,7 +105,5 @@ void            ldns_rdf_free_data(ldns_rdf *);
 ldns_rdf       *ldns_rdf_new_frm_str(const char *, ldns_rdf_type);
 struct sockaddr_storage * ldns_rdf2native_sockaddr_storage(ldns_rdf *);
 ldns_rdf       *ldns_rdf_clone(ldns_rdf *);
-uint8_t        ldns_rdf_dname_label_count(ldns_rdf *);
-bool           ldns_rdf_dname_absolute(ldns_rdf *);
 
 #endif /* !_LDNS_RDATA_H */
diff --git a/rdata.c b/rdata.c
index 321b42db229398308f9a9aa2173a4ead20c7dc05..f0be8b38d5114d59c4040399c3b6f412dc57982d 100644 (file)
--- a/rdata.c
+++ b/rdata.c
@@ -228,43 +228,6 @@ ldns_rdf_clone(ldns_rdf *r)
                                ldns_rdf_data(r)));
 }
 
-/**
- * count the number of labels inside a LDNS_RDF_DNAME type
- * rdf
- * \param[in] *r the rdf
- * \return the number of labels
- */
-uint8_t
-ldns_rdf_dname_label_count(ldns_rdf *r)
-{
-       uint8_t src_pos;
-        uint8_t len;
-       uint8_t i;
-       size_t r_size;
-
-       i = 0; src_pos = 0;
-       r_size = ldns_rdf_size(r);
-
-       if (ldns_rdf_get_type(r) != LDNS_RDF_TYPE_DNAME) {
-               return 0;
-       } else {
-               len = ldns_rdf_data(r)[src_pos]; /* start of the label */
-
-               /* single root label */
-               if (1 == r_size) {
-                       return 0;
-               } else {
-                       while ((len > 0) && src_pos < r_size) {
-                               src_pos++;
-                               src_pos += len;
-                               len = ldns_rdf_data(r)[src_pos];
-                               i++;
-                       }
-               }
-               return i;
-       }
-}
-
 /**
  * free a rdf structure _and_ free the
  * data. rdf should be created with _new_frm_data
index e45025ccba6764df9e6028fc038f0355c86d767f..fe2b014f8378c2ad9de240fbc6e5ba541c66e427 100644 (file)
@@ -8,6 +8,7 @@
 #include <ldns/str2host.h>
 #include <ldns/host2str.h>
 #include <ldns/buffer.h>
+#include <ldns/dname.h>
 
 #include "util.h"
 
@@ -34,6 +35,9 @@ doit(void)
        ldns_buffer *buf;
        ldns_rdf *rdata;
        ldns_rdf *cnt_test;
+       ldns_rdf *cat_test1;
+       ldns_rdf *cat_test2;
+       ldns_rdf *concat;
 
        buf = ldns_buffer_new(10); /* alloc away! */
        if (!buf) {
@@ -49,26 +53,31 @@ doit(void)
        fprintf(stderr, "%s\n", buffer2str(buf));
 
        /* test the label counter */
-       cnt_test = ldns_rdf_new_frm_str("miek.nl.", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str("miek.nl.");
        printf("Labels miek.nl. %d\n", ldns_rdf_dname_label_count(cnt_test));
 
-       cnt_test = ldns_rdf_new_frm_str("miek.nl", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str("miek.nl");
        printf("Labels miek.nl %d\n", ldns_rdf_dname_label_count(cnt_test));
        
-       cnt_test = ldns_rdf_new_frm_str("miek", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str("miek");
        printf("Labels miek %d\n", ldns_rdf_dname_label_count(cnt_test));
        
-       cnt_test = ldns_rdf_new_frm_str(".", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str(".");
        printf("Labels . %d\n", ldns_rdf_dname_label_count(cnt_test));
        
-       cnt_test = ldns_rdf_new_frm_str(".www.miek.nl.", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str(".www.miek.nl.");
        printf("Labels .www.miek.nl. %d\n", ldns_rdf_dname_label_count(cnt_test));
 
-       cnt_test = ldns_rdf_new_frm_str("www.miek.nl.", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str("www.miek.nl.");
        printf("Labels www.miek.nl. %d\n", ldns_rdf_dname_label_count(cnt_test));
 
-       cnt_test = ldns_rdf_new_frm_str("nl", LDNS_RDF_TYPE_DNAME);
+       cnt_test = ldns_dname_new_frm_str("nl");
        printf("Labels nl %d\n", ldns_rdf_dname_label_count(cnt_test));
+
+
+       /* concat tests */
+       cat_test1 = ldns_dname_new_frm_str("www");
+       cat_test2 = ldns_dname_new_frm_str("miek.nl.");
 }
 
 
index 10966050af372be439636b34861bf6968f7c9c14..159c6217965fc1f34ec2bacec968649402f82e1b 100644 (file)
@@ -142,7 +142,6 @@ ldns_str2rdf_int8(ldns_rdf **rd, const uint8_t *bytestr)
  * \todo make this more efficient...
  * we do 3 memcpy's in total...
  * label_chars2 is used for debugging. TODO: remove
- * \todo DOES IT WORK...
  */
 ldns_status
 ldns_str2rdf_dname(ldns_rdf **d, const uint8_t* str)
@@ -174,10 +173,10 @@ ldns_str2rdf_dname(ldns_rdf **d, const uint8_t* str)
                        return LDNS_STATUS_DOMAINNAME_OVERFLOW;
                }
                buf_str[len] = (uint8_t)'.';
-               buf_str[len + 1] = (uint8_t)'\0';
+               buf_str[len + 1] = (uint8_t) LDNS_ROOT_LABEL;
                len += 1;
        } else {
-               buf_str[len] = (uint8_t)'\0'; 
+               buf_str[len] = (uint8_t) LDNS_ROOT_LABEL;
        }
        
        /* extend with 1 - the first char will be the
@@ -212,7 +211,7 @@ ldns_str2rdf_dname(ldns_rdf **d, const uint8_t* str)
        /* DEBUG memcpy(q, &label_chars2, 1); */
        memcpy(q + 1, p, label_chars); 
        q += (label_chars + 1);
-       *q = (uint8_t)'\0'; /* end the string */
+       *q = (uint8_t)LDNS_ROOT_LABEL; /* end the string */
 
        /* s - buf_str works because no magic is done in the above for-loop */
        /* *d = ldns_rdf_new_frm_data((s - buf_str + 2) , LDNS_RDF_TYPE_DNAME , buf); */