From: Miek Gieben Date: Mon, 14 Feb 2005 13:53:50 +0000 (+0000) Subject: added ldns_rdf_label_count, updated test1. Added some resolver function headers X-Git-Tag: release-0.50~433 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=32e9d5d803c85a0a4ef51eb4f7fa02f6ba086df3;p=thirdparty%2Fldns.git added ldns_rdf_label_count, updated test1. Added some resolver function headers --- diff --git a/doc/tutorial b/doc/tutorial new file mode 100644 index 00000000..9ae1012c --- /dev/null +++ b/doc/tutorial @@ -0,0 +1,5 @@ +ldns tutorial + + +In this tutorial we will explain how to make a simple application with +ldns. diff --git a/host2str.c b/host2str.c index da5cc777..16f8c6ca 100644 --- a/host2str.c +++ b/host2str.c @@ -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); diff --git a/ldns/rdata.h b/ldns/rdata.h index dac4ac27..6cc66749 100644 --- a/ldns/rdata.h +++ b/ldns/rdata.h @@ -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 */ diff --git a/ldns/resolver.h b/ldns/resolver.h index 11f254a8..e182c348 100644 --- a/ldns/resolver.h +++ b/ldns/resolver.h @@ -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 b4f69807..222dfb87 100644 --- 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 792e1585..f0af51c0 100644 --- 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; } /** diff --git a/resolver.c b/resolver.c index 427d76c6..ebba586c 100644 --- a/resolver.c +++ b/resolver.c @@ -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) { diff --git a/run-test1.c b/run-test1.c index 578b7b69..11f63bb3 100644 --- a/run-test1.c +++ b/run-test1.c @@ -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)); }