--- /dev/null
+ldns tutorial
+
+
+In this tutorial we will explain how to make a simple application with
+ldns.
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);
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 */
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;
}
#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
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;
}
/**
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)
{
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)
{
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)
{
{
ldns_buffer *buf;
ldns_rdf *rdata;
+ ldns_rdf *cnt_test;
buf = ldns_buffer_new(10); /* alloc away! */
if (!buf) {
(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));
}