* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- * E-mail:
- * <brain@chatspike.net>
- * <Craig@chatspike.net>
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
*
- * Written by Craig Edwards, Craig McLure, and others.
* This program is free but copyrighted software; see
- * the file COPYING for details.
+ * the file COPYING for details.
*
* ---------------------------------------------------
*/
#include <string>
#include "inspircd_config.h"
-#include "socket.h"
#include "base.h"
+#include "socketengine.h"
+#include "socket.h"
+
+using namespace std;
+using irc::sockets::insp_aton;
+using irc::sockets::insp_ntoa;
+using irc::sockets::insp_sockaddr;
+using irc::sockets::insp_inaddr;
class InspIRCd;
+class Module;
/**
* Result status, used internally
RESOLVER_NSDOWN = 1,
RESOLVER_NXDOMAIN = 2,
RESOLVER_NOTREADY = 3,
- RESOLVER_BADIP = 4
+ RESOLVER_BADIP = 4,
+ RESOLVER_TIMEOUT = 5,
+ RESLOVER_FORCEUNLOAD = 6
};
/**
*/
enum QueryType
{
+ DNS_QUERY_NONE = 0, /* Uninitialized Query */
DNS_QUERY_A = 1, /* 'A' record: an ipv4 address */
DNS_QUERY_CNAME = 5, /* 'CNAME' record: An alias */
DNS_QUERY_PTR = 12, /* 'PTR' record: a hostname */
* Pointer to creator
*/
InspIRCd* ServerInstance;
+ /**
+ * Pointer to creator module (if any, or NULL)
+ */
+ Module* Creator;
/**
* The input data, either a host or an IP address
*/
* event a lookup could not be allocated, or a similar hard error occurs such as
* the network being down. This will also be thrown if an invalid IP address is
* passed when resolving a 'PTR' record.
+ *
+ * NOTE: If you are instantiating your DNS lookup from a module, you should set the
+ * value of creator to point at your Module class. This way if your module is unloaded
+ * whilst lookups are in progress, they can be safely removed and your module will not
+ * crash the server.
*/
- Resolver(InspIRCd* Instance, const std::string &source, QueryType qt);
+ Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, Module* creator = NULL);
+
/**
* The default destructor does nothing.
*/
* this method will return -1.
*/
int GetId();
+
+ /**
+ * Returns the creator module, or NULL
+ */
+ Module* GetCreator();
};
/** DNS is a singleton class used by the core to dispatch dns
* back to Resolver objects, based upon the request ID. You
* should never use this class yourself.
*/
-class DNS : public Extensible
+class DNS : public EventHandler
{
private:
*/
insp_inaddr myserver;
- /**
- * File descriptor being used to perform queries
- */
- static int MasterSocket;
-
/**
* A counter used to form part of the pseudo-random id
*/
int currid;
- /**
- * Currently active Resolver classes
- */
- Resolver* Classes[MAX_REQUEST_ID];
-
/**
* We have to turn off a few checks on received packets
* when people are using 4in6 (e.g. ::ffff:xxxx). This is
int MakePayload(const char* name, const QueryType rr, const unsigned short rr_class, unsigned char* payload);
public:
+ /**
+ * Currently active Resolver classes
+ */
+ Resolver* Classes[MAX_REQUEST_ID];
/**
* The port number DNS requests are made on,
* and replies have as a source-port number.
* Empty out a header into a data stream ready for transmission "on the wire"
*/
static void EmptyHeader(unsigned char *output, const DNSHeader *header, const int length);
- /**
- * Get the master socket fd, used internally
- */
- static int GetMasterSocket();
-
/**
* Start the lookup of an ipv4 from a hostname
*/
/**
* Handle a SocketEngine read event
+ * Inherited from EventHandler
*/
- void MarshallReads(int fd);
+ void HandleEvent(EventType et, int errornum = 0);
/**
* Add a Resolver* to the list of active classes
* Turn an in6_addr into a .ip6.arpa domain
*/
static void MakeIP6Int(char* query, const in6_addr *ip);
+
+ /**
+ * Clean out all dns resolvers owned by a particular
+ * module, to make unloading a module safe if there
+ * are dns requests currently in progress.
+ */
+ void CleanResolvers(Module* module);
};
#endif