int main(int argc, char** argv)
try
{
+ set<ComboAddress> addrs;
for(int n=1 ; n < argc; ++n) {
if ((string) argv[n] == "--help") {
exit(1);
}
- int sock = socket(AF_INET, SOCK_DGRAM, 0);
- if(sock < 0)
- throw runtime_error("Creating socket for incoming packets: "+stringerror());
-
+ int sock = -1;
// ComboAddress local("127.0.0.1", (int)0);
// if(::bind(sock, (struct sockaddr*) &local, local.getSocklen()) < 0)
// throw runtime_error("Failed to bind local socket to address "+local.toString()+": "+stringerror());
- ComboAddress pdns(argv[1], 53);
- if(connect(sock, (struct sockaddr*) &pdns, pdns.getSocklen()) < 0)
- throw runtime_error("Failed to connect PowerDNS socket to address "+pdns.toString()+": "+stringerror());
-
- vector<uint8_t> outpacket;
- DNSPacketWriter pw(outpacket, DNSName(argv[2]), QType::SOA, 1, Opcode::Notify);
- pw.getHeader()->id = random();
+ try {
+ addrs.emplace(ComboAddress{argv[1], 53});
+ } catch (PDNSException &ex) {
+ /* needs resolving, maybe */
+ struct addrinfo *info;
+ vector<string> parts;
+ boost::split(parts, argv[1], [](char c){return c == ':';});
+ if (parts.size() == 1)
+ parts.push_back("domain");
+ else if (parts.size() != 2)
+ throw runtime_error("Invalid hostname:port syntax");
+ if (getaddrinfo(parts[0].c_str(), parts[1].c_str(), NULL, &info) < 0)
+ throw runtime_error("Cannot resolve '" + string(argv[1]) +"'");
+ for(auto ptr = info; ptr != NULL; ptr = ptr->ai_next)
+ addrs.emplace(ComboAddress{ptr->ai_addr, ptr->ai_addrlen});
+ }
+ for(const auto &addr: addrs) {
+ if (sock > -1)
+ (void)close(sock);
+ sock = socket(addr.sin4.sin_family, SOCK_DGRAM, 0);
+ if(sock < 0)
+ throw runtime_error("Creating socket for incoming packets: "+stringerror());
+ if(connect(sock, (struct sockaddr*)&addr, addr.getSocklen()) < 0) {
+ cerr<<"Failed to connect PowerDNS socket to address "+addr.toString()+": "+stringerror()<<endl;
+ continue;
+ }
+ vector<uint8_t> outpacket;
+ DNSPacketWriter pw(outpacket, DNSName(argv[2]), QType::SOA, 1, Opcode::Notify);
+ pw.getHeader()->id = random();
- if(send(sock, &outpacket[0], outpacket.size(), 0) < 0) {
- throw runtime_error("Unable to send notify to PowerDNS: "+stringerror());
- }
-
- char buffer[1500];
- int len=recv(sock, buffer, sizeof(buffer),0);
- if(len < 0)
- throw runtime_error("Unable to receive notification response from PowerDNS: "+stringerror());
+ if(send(sock, &outpacket[0], outpacket.size(), 0) < 0) {
+ cerr<<"Unable to send notify to PowerDNS: "+stringerror()<<endl;
+ continue;
+ }
- string packet(buffer, len);
- MOADNSParser mdp(false, packet);
+ char buffer[1500];
- cerr<<"Received notification response with error: "<<RCode::to_s(mdp.d_header.rcode)<<endl;
- cerr<<"For: '"<<mdp.d_qname<<"'"<<endl;
+ int len=recv(sock, buffer, sizeof(buffer),0);
+ if(len < 0) {
+ cerr<<"Unable to receive notification response from PowerDNS: "+stringerror()<<endl;
+ continue;
+ }
+
+ string packet(buffer, len);
+ MOADNSParser mdp(false, packet);
+
+ cerr<<addr.toString()<<": Received notification response with error: "<<RCode::to_s(mdp.d_header.rcode)<<endl;
+ cerr<<"For: '"<<mdp.d_qname<<"'"<<endl;
+ }
}
catch(std::exception& e)
{