| 301 | | |
| 302 | | d_sock = makeQuerySocket(local, false); // make a TCP socket |
| 303 | | d_buf = shared_array<char>(new char[65536]); |
| 304 | | d_remote = remote; // mostly for error reporting |
| 305 | | this->connect(); |
| 306 | | d_soacount = 0; |
| 307 | | |
| 308 | | vector<uint8_t> packet; |
| 309 | | DNSPacketWriter pw(packet, domain, QType::AXFR); |
| 310 | | pw.getHeader()->id = dns_random(0xffff); |
| 311 | | |
| 312 | | if(!tsigkeyname.empty()) { |
| 313 | | d_trc.d_algoName = tsigalgorithm + ".sig-alg.reg.int."; |
| 314 | | d_trc.d_time = time(0); |
| 315 | | d_trc.d_fudge = 300; |
| 316 | | d_trc.d_origID=ntohs(pw.getHeader()->id); |
| 317 | | d_trc.d_eRcode=0; |
| 318 | | addTSIG(pw, &d_trc, tsigkeyname, tsigsecret, "", false); |
| 319 | | } |
| 320 | | |
| 321 | | uint16_t replen=htons(packet.size()); |
| 322 | | Utility::iovec iov[2]; |
| 323 | | iov[0].iov_base=(char*)&replen; |
| 324 | | iov[0].iov_len=2; |
| 325 | | iov[1].iov_base=(char*)&packet[0]; |
| 326 | | iov[1].iov_len=packet.size(); |
| 327 | | |
| 328 | | int ret=Utility::writev(d_sock, iov,2); |
| 329 | | if(ret<0) |
| 330 | | throw ResolverException("Error sending question to "+d_remote.toStringWithPort()+": "+stringerror()); |
| 331 | | |
| 332 | | int res = waitForData(d_sock, 10, 0); |
| 333 | | |
| 334 | | if(!res) |
| 335 | | throw ResolverException("Timeout waiting for answer from "+d_remote.toStringWithPort()+" during AXFR"); |
| 336 | | if(res<0) |
| 337 | | throw ResolverException("Error waiting for answer from "+d_remote.toStringWithPort()+": "+stringerror()); |
| | 301 | d_sock = -1; |
| | 302 | try { |
| | 303 | d_sock = makeQuerySocket(local, false); // make a TCP socket |
| | 304 | d_buf = shared_array<char>(new char[65536]); |
| | 305 | d_remote = remote; // mostly for error reporting |
| | 306 | this->connect(); |
| | 307 | d_soacount = 0; |
| | 308 | |
| | 309 | vector<uint8_t> packet; |
| | 310 | DNSPacketWriter pw(packet, domain, QType::AXFR); |
| | 311 | pw.getHeader()->id = dns_random(0xffff); |
| | 312 | |
| | 313 | if(!tsigkeyname.empty()) { |
| | 314 | d_trc.d_algoName = tsigalgorithm + ".sig-alg.reg.int."; |
| | 315 | d_trc.d_time = time(0); |
| | 316 | d_trc.d_fudge = 300; |
| | 317 | d_trc.d_origID=ntohs(pw.getHeader()->id); |
| | 318 | d_trc.d_eRcode=0; |
| | 319 | addTSIG(pw, &d_trc, tsigkeyname, tsigsecret, "", false); |
| | 320 | } |
| | 321 | |
| | 322 | uint16_t replen=htons(packet.size()); |
| | 323 | Utility::iovec iov[2]; |
| | 324 | iov[0].iov_base=(char*)&replen; |
| | 325 | iov[0].iov_len=2; |
| | 326 | iov[1].iov_base=(char*)&packet[0]; |
| | 327 | iov[1].iov_len=packet.size(); |
| | 328 | |
| | 329 | int ret=Utility::writev(d_sock, iov,2); |
| | 330 | if(ret<0) |
| | 331 | throw ResolverException("Error sending question to "+d_remote.toStringWithPort()+": "+stringerror()); |
| | 332 | |
| | 333 | int res = waitForData(d_sock, 10, 0); |
| | 334 | |
| | 335 | if(!res) |
| | 336 | throw ResolverException("Timeout waiting for answer from "+d_remote.toStringWithPort()+" during AXFR"); |
| | 337 | if(res<0) |
| | 338 | throw ResolverException("Error waiting for answer from "+d_remote.toStringWithPort()+": "+stringerror()); |
| | 339 | } |
| | 340 | catch(...) { |
| | 341 | if(d_sock >= 0) |
| | 342 | close(d_sock); |
| | 343 | throw; |
| | 344 | } |