void dns_close(int fd)
{
#ifndef THREADED_DNS
- ServerInstance->SE->DelFd(fd);
+ if (ServerInstance && ServerInstance->SE)
+ ServerInstance->SE->DelFd(fd);
#endif
log(DEBUG,"DNS: dns_close on fd %d",fd);
if (fd == lastcreate)
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");
+ 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)
{
- ServerInstance->stats->statsDns++;
- binip = dns_aton4(ip.c_str());
- if (binip == NULL)
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDns++;
+ 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;
}
log(DEBUG,"DNS: ReverseLookup, fd=%d",this->myfd);
#ifndef THREADED_DNS
- ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS);
+ if (ServerInstance && ServerInstance->SE)
+ ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS);
#endif
return true;
}
-bool DNS::ForwardLookup(std::string host)
+bool DNS::ForwardLookup(const std::string &host)
{
- ServerInstance->stats->statsDns++;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDns++;
this->myfd = dns_getip4(host.c_str());
if (this->myfd == -1)
{
}
log(DEBUG,"DNS: ForwardLookup, fd=%d",this->myfd);
#ifndef THREADED_DNS
- ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS);
+ if (ServerInstance && ServerInstance->SE)
+ ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS);
#endif
return true;
}
+bool DNS::ForwardLookupWithFD(const std::string &host, int &fd)
+{
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDns++;
+ this->myfd = dns_getip4(host.c_str());
+ fd = this->myfd;
+ if (this->myfd == -1)
+ {
+ return false;
+ }
+ log(DEBUG,"DNS: ForwardLookupWithFD, fd=%d",this->myfd);
+ if (ServerInstance && ServerInstance->SE)
+ ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_MODULE);
+ return true;
+}
+
bool DNS::HasResult(int fd)
{
return (fd == this->myfd);
std::string DNS::GetResult()
{
log(DEBUG,"DNS: GetResult()");
- result = dns_getresult(this->myfd);
- if (result)
+ result = dns_getresult(this->myfd);
+ if (result)
{
- ServerInstance->stats->statsDnsGood++;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsGood++;
dns_close(this->myfd);
return result;
- }
+ }
else
{
- ServerInstance->stats->statsDnsBad++;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsBad++;
if (this->myfd != -1)
{
dns_close(this->myfd);
}
if (result)
{
- ServerInstance->stats->statsDnsGood++;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsGood++;
unsigned char a = (unsigned)result[0];
unsigned char b = (unsigned)result[1];
unsigned char c = (unsigned)result[2];
}
else
{
- ServerInstance->stats->statsDnsBad++;
+ if (ServerInstance && ServerInstance->stats)
+ ServerInstance->stats->statsDnsBad++;
log(DEBUG,"DANGER WILL ROBINSON! NXDOMAIN for forward lookup, but we got a reverse lookup!");
return "";
}
#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(u->ip))
- {
- 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(u->ip))
- {
- 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