*/
ldns_rdf * ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port);
+/**
+ * Prepares the resolver for an axfr query
+ * The query is sent and the answers can be read with ldns_axfr_next
+ * \param[in] resolver the resolver to use
+ * \param[in] domain the domain to exfr
+ * \param[in] c the class to use
+ * \return ldns_status the status of the transfer
+ */
+ldns_status ldns_axfr_start(ldns_resolver *resolver, ldns_rdf *domain, ldns_rr_class c);
+
#endif /* !_LDNS_NET_H */
*/
void ldns_resolver_deep_free(ldns_resolver *res);
-/**
- * Prepares the resolver for an axfr query
- * The query is sent and the answers can be read with ldns_axfr_next
- * \param[in] resolver the resolver to use
- * \param[in] domain the domain to exfr
- * \param[in] c the class to use
- * \return ldns_status the status of the transfer
- */
-ldns_status ldns_axfr_start(ldns_resolver *resolver, ldns_rdf *domain, ldns_rr_class c);
-
/**
* get the next stream of RRs in a AXFR
* \param[in] resolver the resolver to use. First ldns_axfr_start() must be
* all networking code is contained in one file
*/
+/* code from rdata.c */
struct sockaddr_storage *
ldns_rdf2native_sockaddr_storage(const ldns_rdf *rd, uint16_t port, size_t *size)
{
}
}
+/* code from rdata.c */
/* the other way around - for lua-ldns */
ldns_rdf *
ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port)
}
return addr;
}
+
+/* code from resolver.c */
+ldns_status
+ldns_axfr_start(ldns_resolver *resolver,
+ ldns_rdf *domain,
+ ldns_rr_class class)
+{
+ ldns_pkt *query;
+ ldns_buffer *query_wire;
+
+ struct sockaddr_storage *ns;
+ size_t ns_len = 0;
+ ldns_status status;
+
+ if (!resolver || ldns_resolver_nameserver_count(resolver) < 1) {
+ return LDNS_STATUS_ERR;
+ }
+
+ query = ldns_pkt_query_new(ldns_rdf_clone(domain),
+ LDNS_RR_TYPE_AXFR,
+ class,
+ 0);
+
+ if (!query) {
+ return LDNS_STATUS_ADDRESS_ERR;
+ }
+ /* For AXFR, we have to make the connection ourselves */
+ ns = ldns_rdf2native_sockaddr_storage(resolver->_nameservers[0],
+ ldns_resolver_port(resolver), &ns_len);
+
+ resolver->_socket = ldns_tcp_connect(ns, (socklen_t)ns_len, ldns_resolver_timeout(resolver));
+ if (resolver->_socket == 0) {
+ ldns_pkt_free(query);
+ LDNS_FREE(ns);
+ return LDNS_STATUS_NETWORK_ERR;
+ }
+
+ /* Convert the query to a buffer * Is this necessary?
+ */
+ query_wire = ldns_buffer_new(LDNS_MAX_PACKETLEN);
+ status = ldns_pkt2buffer_wire(query_wire, query);
+ if (status != LDNS_STATUS_OK) {
+ ldns_pkt_free(query);
+ LDNS_FREE(ns);
+ return status;
+ }
+ /* Send the query */
+ if (ldns_tcp_send_query(query_wire, resolver->_socket, ns, (socklen_t)ns_len) == 0) {
+ ldns_pkt_free(query);
+ ldns_buffer_free(query_wire);
+ LDNS_FREE(ns);
+ return LDNS_STATUS_NETWORK_ERR;
+ }
+
+ ldns_pkt_free(query);
+ ldns_buffer_free(query_wire);
+ LDNS_FREE(ns);
+
+ /*
+ * The AXFR is done once the second SOA record is sent
+ */
+ resolver->_axfr_soa_count = 0;
+ return LDNS_STATUS_OK;
+}
#include <ldns/config.h>
#include <ldns/dns.h>
-
#include <strings.h>
/* Access function for reading
* and setting the different Resolver
- * options
- */
+ * options */
/* read */
uint16_t
return 0;
}
-ldns_status
-ldns_axfr_start(ldns_resolver *resolver,
- ldns_rdf *domain,
- ldns_rr_class class)
-{
- ldns_pkt *query;
- ldns_buffer *query_wire;
-
- struct sockaddr_storage *ns;
- size_t ns_len = 0;
- ldns_status status;
-
- if (!resolver || ldns_resolver_nameserver_count(resolver) < 1) {
- return LDNS_STATUS_ERR;
- }
-
- /* Create the query */
- query = ldns_pkt_query_new(ldns_rdf_clone(domain),
- LDNS_RR_TYPE_AXFR,
- class,
- 0);
-
-
- if (!query) {
- return LDNS_STATUS_ADDRESS_ERR;
- }
- /* For AXFR, we have to make the connection ourselves */
- ns = ldns_rdf2native_sockaddr_storage(resolver->_nameservers[0],
- ldns_resolver_port(resolver), &ns_len);
-
- resolver->_socket = ldns_tcp_connect(ns, (socklen_t)ns_len, ldns_resolver_timeout(resolver));
- if (resolver->_socket == 0) {
- ldns_pkt_free(query);
- LDNS_FREE(ns);
- return LDNS_STATUS_NETWORK_ERR;
- }
-
- /* Convert the query to a buffer
- * Is this necessary?
- */
- query_wire = ldns_buffer_new(LDNS_MAX_PACKETLEN);
- status = ldns_pkt2buffer_wire(query_wire, query);
- if (status != LDNS_STATUS_OK) {
- ldns_pkt_free(query);
- LDNS_FREE(ns);
- return status;
- }
-
- /* Send the query */
- if (ldns_tcp_send_query(query_wire, resolver->_socket, ns, (socklen_t)ns_len) == 0) {
- ldns_pkt_free(query);
- ldns_buffer_free(query_wire);
- LDNS_FREE(ns);
- return LDNS_STATUS_NETWORK_ERR;
- }
-
- ldns_pkt_free(query);
- ldns_buffer_free(query_wire);
- LDNS_FREE(ns);
-
- /*
- * The AXFR is done once the second SOA record is sent
- */
- resolver->_axfr_soa_count = 0;
- return LDNS_STATUS_OK;
-}
-
ldns_rr *
ldns_axfr_next(ldns_resolver *resolver)
{