#include #include #include #include #include "sclasses.hh" #include #include #include "record-types.hh" /*! @file @brief Tiny resolver */ using namespace std; multimap g_root; ComboAddress getIP(const std::unique_ptr& rr) { ComboAddress ret; if(auto ptr = dynamic_cast(rr.get())) ret=ptr->getIP(); else if(auto ptr = dynamic_cast(rr.get())) ret=ptr->getIP(); ret.sin4.sin_port = htons(53); return ret; } vector> resolveAt(const DNSName& dn, const DNSType& dt, int depth=0, const multimap& servers=g_root) { std::string prefix(depth, ' '); prefix += dn.toString() + " "; DNSMessageWriter dmw(dn, dt); dmw.dh.rd = false; dmw.randomizeID(); dmw.setEDNS(4000, false); vector> ret; for(auto& sp : servers) { ret.clear(); ComboAddress server=sp.second; server.sin4.sin_port = htons(53); try { cout << prefix<<"Sending to server "< rr; set nsses; multimap addresses; while(dmr.getRR(rrsection, rrdn, rrdt, ttl, rr)) { cout << prefix << rrsection<<" "<toString()<(rr.get())->d_name; cout << prefix<<"We got a CNAME to " << target <<", chasing"<(rr.get())->d_name); else if(rrsection == DNSSection::Additional && nsses.count(rrdn) && (rrdt == DNSType::A || rrdt == DNSType::AAAA)) { addresses.insert({rrdn, getIP(rr)}); } } } if(!ret.empty()) { cout << prefix<<"Done, returning "< newns; for(const auto& name: nsses) { cout << prefix<<"Attempting to resolve NS "<toString()<