summaryrefslogtreecommitdiff
path: root/include/dns.h
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2012-11-22 00:50:33 -0500
committerAdam <Adam@anope.org>2012-11-22 00:50:33 -0500
commitd33a0f75a5c0c584fbb7cc0076da36d494f39494 (patch)
tree7b2274cc833c793c0f5595660cbd4d715de52ffd /include/dns.h
parent368d469631763e9c8bf399980d0ac7c5b5664d39 (diff)
Pretty large coding style cleanup, in source doc
cleanup, and allow protocol mods to depend on each other
Diffstat (limited to 'include/dns.h')
-rw-r--r--include/dns.h481
1 files changed, 246 insertions, 235 deletions
diff --git a/include/dns.h b/include/dns.h
index 64067107b..fee9da8a9 100644
--- a/include/dns.h
+++ b/include/dns.h
@@ -8,260 +8,271 @@
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*
- *
*/
-
+
#ifndef DNS_H
#define DNS_H
#include "sockets.h"
#include "timers.h"
-#include "extern.h"
#include "config.h"
-
-/** Valid query types
- */
-enum QueryType
-{
- /* Nothing */
- DNS_QUERY_NONE,
- /* A simple A lookup */
- DNS_QUERY_A = 1,
- /* An authoritative name server */
- DNS_QUERY_NS = 2,
- /* A CNAME lookup */
- DNS_QUERY_CNAME = 5,
- /* Start of a zone of authority */
- DNS_QUERY_SOA = 6,
- /* Reverse DNS lookup */
- DNS_QUERY_PTR = 12,
- /* IPv6 AAAA lookup */
- DNS_QUERY_AAAA = 28,
- /* Zone transfer */
- DNS_QUERY_AXFR = 252
-};
-
-/** Flags that can be AND'd into DNSPacket::flags to receive certain values
- */
-enum
-{
- DNS_QUERYFLAGS_QR = 0x8000,
- DNS_QUERYFLAGS_OPCODE = 0x7800,
- DNS_QUERYFLAGS_AA = 0x400,
- DBS_QUERYFLAGS_TC = 0x200,
- DNS_QUERYFLAGS_RD = 0x100,
- DNS_QUERYFLAGS_RA = 0x80,
- DNS_QUERYFLAGS_Z = 0x70,
- DNS_QUERYFLAGS_RCODE = 0xF
-};
-
-enum DNSError
-{
- DNS_ERROR_NONE,
- DNS_ERROR_UNKNOWN,
- DNS_ERROR_UNLOADED,
- DNS_ERROR_TIMEOUT,
- DNS_ERROR_NOT_AN_ANSWER,
- DNS_ERROR_NONSTANDARD_QUERY,
- DNS_ERROR_FORMAT_ERROR,
- DNS_ERROR_SERVER_FAILURE,
- DNS_ERROR_DOMAIN_NOT_FOUND,
- DNS_ERROR_NOT_IMPLEMENTED,
- DNS_ERROR_REFUSED,
- DNS_ERROR_NO_RECORDS,
- DNS_ERROR_INVALIDTYPE
-};
-
-
-struct CoreExport Question
-{
- Anope::string name;
- QueryType type;
- unsigned short qclass;
-
- Question();
- Question(const Anope::string &, QueryType, unsigned short = 1);
-};
-
-struct CoreExport ResourceRecord : public Question
-{
- unsigned int ttl;
- Anope::string rdata;
- time_t created;
-
- ResourceRecord(const Anope::string &, QueryType, unsigned short = 1);
- ResourceRecord(const Question &);
-};
-
-struct CoreExport DNSQuery
-{
- std::vector<Question> questions;
- std::vector<ResourceRecord> answers, authorities, additional;
- DNSError error;
-
- DNSQuery();
- DNSQuery(const Question &q);
-};
-
-/** The request
- */
-class CoreExport DNSRequest : public Timer, public Question
-{
- /* Use result cache if available */
- bool use_cache;
-
- public:
- /* Request id */
- unsigned short id;
- /* Creator of this request */
- Module *creator;
-
- DNSRequest(const Anope::string &addr, QueryType qt, bool cache = false, Module *c = NULL);
-
- virtual ~DNSRequest();
-
- void Process();
-
- virtual void OnLookupComplete(const DNSQuery *r) = 0;
-
- virtual void OnError(const DNSQuery *r);
- void Tick(time_t) anope_override;
-};
-
-/** A full packet sent or recieved to/from the nameserver
- */
-class DNSPacket : public DNSQuery
+namespace DNS
{
- static const int DNS_POINTER = 0xC0;
- static const int DNS_LABEL = 0x3F;
-
- void PackName(unsigned char *output, unsigned short output_size, unsigned short &pos, const Anope::string &name);
- Anope::string UnpackName(const unsigned char *input, unsigned short input_size, unsigned short &pos);
- Question UnpackQuestion(const unsigned char *input, unsigned short input_size, unsigned short &pos);
- ResourceRecord UnpackResourceRecord(const unsigned char *input, unsigned short input_size, unsigned short &poss);
- public:
- static const int HEADER_LENGTH = 12;
-
- /* Source or destination of the packet */
- sockaddrs addr;
- /* ID for this packet */
- unsigned short id;
- /* Flags on the packet */
- unsigned short flags;
-
- DNSPacket(sockaddrs *a);
- void Fill(const unsigned char *input, const unsigned short len);
- unsigned short Pack(unsigned char *output, unsigned short output_size);
-};
-
-/** DNS manager
- */
-class CoreExport DNSManager : public Timer
-{
- class ReplySocket : public virtual Socket
+ /** Valid query types
+ */
+ enum QueryType
+ {
+ /* Nothing */
+ QUERY_NONE,
+ /* A simple A lookup */
+ QUERY_A = 1,
+ /* An authoritative name server */
+ QUERY_NS = 2,
+ /* A CNAME lookup */
+ QUERY_CNAME = 5,
+ /* Start of a zone of authority */
+ QUERY_SOA = 6,
+ /* Reverse DNS lookup */
+ QUERY_PTR = 12,
+ /* IPv6 AAAA lookup */
+ QUERY_AAAA = 28,
+ /* Zone transfer */
+ QUERY_AXFR = 252
+ };
+
+ /** Flags that can be AND'd into DNSPacket::flags to receive certain values
+ */
+ enum
{
+ QUERYFLAGS_QR = 0x8000,
+ QUERYFLAGS_OPCODE = 0x7800,
+ QUERYFLAGS_AA = 0x400,
+ QUERYFLAGS_TC = 0x200,
+ QUERYFLAGS_RD = 0x100,
+ QUERYFLAGS_RA = 0x80,
+ QUERYFLAGS_Z = 0x70,
+ QUERYFLAGS_RCODE = 0xF
+ };
+
+ enum Error
+ {
+ ERROR_NONE,
+ ERROR_UNKNOWN,
+ ERROR_UNLOADED,
+ ERROR_TIMEOUT,
+ ERROR_NOT_AN_ANSWER,
+ ERROR_NONSTANDARD_QUERY,
+ ERROR_FORMAT_ERROR,
+ ERROR_SERVER_FAILURE,
+ ERROR_DOMAIN_NOT_FOUND,
+ ERROR_NOT_IMPLEMENTED,
+ ERROR_REFUSED,
+ ERROR_NO_RECORDS,
+ ERROR_INVALIDTYPE
+ };
+
+
+ struct CoreExport Question
+ {
+ Anope::string name;
+ QueryType type;
+ unsigned short qclass;
+
+ Question();
+ Question(const Anope::string &, QueryType, unsigned short = 1);
+ };
+
+ struct CoreExport ResourceRecord : public Question
+ {
+ unsigned int ttl;
+ Anope::string rdata;
+ time_t created;
+
+ ResourceRecord(const Anope::string &, QueryType, unsigned short = 1);
+ ResourceRecord(const Question &);
+ };
+
+ struct CoreExport Query
+ {
+ std::vector<Question> questions;
+ std::vector<ResourceRecord> answers, authorities, additional;
+ Error error;
+
+ Query();
+ Query(const Question &q);
+ };
+
+ /** A DNS query.
+ */
+ class CoreExport Request : public Timer, public Question
+ {
+ /* Use result cache if available */
+ bool use_cache;
+
public:
- virtual ~ReplySocket() { }
- virtual void Reply(DNSPacket *p) = 0;
+ /* Request id */
+ unsigned short id;
+ /* Creator of this request */
+ Module *creator;
+
+ Request(const Anope::string &addr, QueryType qt, bool cache = false, Module *c = NULL);
+ virtual ~Request();
+
+ void Process();
+
+ /** Called when this request succeeds
+ * @param r The query sent back from the nameserver
+ */
+ virtual void OnLookupComplete(const Query *r) = 0;
+
+ /** Called when this request fails or times out.
+ * @param r The query sent back from the nameserver, check the error code.
+ */
+ virtual void OnError(const Query *r);
+
+ /** Used to time out the query, Calls OnError and lets the TimerManager
+ * delete this request.
+ */
+ void Tick(time_t) anope_override;
};
-
- /* Listens for TCP requests */
- class TCPSocket : public ListenSocket
+
+ /** A full packet sent or recieved to/from the nameserver
+ */
+ class Packet : public Query
{
- /* A TCP client */
- class Client : public ClientSocket, public Timer, public ReplySocket
+ static const int POINTER = 0xC0;
+ static const int LABEL = 0x3F;
+
+ void PackName(unsigned char *output, unsigned short output_size, unsigned short &pos, const Anope::string &name);
+ Anope::string UnpackName(const unsigned char *input, unsigned short input_size, unsigned short &pos);
+
+ Question UnpackQuestion(const unsigned char *input, unsigned short input_size, unsigned short &pos);
+ ResourceRecord UnpackResourceRecord(const unsigned char *input, unsigned short input_size, unsigned short &poss);
+ public:
+ static const int HEADER_LENGTH = 12;
+
+ /* Source or destination of the packet */
+ sockaddrs addr;
+ /* ID for this packet */
+ unsigned short id;
+ /* Flags on the packet */
+ unsigned short flags;
+
+ Packet(sockaddrs *a);
+ void Fill(const unsigned char *input, const unsigned short len);
+ unsigned short Pack(unsigned char *output, unsigned short output_size);
+ };
+
+ /** DNS manager
+ */
+ class CoreExport Manager : public Timer
+ {
+ class ReplySocket : public virtual Socket
{
- TCPSocket *tcpsock;
- DNSPacket *packet;
- unsigned char packet_buffer[524];
- int length;
-
public:
- Client(TCPSocket *ls, int fd, const sockaddrs &addr);
- ~Client();
-
- /* Times out after a few seconds */
- void Tick(time_t) anope_override { }
- void Reply(DNSPacket *p) anope_override;
+ virtual ~ReplySocket() { }
+ virtual void Reply(Packet *p) = 0;
+ };
+
+ /* Listens for TCP requests */
+ class TCPSocket : public ListenSocket
+ {
+ /* A TCP client */
+ class Client : public ClientSocket, public Timer, public ReplySocket
+ {
+ TCPSocket *tcpsock;
+ Packet *packet;
+ unsigned char packet_buffer[524];
+ int length;
+
+ public:
+ Client(TCPSocket *ls, int fd, const sockaddrs &addr);
+ ~Client();
+
+ /* Times out after a few seconds */
+ void Tick(time_t) anope_override { }
+ void Reply(Packet *p) anope_override;
+ bool ProcessRead() anope_override;
+ bool ProcessWrite() anope_override;
+ };
+
+ public:
+ TCPSocket(const Anope::string &ip, int port);
+
+ ClientSocket *OnAccept(int fd, const sockaddrs &addr) anope_override;
+ };
+
+ /* Listens for UDP requests */
+ class UDPSocket : public ReplySocket
+ {
+ std::deque<Packet *> packets;
+ public:
+
+ UDPSocket(const Anope::string &ip, int port);
+ ~UDPSocket();
+
+ void Reply(Packet *p) anope_override;
+
+ std::deque<Packet *>& GetPackets() { return packets; }
+
bool ProcessRead() anope_override;
+
bool ProcessWrite() anope_override;
};
-
- public:
- TCPSocket(const Anope::string &ip, int port);
-
- ClientSocket *OnAccept(int fd, const sockaddrs &addr) anope_override;
- };
-
- /* Listens for UDP requests */
- class UDPSocket : public ReplySocket
- {
- std::deque<DNSPacket *> packets;
+
+ typedef std::multimap<Anope::string, ResourceRecord, ci::less> cache_map;
+ cache_map cache;
+
+ bool listen;
+ uint32_t serial;
+
public:
-
- UDPSocket(const Anope::string &ip, int port);
- ~UDPSocket();
-
- void Reply(DNSPacket *p) anope_override;
-
- std::deque<DNSPacket *>& GetPackets() { return packets; }
-
- bool ProcessRead() anope_override;
-
- bool ProcessWrite() anope_override;
+ TCPSocket *tcpsock;
+ UDPSocket *udpsock;
+
+ sockaddrs addrs;
+ std::map<unsigned short, Request *> requests;
+
+ Manager(const Anope::string &nameserver, const Anope::string &ip, int port);
+ ~Manager();
+
+ bool HandlePacket(ReplySocket *s, const unsigned char *const data, int len, sockaddrs *from);
+
+ /** Add a record to the dns cache
+ * @param r The record
+ */
+ void AddCache(Query &r);
+
+ /** Check the DNS cache to see if request can be handled by a cached result
+ * @return true if a cached result was found.
+ */
+ bool CheckCache(Request *request);
+
+ /** Tick this timer, used to clear the DNS cache.
+ */
+ void Tick(time_t now) anope_override;
+
+ /** Cleanup all pending DNS queries for a module
+ * @param mod The module
+ */
+ void Cleanup(Module *mod);
+
+ void UpdateSerial();
+ uint32_t GetSerial() const;
+
+ /** Does a BLOCKING DNS query and returns the first IP.
+ * Only use this if you know what you are doing. Unless you specifically
+ * need a blocking query use the DNSRequest system
+ */
+ static Query BlockingQuery(const Anope::string &mask, QueryType qt);
};
-
- typedef std::multimap<Anope::string, ResourceRecord, ci::less> cache_map;
- cache_map cache;
-
- bool listen;
- uint32_t serial;
-
- public:
- TCPSocket *tcpsock;
- UDPSocket *udpsock;
-
- sockaddrs addrs;
- std::map<unsigned short, DNSRequest *> requests;
-
- DNSManager(const Anope::string &nameserver, const Anope::string &ip, int port);
- ~DNSManager();
-
- bool HandlePacket(ReplySocket *s, const unsigned char *const data, int len, sockaddrs *from);
-
- /** Add a record to the dns cache
- * @param r The record
- */
- void AddCache(DNSQuery &r);
-
- /** Check the DNS cache to see if request can be handled by a cached result
- * @return true if a cached result was found.
- */
- bool CheckCache(DNSRequest *request);
-
- /** Tick this timer, used to clear the DNS cache.
- */
- void Tick(time_t now) anope_override;
-
- /** Cleanup all pending DNS queries for a module
- * @param mod The module
- */
- void Cleanup(Module *mod);
-
- void UpdateSerial();
- uint32_t GetSerial() const;
-
- /** Does a BLOCKING DNS query and returns the first IP.
- * Only use this if you know what you are doing. Unless you specifically
- * need a blocking query use the DNSRequest system
- */
- static DNSQuery BlockingQuery(const Anope::string &mask, QueryType qt);
-};
-
-extern CoreExport DNSManager *DNSEngine;
-
+
+ extern CoreExport Manager *Engine;
+
+} // namespace DNS
+
#endif // DNS_H
-
-
+
+