void DNS::dns_init_2(const char* dnsserver)
{
- in_addr addr4;
- i4 = 0;
- srand((unsigned int) TIME);
- memset(servers4,'\0',sizeof(in_addr) * 8);
- if (dns_aton4_s(dnsserver,&addr4) != NULL)
- memcpy(&servers4[i4++],&addr4,sizeof(in_addr));
+ in_addr addr4;
+ i4 = 0;
+ srand((unsigned int) TIME);
+ memset(servers4,'\0',sizeof(in_addr) * 8);
+ if (dns_aton4_s(dnsserver,&addr4) != NULL)
+ memcpy(&servers4[i4++],&addr4,sizeof(in_addr));
}
}
if (s->fd == -1)
{
- delete s;
+ DELETE(s);
return NULL;
}
/* create new connection object, add to linked list */
ip = new in_addr;
if(dns_aton4_s(ipstring,ip) == NULL)
{
- delete ip;
+ DELETE(ip);
return NULL;
}
return ip;
dns_close(c->fd);
if (l < 12)
{
- delete c;
+ DELETE(c);
return NULL;
}
dns_fill_header(&h,buffer,l - 12);
if (c->id[0] != h.id[0] || c->id[1] != h.id[1])
{
log(DEBUG,"DNS: id mismatch on query");
- delete c;
+ DELETE(c);
return NULL; /* ID mismatch */
}
if ((h.flags1 & FLAGS1_MASK_QR) == 0)
{
log(DEBUG,"DNS: didnt get a query result");
- delete c;
+ DELETE(c);
return NULL;
}
if ((h.flags1 & FLAGS1_MASK_OPCODE) != 0)
{
log(DEBUG,"DNS: got an OPCODE and didnt want one");
- delete c;
+ DELETE(c);
return NULL;
}
if ((h.flags2 & FLAGS2_MASK_RCODE) != 0)
{
log(DEBUG,"DNS lookup failed due to SERVFAIL");
- delete c;
+ DELETE(c);
return NULL;
}
if (h.ancount < 1)
{
log(DEBUG,"DNS: no answers!");
- delete c;
+ DELETE(c);
return NULL;
}
i = 0;
}
if (l - i < 10)
{
- delete c;
+ DELETE(c);
return NULL;
}
dns_fill_rr(&rr,&h.payload[i]);
break;
if (rr.rdlength != 4)
{
- delete c;
+ DELETE(c);
return NULL;
}
memcpy(&alist->ip,&h.payload[i],4);
}
if (l - i < 10)
{
- delete c;
+ DELETE(c);
return NULL;
}
dns_fill_rr(&rr,&h.payload[i]);
res[rr.rdlength] = '\0';
break;
}
- delete c;
+ DELETE(c);
return res;
}
log(DEBUG,"Create blank DNS");
}
-DNS::DNS(std::string dnsserver)
+DNS::DNS(const std::string &dnsserver)
{
dns_init_2(dnsserver.c_str());
log(DEBUG,"Create DNS with server '%s'",dnsserver.c_str());
}
-void DNS::SetNS(std::string dnsserver)
+void DNS::SetNS(const std::string &dnsserver)
{
dns_init_2(dnsserver.c_str());
log(DEBUG,"Set NS");
{
}
-bool DNS::ReverseLookup(std::string ip)
+bool DNS::ReverseLookup(const std::string &ip)
{
if (ServerInstance && ServerInstance->stats)
ServerInstance->stats->statsDns++;
- binip = dns_aton4(ip.c_str());
- if (binip == NULL)
+ binip = dns_aton4(ip.c_str());
+ if (binip == NULL)
{
- return false;
- }
+ return false;
+ }
- this->myfd = dns_getname4(binip);
+ this->myfd = dns_getname4(binip);
if (this->myfd == -1)
{
return false;
return true;
}
-bool DNS::ForwardLookup(std::string host)
+bool DNS::ForwardLookup(const std::string &host)
{
if (ServerInstance && ServerInstance->stats)
ServerInstance->stats->statsDns++;
return true;
}
-bool DNS::ForwardLookupWithFD(std::string host, int &fd)
+bool DNS::ForwardLookupWithFD(const std::string &host, int &fd)
{
if (ServerInstance && ServerInstance->stats)
ServerInstance->stats->statsDns++;
fd = this->myfd;
if (this->myfd == -1)
{
-
+ return false;
}
log(DEBUG,"DNS: ForwardLookupWithFD, fd=%d",this->myfd);
if (ServerInstance && ServerInstance->SE)
std::string DNS::GetResult()
{
log(DEBUG,"DNS: GetResult()");
- result = dns_getresult(this->myfd);
- if (result)
+ result = dns_getresult(this->myfd);
+ if (result)
{
if (ServerInstance && ServerInstance->stats)
ServerInstance->stats->statsDnsGood++;
dns_close(this->myfd);
return result;
- }
+ }
else
{
if (ServerInstance && ServerInstance->stats)
#ifdef THREADED_DNS
void* dns_task(void* arg)
{
- userrec* u = (userrec*)arg;
- log(DEBUG,"DNS thread for user %s",u->nick);
- DNS dns1;
- DNS dns2;
- std::string host;
- std::string ip;
- if (dns1.ReverseLookup((char*)inet_ntoa(u->ip4)))
- {
- while (!dns1.HasResult())
- {
- usleep(100);
- }
- host = dns1.GetResult();
- if (host != "")
- {
- if (dns2.ForwardLookup(host))
- {
- while (!dns2.HasResult())
- {
- usleep(100);
- }
- ip = dns2.GetResultIP();
- if (ip == std::string((char*)inet_ntoa(u->ip4)))
- {
- if (host.length() < 160)
- {
- strcpy(u->host,host.c_str());
- strcpy(u->dhost,host.c_str());
- }
- }
- }
- }
- }
- u->dns_done = true;
- return NULL;
+ userrec* u = (userrec*)arg;
+ log(DEBUG,"DNS thread for user %s",u->nick);
+ DNS dns1;
+ DNS dns2;
+ std::string host;
+ std::string ip;
+ if (dns1.ReverseLookup((char*)inet_ntoa(u->ip4)))
+ {
+ while (!dns1.HasResult())
+ {
+ usleep(100);
+ }
+ host = dns1.GetResult();
+ if (host != "")
+ {
+ if (dns2.ForwardLookup(host))
+ {
+ while (!dns2.HasResult())
+ {
+ usleep(100);
+ }
+ ip = dns2.GetResultIP();
+ if (ip == std::string((char*)inet_ntoa(u->ip4)))
+ {
+ if (host.length() < 160)
+ {
+ strcpy(u->host,host.c_str());
+ strcpy(u->dhost,host.c_str());
+ }
+ }
+ }
+ }
+ }
+ u->dns_done = true;
+ return NULL;
}
#endif