From 60804f94d37dab07ee6dd0b378c618619fda4bf0 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Mon, 15 Oct 2018 09:29:54 +0200 Subject: [PATCH] add 'tres', a teaching resolver (167 lines!) --- tdns/Makefile | 8 ++- tdns/tres.cc | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 tdns/tres.cc diff --git a/tdns/Makefile b/tdns/Makefile index b2e0640..efcefd4 100644 --- a/tdns/Makefile +++ b/tdns/Makefile @@ -1,14 +1,14 @@ CXXFLAGS:=-std=gnu++14 -Wall -O2 -MMD -MP -ggdb -Iext/simplesocket -Iext/catch -pthread CFLAGS:= -Wall -O2 -MMD -MP -ggdb -PROGRAMS = tdns tdig tdns-c-test +PROGRAMS = tdns tdig tres tdns-c-test all: $(PROGRAMS) clean: rm -f *~ *.o *.d test $(PROGRAMS) -check: testrunner tdns tdig +check: testrunner tdns tdig ./testrunner cd tests ; ./basic @@ -20,6 +20,10 @@ tdns: tdns.o record-types.o dns-storage.o dnsmessages.o contents.o ext/simplesoc tdig: tdig.o record-types.o dns-storage.o dnsmessages.o ext/simplesocket/comboaddress.o ext/simplesocket/sclasses.o ext/simplesocket/swrappers.o g++ -std=gnu++14 $^ -o $@ -pthread +tres: tres.o record-types.o dns-storage.o dnsmessages.o ext/simplesocket/comboaddress.o ext/simplesocket/sclasses.o ext/simplesocket/swrappers.o + g++ -std=gnu++14 $^ -o $@ -pthread + + tdns-c-test: tdns-c-test.o tdns-c.o record-types.o dns-storage.o dnsmessages.o ext/simplesocket/comboaddress.o ext/simplesocket/sclasses.o ext/simplesocket/swrappers.o g++ -std=gnu++14 $^ -o $@ diff --git a/tdns/tres.cc b/tdns/tres.cc new file mode 100644 index 0000000..6f1724c --- /dev/null +++ b/tdns/tres.cc @@ -0,0 +1,167 @@ +#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()<