]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/dns.cpp
Untested! New m_watch that should be hundreds of times faster (im not joking either)
[user/henk/code/inspircd.git] / src / dns.cpp
index 3836e6f65ad6624f4f09eda8261afe1cbca01230..0e0f3287466e3931c003febfc1917e903fac6091 100644 (file)
@@ -94,12 +94,12 @@ class DNSHeader
 class DNSRequest
 {
  public:
-       unsigned char   id[2];          /* Request id */
-       unsigned char*  res;            /* Result processing buffer */
+       unsigned char   id[2];          /* Request id */
+       unsigned char*  res;            /* Result processing buffer */
        unsigned int    rr_class;       /* Request class */
-       QueryType       type;           /* Request type */
+       QueryType       type;           /* Request type */
        insp_inaddr     myserver;       /* DNS server address*/
-       DNS*            dnsobj;         /* DNS caller (where we get our FD from) */
+       DNS*            dnsobj;         /* DNS caller (where we get our FD from) */
 
        DNSRequest(InspIRCd* Instance, DNS* dns, insp_inaddr server, int id, requestlist &requests);
        ~DNSRequest();
@@ -148,7 +148,7 @@ DNSRequest::DNSRequest(InspIRCd* Instance, DNS* dns, insp_inaddr server, int id,
        res = new unsigned char[512];
        *res = 0;
        memcpy(&myserver, &server, sizeof(insp_inaddr));
-       RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout, Instance, this, id, requests);
+       RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout ? Instance->Config->dns_timeout : 5, Instance, this, id, requests);
        Instance->Timers->AddTimer(RT); /* The timer manager frees this */
 }
 
@@ -468,10 +468,15 @@ int DNS::GetName(const insp_inaddr *ip)
        int length;
 
 #ifdef IPV6
-       DNS::MakeIP6Int(query, (in6_addr*)ip);
+       unsigned char* c = (unsigned char*)&ip->s6_addr;
+       if (c[0] == 0 && c[1] == 0 && c[2] == 0 && c[3] == 0 &&
+           c[4] == 0 && c[5] == 0 && c[6] == 0 && c[7] == 0 &&
+           c[8] == 0 && c[9] == 0 && c[10] == 0xFF && c[11] == 0xFF)
+               sprintf(query,"%d.%d.%d.%d.in-addr.arpa",c[15],c[14],c[13],c[12]);
+       else
+               DNS::MakeIP6Int(query, (in6_addr*)ip);
 #else
        unsigned char* c = (unsigned char*)&ip->s_addr;
-
        sprintf(query,"%d.%d.%d.%d.in-addr.arpa",c[3],c[2],c[1],c[0]);
 #endif
 
@@ -726,7 +731,11 @@ DNSInfo DNSRequest::ResultIsReady(DNSHeader &header, int length)
        int curanswer, o;
        ResourceRecord rr;
        unsigned short ptr;
-                       
+
+       /* This is just to keep _FORTIFY_SOURCE happy */
+       rr.type = DNS_QUERY_NONE;
+       rr.rdlength = 0;
+
        if (!(header.flags1 & FLAGS_MASK_QR))
                return std::make_pair((unsigned char*)NULL,"Not a query result");
 
@@ -865,7 +874,7 @@ DNS::~DNS()
 }
 
 /** High level abstraction of dns used by application at large */
-Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt) : ServerInstance(Instance), input(source), querytype(qt)
+Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, Module* creator) : ServerInstance(Instance), Creator(creator), input(source), querytype(qt)
 {
        ServerInstance->Log(DEBUG,"Instance: %08x %08x",Instance, ServerInstance);
 
@@ -943,8 +952,13 @@ int Resolver::GetId()
        return this->myid;
 }
 
+Module* Resolver::GetCreator()
+{
+       return this->Creator;
+}
+
 /** Process a socket read event */
-void DNS::HandleEvent(EventType et)
+void DNS::HandleEvent(EventType et, int errornum)
 {
        ServerInstance->Log(DEBUG,"Marshall reads: %d",this->GetFd());
        /* Fetch the id and result of the next available packet */
@@ -1020,6 +1034,22 @@ bool DNS::AddResolverClass(Resolver* r)
        }
 }
 
+void DNS::CleanResolvers(Module* module)
+{
+       for (int i = 0; i < MAX_REQUEST_ID; i++)
+       {
+               if (Classes[i])
+               {
+                       if (Classes[i]->GetCreator() == module)
+                       {
+                               Classes[i]->OnError(RESLOVER_FORCEUNLOAD, "Parent module is unloading");
+                               delete Classes[i];
+                               Classes[i] = NULL;
+                       }
+               }
+       }
+}
+
 /** Generate pseudo-random number */
 unsigned long DNS::PRNG()
 {