//! returns -1 for permanent error, 0 for timeout, 1 for success
/** Never throws! */
-int LWRes::asyncresolve(const string &ip, const char *domain, int type, bool doTCP)
+int LWRes::asyncresolve(const string &ip, const char *domain, int type, bool doTCP, struct timeval* now)
{
vector<uint8_t> vpacket;
DNSPacketWriter pw(vpacket, domain, type);
int ret;
DTime dt;
- dt.set();
+ dt.setTimeval(*now);
if(!doTCP) {
if(asendto((const char*)&*vpacket.begin(), vpacket.size(), 0, (struct sockaddr*)(&toaddr), sizeof(toaddr), pw.getHeader()->id)<0) {
ret=1;
}
d_usec=dt.udiff();
-
+ *now=dt.getTimeval();
return ret;
}
typedef vector<DNSResourceRecord> res_t;
- int asyncresolve(const string &ip, const char *domain, int type, bool doTCP);
+ int asyncresolve(const string &ip, const char *domain, int type, bool doTCP, struct timeval* now);
vector<DNSResourceRecord> result();
int d_rcode;
bool d_aabit, d_tcbit;
d_tcpoutqueries++;
}
- int ret=d_lwr.asyncresolve(*remoteIP, qname.c_str(), qtype.getCode(), doTCP); // <- we go out on the wire!
+ int ret=d_lwr.asyncresolve(*remoteIP, qname.c_str(), qtype.getCode(), doTCP, &d_now); // <- we go out on the wire!
if(ret != 1) {
if(ret==0) {
LOG<<prefix<<qname<<": timeout resolving"<<endl;
s_throttle.throttle(d_now.tv_sec, *remoteIP+"|"+qname+"|"+qtype.getName(),20,5);
continue;
}
- gettimeofday(&d_now, 0);
+
break; // it did work!
}
}