13 #include "comboaddress.hh"
25 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
38 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
59 static_assert(
sizeof(
dnsheader) == 12,
"dnsheader size must be 12");
69 SENUM8(
RCode, Noerror, Formerr, Servfail, Nxdomain, Notimp, Refused, Notauth, Badvers)
75 A = 1,
NS = 2,
CNAME = 5,
SOA=6,
PTR=12,
MX=15,
TXT=16,
AAAA = 28,
SRV=33,
NAPTR=35,
DS=43,
RRSIG=46,
80 SENUM13(
DNSType, A, NS, CNAME, SOA, PTR, MX, TXT, AAAA, SRV, NAPTR, DS, RRSIG, NSEC)
81 SENUM7(DNSType, DNSKEY, NSEC3, OPT, IXFR, AXFR, ANY, CAA)
99 DNSLabel(
const char* s) : DNSLabel(std::string(s)) {}
103 throw std::out_of_range(
"label too long");
108 return std::lexicographical_compare(d_s.begin(), d_s.end(), rhs.
d_s.begin(), rhs.
d_s.end(), charcomp);
113 return !(*
this < rhs) && !(rhs<*
this);
115 auto size()
const {
return d_s.size(); }
116 auto empty()
const {
return d_s.empty(); }
120 static bool charcomp(
char a,
char b)
122 if(a >= 0x61 && a <= 0x7A)
124 if(b >= 0x61 && b <= 0x7A)
153 return std::lexicographical_compare(
begin(),
end(), rhs.
begin(), rhs.
end())==0 &&
163 return std::lexicographical_compare(
begin(),
end(), rhs.
begin(), rhs.
end());
183 virtual std::string
toString()
const = 0;
193 void add(std::unique_ptr<RRGen>&& rr)
196 contents.emplace_back(std::move(rr));
225 if(!us->d_name.empty())
232 void addRRs(std::unique_ptr<RRGen>&&a);
234 template<
typename... Types>
235 void addRRs(std::unique_ptr<RRGen>&&a, Types&&... args)
238 addRRs(std::forward<Types>(args)...);
std::unique_ptr< DNSNode > retrieveZone(const ComboAddress &remote, const DNSName &zone)
connects to an authoritative server, retrieves a zone, returns it as a smart pointer ...
Definition: tauth.cc:492
bool empty() const
Definition: dns-storage.hh:140
Resource records are treated as a set and have one TTL for the whole set.
Definition: dns-storage.hh:189
uint32_t ttl
Definition: dns-storage.hh:200
bool makeRelative(const DNSName &root)
Makes us relative to 'root', returns false if we weren't part of root.
Definition: dns-storage.cc:7
auto size() const
Definition: dns-storage.hh:115
std::vector< std::unique_ptr< RRGen > > signatures
Definition: dns-storage.hh:192
std::vector< std::unique_ptr< RRGen > > contents
Definition: dns-storage.hh:191
#define SENUM8(x, a1,...)
Definition: nenum.hh:17
Definition: dns-storage.hh:241
DNSLabel()
Definition: dns-storage.hh:98
DNSLabel(const char *s)
Definition: dns-storage.hh:99
DNSClass
Stores the class of a DNS query or resource record.
Definition: dns-storage.hh:85
bool operator==(const DNSLabel &rhs) const
Definition: dns-storage.hh:111
bool operator!=(const DNSName &rhs) const
Definition: dns-storage.hh:156
std::deque< DNSLabel > d_name
Definition: dns-storage.hh:166
DNSName makeDNSName(const std::string &str)
This function is plain wrong and does unescape its input XXX.
Definition: dns-storage.cc:55
auto end() const
Definition: dns-storage.hh:141
CH Question
Definition: dns-storage.hh:91
CH Authority
Definition: dns-storage.hh:91
auto empty() const
Definition: dns-storage.hh:116
virtual std::string toString() const =0
bool isPartOf(const DNSName &root) const
Checks is this DNSName is part of root.
Definition: dns-storage.cc:25
const DNSNode * next() const
Definition: dns-storage.cc:123
std::string toString() const
Definition: dns-storage.cc:221
std::unique_ptr< DNSNode > zone
if this is set, this node is a zone
Definition: dns-storage.hh:263
DNSLabel(const std::string &s)
Definition: dns-storage.hh:100
DNSNode * d_parent
Definition: dns-storage.hh:207
bool operator()(const DNSNode &a, const DNSNode &b) const
Definition: dns-storage.hh:243
DNSNode()
Definition: dns-storage.hh:208
void addRRs(std::unique_ptr< RRGen > &&a, Types &&...args)
add multiple RRGen to this node
Definition: dns-storage.hh:235
void push_back(const DNSLabel &l)
Definition: dns-storage.hh:137
DNSNode(const DNSLabel &lab, DNSNode *parent)
Definition: dns-storage.hh:209
bool operator<(const DNSName &rhs) const
Definition: dns-storage.hh:161
DNSName(std::initializer_list< DNSLabel > dls)
Definition: dns-storage.hh:136
Represents the contents of a resource record.
Definition: dns-storage.hh:180
DNSNode * add(DNSName name)
This is an idempotent way to add a node to a DNS tree.
Definition: dns-storage.cc:114
A DNS Message writer.
Definition: dnsmessages.hh:111
std::string d_s
Definition: dns-storage.hh:118
auto back() const
Definition: dns-storage.hh:138
bool operator==(const DNSName &rhs) const
Definition: dns-storage.hh:151
#define SENUM7(x, a1,...)
Definition: nenum.hh:16
bool operator()(const DNSLabel &a, const DNSNode &b) const
Definition: dns-storage.hh:251
CH Additional
Definition: dns-storage.hh:91
DNSName()
Definition: dns-storage.hh:135
DNSName operator+(const DNSName &a, const DNSName &b)
Append two DNSNames.
Definition: dns-storage.cc:46
A node in the DNS tree.
Definition: dns-storage.hh:204
auto push_front(const DNSLabel &dn)
Definition: dns-storage.hh:145
std::ostream & operator<<(std::ostream &os, const DNSLabel &d)
Definition: dns-storage.cc:195
void loadZones(DNSNode &zones)
Called by main() to load zone information.
Definition: contents.cc:12
virtual DNSType getType() const =0
RCode
Definition: dns-storage.hh:62
#define SENUM2(x, a1,...)
Definition: nenum.hh:11
void addRRs(std::unique_ptr< RRGen > &&a)
add one RRGen to this node
Definition: dns-storage.cc:180
const DNSNode * prev() const
Definition: dns-storage.cc:158
uint16_t namepos
for label compression, we also use DNSNodes
Definition: dns-storage.hh:264
bool operator()(const DNSNode &a, const DNSLabel &b) const
Definition: dns-storage.hh:247
void clear()
Definition: dns-storage.hh:147
IN
Definition: dns-storage.hh:89
Represents a DNS label, which is part of a DNS Name.
Definition: dns-storage.hh:95
auto front() const
Definition: dns-storage.hh:142
void pop_back()
Definition: dns-storage.hh:143
auto begin() const
Definition: dns-storage.hh:139
A DNS Name with helpful methods. Inherits case insensitivity from DNSLabel.
Definition: dns-storage.hh:133
CH Answer
Definition: dns-storage.hh:91
#define SENUM13(x, a1,...)
Definition: nenum.hh:22
std::set< DNSNode, DNSNodeCmp > children
children, found by DNSLabel
Definition: dns-storage.hh:259
bool operator<(const DNSLabel &rhs) const
Equality and comparison are case insensitive.
Definition: dns-storage.hh:106
auto size()
Definition: dns-storage.hh:146
std::map< DNSType, RRSet > rrsets
Definition: dns-storage.hh:262
DNSLabel d_name
Definition: dns-storage.hh:206
SMARTENUMSTART(DNSClass) SENUM2(DNSClass
void pop_front()
Definition: dns-storage.hh:144
void is_transparent
Definition: dns-storage.hh:255
DNSName getName() const
Definition: dns-storage.hh:219
virtual void toMessage(DNSMessageWriter &dpw)=0
DNSType
Stores the type of a DNS query or resource record.
Definition: dns-storage.hh:73
#define COMBOENUM4(x, a1, b1, a2, b2, a3, b3, a4, b4)
Definition: nenum.hh:41
void add(std::unique_ptr< RRGen > &&rr)
Definition: dns-storage.hh:193
const DNSNode * find(DNSName &name, DNSName &last, bool wildcards=false, const DNSNode **passedZonecut=0, const DNSNode **passedWcard=0) const
This is the key function that finds names, returns where it found them and if any zonecuts were passs...
Definition: dns-storage.cc:79