-int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records) // Implementation is making sure RFC2845 4.4 is followed.
+int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records, uint16_t timeout) // Implementation is making sure RFC2845 4.4 is followed.
{
if(d_soacount > 1)
return false;
if (d_maxReceivedBytes > 0 && (d_maxReceivedBytes - d_receivedBytes) < (size_t) len)
throw ResolverException("Reached the maximum number of received bytes during AXFR");
- timeoutReadn(len);
+ timeoutReadn(len, timeout);
d_receivedBytes += (uint16_t) len;
return true;
}
-void AXFRRetriever::timeoutReadn(uint16_t bytes)
+void AXFRRetriever::timeoutReadn(uint16_t bytes, uint16_t timeoutsec)
{
- time_t start=time(0);
+ time_t start=time(nullptr);
int n=0;
int numread;
while(n<bytes) {
- int res=waitForData(d_sock, 10-(time(0)-start));
+ int res=waitForData(d_sock, timeoutsec-(time(nullptr)-start));
if(res<0)
throw ResolverException("Reading data from remote nameserver over TCP: "+stringerror());
if(!res)
const ComboAddress* laddr = NULL,
size_t maxReceivedBytes=0);
~AXFRRetriever();
- int getChunk(Resolver::res_t &res, vector<DNSRecord>* records=0);
+ int getChunk(Resolver::res_t &res, vector<DNSRecord>* records=0, uint16_t timeout=10);
private:
void connect();
int getLength();
- void timeoutReadn(uint16_t bytes);
+ void timeoutReadn(uint16_t bytes, uint16_t timeoutsec=10);
shared_array<char> d_buf;
string d_domain;