X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdns.cpp;h=bdb7889a56899a381eabe057a3ca10580cd5baa8;hb=84a19a9ab6129deb71cdc24b216b74dd8eb80978;hp=d4fe1398b0d023131a6a0f471a1e90d9dad8b715;hpb=93af9b93f3790b1ca3a570e9715afe6a9304d536;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dns.cpp b/src/dns.cpp index d4fe1398b..bdb7889a5 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -162,7 +162,8 @@ inline void dns_empty_header(unsigned char *output, const s_header *header, cons 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) @@ -209,12 +210,12 @@ void DNS::dns_init() 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)); } @@ -683,13 +684,13 @@ DNS::DNS() 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"); @@ -699,30 +700,33 @@ DNS::~DNS() { } -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) { @@ -730,11 +734,28 @@ bool DNS::ForwardLookup(std::string host) } 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) + { + + } + 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); @@ -763,16 +784,18 @@ int DNS::GetFD() 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); @@ -792,7 +815,8 @@ std::string DNS::GetResultIP() } 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]; @@ -802,7 +826,8 @@ std::string DNS::GetResultIP() } 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 ""; } @@ -813,40 +838,40 @@ std::string DNS::GetResultIP() #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