* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
ServerInstance->Res->Classes[watchid] = NULL;
}
ServerInstance->Res->requests[watchid] = NULL;
- DELETE(watch);
+ delete watch;
return;
}
}
};
/* Allocate the processing buffer */
-DNSRequest::DNSRequest(InspIRCd* Instance, DNS* dns, int id, const std::string &original) : dnsobj(dns), ServerInstance(Instance)
+DNSRequest::DNSRequest(InspIRCd* Instance, DNS* dns, int rid, const std::string &original) : dnsobj(dns), ServerInstance(Instance)
{
res = new unsigned char[512];
*res = 0;
orig = original;
- RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout ? Instance->Config->dns_timeout : 5, Instance, this, id);
+ RequestTimeout* RT = new RequestTimeout(Instance->Config->dns_timeout ? Instance->Config->dns_timeout : 5, Instance, this, rid);
Instance->Timers->AddTimer(RT); /* The timer manager frees this */
}
/** Send requests we have previously built down the UDP socket */
int DNSRequest::SendRequests(const DNSHeader *header, const int length, QueryType qt)
{
+ ServerInstance->Logs->Log("RESOLVER", DEBUG,"DNSRequest::SendRequests");
+
unsigned char payload[sizeof(DNSHeader)];
this->rr_class = 1;
if (ServerInstance->SE->SendTo(dnsobj, (const char*)payload, length + 12, 0, (sockaddr *) &addr, sizeof(addr)) != length+12)
return -1;
}
+
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Sent OK");
return 0;
}
if ((strstr(ServerInstance->Config->DNSServer,"::ffff:") == (char*)&ServerInstance->Config->DNSServer) || (strstr(ServerInstance->Config->DNSServer,"::FFFF:") == (char*)&ServerInstance->Config->DNSServer))
{
- ServerInstance->Log(DEFAULT,"WARNING: Using IPv4 addresses over IPv6 forces some DNS checks to be disabled.");
- ServerInstance->Log(DEFAULT," This should not cause a problem, however it is recommended you migrate");
- ServerInstance->Log(DEFAULT," to a true IPv6 environment.");
+ ServerInstance->Logs->Log("RESOLVER",DEFAULT,"WARNING: Using IPv4 addresses over IPv6 forces some DNS checks to be disabled.");
+ ServerInstance->Logs->Log("RESOLVER",DEFAULT," This should not cause a problem, however it is recommended you migrate");
+ ServerInstance->Logs->Log("RESOLVER",DEFAULT," to a true IPv6 environment.");
this->ip6munge = true;
}
if (!ServerInstance->BindSocket(this->GetFd(), portpass, "", false))
{
/* Failed to bind */
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Error binding dns socket");
ServerInstance->SE->Shutdown(this, 2);
ServerInstance->SE->Close(this);
this->SetFd(-1);
{
if (!ServerInstance->SE->AddFd(this))
{
- ServerInstance->Log(DEFAULT,"Internal error starting DNS - hostnames will NOT resolve.");
+ ServerInstance->Logs->Log("RESOLVER",DEFAULT,"Internal error starting DNS - hostnames will NOT resolve.");
ServerInstance->SE->Shutdown(this, 2);
ServerInstance->SE->Close(this);
this->SetFd(-1);
}
}
}
+ else
+ {
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Error creating dns socket");
+ }
}
/** Initialise the DNS UDP socket so that we can send requests */
DNS::DNS(InspIRCd* Instance) : ServerInstance(Instance)
{
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"DNS::DNS");
/* Clear the Resolver class table */
memset(Classes,0,sizeof(Classes));
rr.type = DNS_QUERY_NONE;
rr.rdlength = 0;
rr.ttl = 1; /* GCC is a whiney bastard -- see the XXX below. */
+ rr.rr_class = 0; /* Same for VC++ */
if (!(header.flags1 & FLAGS_MASK_QR))
return std::make_pair((unsigned char*)NULL,"Not a query result");
break;
}
if ((unsigned int)curanswer == header.ancount)
- return std::make_pair((unsigned char*)NULL,"No more records");
+ return std::make_pair((unsigned char*)NULL,"No more answers (" + ConvToStr(header.ancount) + " answers, wanted #" + ConvToStr(result_we_want) + ")");
if (i + rr.rdlength > (unsigned int)length)
return std::make_pair((unsigned char*)NULL,"Resource record larger than stated");
ServerInstance->SE->Shutdown(this, 2);
ServerInstance->SE->Close(this);
ServerInstance->Timers->DelTimer(this->PruneTimer);
- delete this->PruneTimer;
}
CachedQuery* DNS::GetCache(const std::string &source)
/** High level abstraction of dns used by application at large */
Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, bool &cached, Module* creator) : ServerInstance(Instance), Creator(creator), input(source), querytype(qt)
{
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Resolver::Resolver");
cached = false;
CQ = ServerInstance->Res->GetCache(source);
/* We shouldnt get here really */
return;
}
+ else
+ {
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"DNS request id %d", this->myid);
+ }
}
/** Called when an error occurs */
int resultnum = 0;
DNSResult res(0,"",0,"");
res.id = 0;
- ServerInstance->Log(DEBUG,"Handle DNS event");
- while ((res.id & ERROR_MASK) == 0)
- {
- res = this->GetResult(resultnum);
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Handle DNS event");
- ServerInstance->Log(DEBUG,"Result %d id %d", resultnum, res.id);
+ res = this->GetResult(resultnum);
+
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"Result %d id %d", resultnum, res.id);
- /* Is there a usable request id? */
- if (res.id != -1)
+ /* Is there a usable request id? */
+ if (res.id != -1)
+ {
+ /* Its an error reply */
+ if (res.id & ERROR_MASK)
{
- /* Its an error reply */
- if (res.id & ERROR_MASK)
+ /* Mask off the error bit */
+ res.id -= ERROR_MASK;
+ /* Marshall the error to the correct class */
+ if (Classes[res.id])
{
- /* Mask off the error bit */
- res.id -= ERROR_MASK;
- /* Marshall the error to the correct class */
- if (Classes[res.id])
- {
- if (ServerInstance && ServerInstance->stats)
- ServerInstance->stats->statsDnsBad++;
- Classes[res.id]->OnError(RESOLVER_NXDOMAIN, res.result);
- delete Classes[res.id];
- Classes[res.id] = NULL;
- }
- break;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsBad++;
+ Classes[res.id]->OnError(RESOLVER_NXDOMAIN, res.result);
+ delete Classes[res.id];
+ Classes[res.id] = NULL;
}
- else
+ return;
+ }
+ else
+ {
+ /* It is a non-error result, marshall the result to the correct class */
+ if (Classes[res.id])
{
- /* It is a non-error result, marshall the result to the correct class */
- if (Classes[res.id])
- {
- if (ServerInstance && ServerInstance->stats)
- ServerInstance->stats->statsDnsGood++;
-
- if (!this->GetCache(res.original.c_str()))
- this->cache->insert(std::make_pair(res.original.c_str(), CachedQuery(res.result, res.ttl)));
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsGood++;
- Classes[res.id]->OnLookupComplete(res.result, res.ttl, false, resultnum);
- delete Classes[res.id];
- Classes[res.id] = NULL;
- }
+ if (!this->GetCache(res.original.c_str()))
+ this->cache->insert(std::make_pair(res.original.c_str(), CachedQuery(res.result, res.ttl)));
+
+ Classes[res.id]->OnLookupComplete(res.result, res.ttl, false, resultnum);
+ delete Classes[res.id];
+ Classes[res.id] = NULL;
}
-
- if (ServerInstance && ServerInstance->stats)
- ServerInstance->stats->statsDns++;
}
-
- resultnum++;
+
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDns++;
}
+
+ resultnum++;
}
/** Add a derived Resolver to the working set */
bool DNS::AddResolverClass(Resolver* r)
{
+ ServerInstance->Logs->Log("RESOLVER",DEBUG,"AddResolverClass 0x%08lx", (unsigned long)r);
/* Check the pointers validity and the id's validity */
if ((r) && (r->GetId() > -1))
{
return val;
}
+