diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-11-10 20:13:59 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-11-10 20:13:59 +0000 |
commit | 25493049050dadfa08527c813f4209a09beab6a7 (patch) | |
tree | 65f803c34106dccef63cadbbd8a0f60fdc9fd4f5 /include | |
parent | ff7b9e9af0a502989fa88b096b2183590193e2cc (diff) |
Add fix for patch #166 (this is a reasonably big one)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5679 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'include')
-rw-r--r-- | include/dns.h | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/include/dns.h b/include/dns.h index 79b286233..4a1335cc7 100644 --- a/include/dns.h +++ b/include/dns.h @@ -48,6 +48,7 @@ using irc::sockets::insp_sockaddr; using irc::sockets::insp_inaddr; class InspIRCd; +class Module; /** * Result status, used internally @@ -69,7 +70,8 @@ enum ResolverError RESOLVER_NXDOMAIN = 2, RESOLVER_NOTREADY = 3, RESOLVER_BADIP = 4, - RESOLVER_TIMEOUT = 5 + RESOLVER_TIMEOUT = 5, + RESLOVER_FORCEUNLOAD = 6 }; /** @@ -147,6 +149,10 @@ class Resolver : public Extensible */ InspIRCd* ServerInstance; /** + * Pointer to creator module (if any, or NULL) + */ + Module* Creator; + /** * The input data, either a host or an IP address */ std::string input; @@ -193,8 +199,14 @@ class Resolver : public Extensible * 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. */ @@ -220,6 +232,11 @@ class Resolver : public Extensible * 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 @@ -364,6 +381,13 @@ class DNS : public EventHandler * 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 |