{ LDNS_STATUS_MEM_ERR, "General memory error" },
{ LDNS_STATUS_INTERNAL_ERR, "Internal error, this should not happen" },
{ LDNS_STATUS_ERR, "General error, this should be more specific" },
+ { LDNS_STATUS_NO_NAMESERVERS_ERR, "No nameservers in resolver structure" },
{ LDNS_STATUS_INVALID_INT, "Conversion error, integer expected" },
{ LDNS_STATUS_INVALID_IP4, "Conversion error, ip4 addr expected" },
{ LDNS_STATUS_INVALID_IP6, "Conversion error, ip6 addr expected" },
int result = 0;
int i;
char *arg_end_ptr = NULL;
+ size_t j;
p = NULL;
rrlist = NULL;
printf("\n");
}
p = ldns_resolver_query(res, last_dname_p, LDNS_RR_TYPE_ANY, LDNS_RR_CLASS_IN, LDNS_RD);
+ /* TODO: make a general option for this (something like ignore_rtt)? */
+ for (j = 0; j < ldns_resolver_nameserver_count(res); j++) {
+ if (ldns_resolver_nameserver_rtt(res, j) != 0) {
+ ldns_resolver_set_nameserver_rtt(res, j, LDNS_RESOLV_RTT_MIN);
+ }
+ }
if (verbosity >= 5) {
if (p) {
ldns_pkt_print(stdout, p);
}
}
- if (!p) {
- fprintf(stderr, "Error trying to resolve: ");
- ldns_rdf_print(stderr, last_dname_p);
- fprintf(stderr, "\n");
- }
}
}
size_t *rtt;
ldns_pkt *reply;
ldns_buffer *qb;
+ bool all_servers_rtt_inf;
+ uint8_t retries;
uint8_t *reply_bytes = NULL;
size_t reply_size = 0;
ns_array = ldns_resolver_nameservers(r);
reply = NULL; ns_len = 0;
+ all_servers_rtt_inf = true;
+
if (!query_pkt) {
/* nothing to do? */
return LDNS_STATUS_ERR;
/* not reacheable nameserver! */
continue;
}
+ all_servers_rtt_inf = false;
+
ns = ldns_rdf2native_sockaddr_storage(ns_array[i],
ldns_resolver_port(r), &ns_len);
/* FREE OF NS */
/* continue; */
}
+
if ((ns->ss_family == AF_INET6) &&
(ldns_resolver_ip6(r) == LDNS_RESOLV_INET)) {
/*printf("mismatch!!! 6 - 4\n");*/
gettimeofday(&tv_s, NULL);
+ send_status = LDNS_STATUS_ERR;
/* reply_bytes implicitly handles our error */
if (1 == ldns_resolver_usevc(r)) {
- send_status = ldns_tcp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size);
+ for (retries = ldns_resolver_retry(r); retries > 0; retries--) {
+ send_status = ldns_tcp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size);
+ if (send_status == LDNS_STATUS_OK) {
+ continue;
+ }
+ }
} else {
- send_status = ldns_udp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size);
+ for (retries = ldns_resolver_retry(r); retries > 0; retries--) {
+ send_status = ldns_udp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size);
+ if (send_status == LDNS_STATUS_OK) {
+ continue;
+ }
+ }
}
if (send_status != LDNS_STATUS_OK) {
ldns_resolver_set_nameserver_rtt(r, i, LDNS_RESOLV_RTT_INF);
+ status = LDNS_STATUS_ERR;
}
/* obey the fail directive */
sleep((unsigned int) ldns_resolver_retrans(r));
}
+ if (all_servers_rtt_inf) {
+ return LDNS_STATUS_NO_NAMESERVERS_ERR;
+ }
#ifdef HAVE_SSL
if (tsig_mac && reply_bytes) {
if (!ldns_pkt_tsig_verify(reply,
if (result) {
*result = reply;
}
+
return status;
}
ldns_status
ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, ldns_pkt *query_pkt)
{
- uint8_t retries;
ldns_pkt *answer_pkt = NULL;
ldns_status stat = LDNS_STATUS_OK;
- for (retries = ldns_resolver_retry(r); retries > 0; retries--) {
- stat = ldns_send(&answer_pkt, r, query_pkt);
- if (stat == LDNS_STATUS_OK) {
- break;
- }
- else {
- if(answer_pkt) {
- ldns_pkt_free(answer_pkt);
- answer_pkt = NULL;
- }
+ stat = ldns_send(&answer_pkt, r, query_pkt);
+ if (stat != LDNS_STATUS_OK) {
+ if(answer_pkt) {
+ ldns_pkt_free(answer_pkt);
+ answer_pkt = NULL;
}
}
if (answer) {
*answer = answer_pkt;
}
+
return stat;
}