]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
added ldns_rdf_label_count, updated test1. Added some resolver function headers
authorMiek Gieben <miekg@NLnetLabs.nl>
Mon, 14 Feb 2005 13:53:50 +0000 (13:53 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Mon, 14 Feb 2005 13:53:50 +0000 (13:53 +0000)
doc/tutorial [new file with mode: 0644]
host2str.c
ldns/rdata.h
ldns/resolver.h
net.c
rdata.c
resolver.c
run-test1.c

diff --git a/doc/tutorial b/doc/tutorial
new file mode 100644 (file)
index 0000000..9ae1012
--- /dev/null
@@ -0,0 +1,5 @@
+ldns tutorial
+
+
+In this tutorial we will explain how to make a simple application with
+ldns.
index da5cc7774abc45a2a5d6e82bcec77c3708edc404..16f8c6cafe4281939a77b66d20e4152d2eeb70b4 100644 (file)
@@ -92,6 +92,7 @@ ldns_rdf2buffer_str_dname(ldns_buffer *output, ldns_rdf *dname)
        if (1 == ldns_rdf_size(dname)) {
                ldns_buffer_printf(output, ".", 2);
        } else {
+               /* XXX repeated calls to ldns_rdf_size */
                while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
                        src_pos++;
                        ldns_buffer_write(output, &data[src_pos], len);
index dac4ac27b8f01bc4bf70946e53cd71c8c9c03942..6cc6674993d19091a44eda9c20f8102ed83557b2 100644 (file)
@@ -102,5 +102,6 @@ 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_label_count(ldns_rdf *);
 
 #endif /* !_LDNS_RDATA_H */
index 11f254a8778f568b35b9858a801afc90e9c862cf..e182c34878c93c724b9f7ff3ba2fde05d23f49a3 100644 (file)
@@ -58,6 +58,10 @@ struct ldns_struct_resolver
        bool _ip6;
        /** \brief 1 if the resolver is properly configured */
        uint8_t _configured;
+       /** \brief if true append the default domain */
+       bool _defnames;
+       /** \brief if true apply the search list */
+       bool _dnsrch;
 };
 typedef struct ldns_struct_resolver ldns_resolver;
 
diff --git a/net.c b/net.c
index b4f698072d10542daa14289bf7783714c9054aca..222dfb873d85b919f0ab8eb08f02dda39e729bad 100644 (file)
--- a/net.c
+++ b/net.c
@@ -43,6 +43,39 @@ ldns_sendbuf_axfr(ldns_buffer *buf, int *sockfd, struct sockaddr *dest)
 }
 #endif 
 
+/** 
+ * Send a packet to the nameserver. If the name is 0 or 1 dot(s)
+ * try it as-is. Otherwise apply the search list
+ * \param[in] resolver to use 
+ * \param[in] query to send
+ * \return the pkt received from the nameserver
+ */
+ldns_pkt *
+ldns_search(ldns_resolver *r, ldns_pkt *q_pkt)
+{
+       /* see _ldns_query, check the result
+        * of the query to see if a new query
+        * is needed.
+        */
+       return NULL;
+}
+
+/** 
+ * Send a packet to the nameserver. If the name have no dots
+ * and defnames is true, the default domain is appended.
+ * \param[in] resolver to use 
+ * \param[in] query to send
+ * \return the pkt received from the nameserver
+ */
+ldns_pkt *
+ldns_query(ldns_resolver *r, ldns_pkt *q_pkt)
+{
+       /* unpack the query, check the name and re-assemble the
+        * query
+        */
+       return NULL;
+}
+
 /**
  * Send to ptk to the nameserver at ipnumber. Return the data
  * as a ldns_pkt
diff --git a/rdata.c b/rdata.c
index 792e158549c4464850c017cfd71ed5faf22feec7..f0af51c094c63585511ab957b6ef94e4fdf66b85 100644 (file)
--- a/rdata.c
+++ b/rdata.c
@@ -222,20 +222,47 @@ ldns_rdf_new_frm_data(uint16_t s, ldns_rdf_type t, void *buf)
 ldns_rdf *
 ldns_rdf_clone(ldns_rdf *r)
 {
-       ldns_rdf *rd;
-       rd = MALLOC(ldns_rdf);
-       if (!rd) {
-               return NULL;
-       }
+       return (ldns_rdf_new_frm_data(
+                               ldns_rdf_size(r), 
+                               ldns_rdf_get_type(r),
+                               ldns_rdf_data(r)));
+}
 
-       rd->_data = XMALLOC(uint8_t, ldns_rdf_size(r));
-       if (!rd->_data) {
-               return NULL;
+/**
+ * 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_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 1;
+               } else {
+                       while ((len > 0) && src_pos < r_size) {
+                               src_pos++;
+                               src_pos += len;
+                               len = ldns_rdf_data(r)[src_pos];
+                               i++;
+                       }
+               }
+               return i;
        }
-       ldns_rdf_set_size(rd, ldns_rdf_size(r));
-       ldns_rdf_set_type(rd, ldns_rdf_get_type(r));
-       memcpy(rd->_data, ldns_rdf_data(r), ldns_rdf_size(r));
-       return rd;
 }
 
 /**
index 427d76c636d76674484e4f6c9e559c5bb663da2c..ebba586ce2637ffc66f00a24285ab1382d23ef45 100644 (file)
@@ -52,6 +52,18 @@ ldns_resolver_debug(ldns_resolver *r)
        return r->_debug;
 }
 
+bool
+ldns_resolver_dnsrch(ldns_resolver *r)
+{
+       return r->_dnsrch;
+}
+
+bool
+ldns_resolver_defnames(ldns_resolver *r)
+{
+       return r->_defnames;
+}
+
 uint8_t 
 ldns_resolver_configured(ldns_resolver *r)
 {
@@ -188,6 +200,18 @@ ldns_resolver_set_nameserver_count(ldns_resolver *r, size_t c)
        r->_nameserver_count = c;
 }
 
+void
+ldns_resolver_set_dnsrch(ldns_resolver *r, bool d)
+{
+       r->_dnsrch = d;
+}
+
+void
+ldns_resolver_set_defnames(ldns_resolver *r, bool d)
+{
+       r->_defnames = d;
+}
+
 void
 ldns_resolver_incr_nameserver_count(ldns_resolver *r)
 {
@@ -204,7 +228,6 @@ ldns_resolver_set_domain(ldns_resolver *r, ldns_rdf *d)
        return LDNS_STATUS_OK;
 }
 
-/* this is not the way to go for the search list XXX */
 ldns_status
 ldns_resolver_push_searchlist(ldns_resolver *r, ldns_rdf *d)
 {
index 578b7b69c79265c5d6b8f304d1374f534ae5558a..11f63bb30d34b88b645c263d0bdc55187820086f 100644 (file)
@@ -33,6 +33,7 @@ doit(void)
 {
        ldns_buffer *buf;
        ldns_rdf *rdata;
+       ldns_rdf *cnt_test;
 
        buf = ldns_buffer_new(10); /* alloc away! */
        if (!buf) {
@@ -46,6 +47,22 @@ doit(void)
        
        (void) ldns_rdf2buffer_str_int16(buf, rdata); 
        fprintf(stderr, "%s\n", buffer2str(buf));
+
+       /* test the label counter */
+       cnt_test = ldns_rdf_new_frm_str("miek.nl.", LDNS_RDF_TYPE_DNAME);
+       printf("Labels miek.nl. %d\n", ldns_rdf_label_count(cnt_test));
+
+       cnt_test = ldns_rdf_new_frm_str("miek.nl", LDNS_RDF_TYPE_DNAME);
+       printf("Labels miek.nl %d\n", ldns_rdf_label_count(cnt_test));
+       
+       cnt_test = ldns_rdf_new_frm_str("miek", LDNS_RDF_TYPE_DNAME);
+       printf("Labels miek %d\n", ldns_rdf_label_count(cnt_test));
+       
+       cnt_test = ldns_rdf_new_frm_str(".", LDNS_RDF_TYPE_DNAME);
+       printf("Labels . %d\n", ldns_rdf_label_count(cnt_test));
+       
+       cnt_test = ldns_rdf_new_frm_str(".www.miek.nl.", LDNS_RDF_TYPE_DNAME);
+       printf("Labels .www.miek.nl. %d\n", ldns_rdf_label_count(cnt_test));
 }