X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdns.cpp;h=13a80311ad75aa555b9d0d9051c7c5065c6305d7;hb=406ab09f22f46a6cee5559e96f0325768188ffa4;hp=ffde3f2a1577d1f7079708569c865b4b2c3174e1;hpb=ade5e948783377dfb7820f8ba8957fe9ae0e3147;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dns.cpp b/src/dns.cpp index ffde3f2a1..13a80311a 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -28,6 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include #include #include +#include #include "dns.h" static const char tagstring[] = "$Id$"; @@ -94,6 +95,8 @@ struct s_header { /* DNS query header */ unsigned char payload[512]; /* DNS question, populated by dns_build_query_payload() */ }; +extern time_t TIME; + void *dns_align(void *inp) { char *p = (char*)inp; int offby = ((char *)p - (char *)0) % DNS_ALIGN; @@ -160,7 +163,7 @@ void DNS::dns_init() { /* on first call only: populates servers4 struct with up i4 = 0; initdone = 1; - srand((unsigned int) time(NULL)); + srand((unsigned int) TIME); memset(servers4,'\0',sizeof(in_addr) * DNS_MAX); f = fopen(DNS_CONFIG_FBCK,"r"); if (f == NULL) @@ -185,12 +188,8 @@ void DNS::dns_init_2(const char* dnsserver) { /* populates servers4 struct with int i; in_addr addr4; char buf[1024]; - if (initdone == 1) - return; i4 = 0; - - initdone = 1; - srand((unsigned int) time(NULL)); + srand((unsigned int) TIME); memset(servers4,'\0',sizeof(in_addr) * DNS_MAX); if (dns_aton4_s(dnsserver,&addr4) != NULL) memcpy(&servers4[i4++],&addr4,sizeof(in_addr)); @@ -211,7 +210,10 @@ static int dns_send_requests(const s_header *h, const s_connection *s, const int memcpy(&addr4.sin_addr,&servers4[i],sizeof(addr4.sin_addr)); addr4.sin_family = AF_INET; addr4.sin_port = htons(DNS_PORT); - sendto(s->fd, payload, l + 12, 0, (sockaddr *) &addr4, sizeof(addr4)); + if (sendto(s->fd, payload, l + 12, 0, (sockaddr *) &addr4, sizeof(addr4)) == -1) + { + return -1; + } } return 0; @@ -255,7 +257,7 @@ static s_connection *dns_add_query(s_header *h) { /* build DNS query, add to lis } } if (s->fd == -1) { - free(s); + delete s; return NULL; } /* create new connection object, add to linked list */ @@ -315,7 +317,7 @@ in_addr* DNS::dns_aton4_r(const char *ipstring) { /* ascii to numeric (reentrant in_addr* ip; ip = new in_addr; if(dns_aton4_s(ipstring,ip) == NULL) { - free(ip); + delete ip; return NULL; } return ip; @@ -470,7 +472,7 @@ char* DNS::dns_getresult_r(const int fd) { /* retrieve result of DNS query (reen char *result; result = new char[RESULTSIZE]; if(dns_getresult_s(fd,result) == NULL) { - free(result); + delete result; return NULL; } return result; @@ -484,6 +486,11 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D unsigned char buffer[sizeof(s_header)]; unsigned short p; + if (result) + { + result[0] = 0; + } + prev = NULL; c = connection_head; while (c != NULL) { /* find query in list of open queries */ @@ -504,28 +511,28 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D l = recv(c->fd,buffer,sizeof(s_header),0); dns_close(c->fd); if (l < 12) { - free(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]) { - free(c); + delete c; return NULL; /* ID mismatch */ } if ((h.flags1 & FLAGS1_MASK_QR) == 0) { - free(c); + delete c; return NULL; } if ((h.flags1 & FLAGS1_MASK_OPCODE) != 0) { - free(c); + delete c; return NULL; } if ((h.flags2 & FLAGS2_MASK_RCODE) != 0) { - free(c); + delete c; return NULL; } if (h.ancount < 1) { /* no sense going on if we don't have any answers */ - free(c); + delete c; return NULL; } /* skip queries */ @@ -561,7 +568,7 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D } } if (l - i < 10) { - free(c); + delete c; return NULL; } dns_fill_rr(&rr,&h.payload[i]); @@ -617,7 +624,7 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D if (rr._class != 1) break; if (rr.rdlength != 4) { - free(c); + delete c; return NULL; } memcpy(&alist->ip,&h.payload[i],4); @@ -641,7 +648,7 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D } } if (l - i < 10) { - free(c); + delete c; return NULL; } dns_fill_rr(&rr,&h.payload[i]); @@ -661,7 +668,7 @@ char* DNS::dns_getresult_s(const int fd, char *result) { /* retrieve result of D result[rr.rdlength] = '\0'; break; } - free(c); + delete c; return result; } @@ -675,6 +682,11 @@ DNS::DNS(std::string dnsserver) dns_init_2(dnsserver.c_str()); } +void DNS::SetNS(std::string dnsserver) +{ + dns_init_2(dnsserver.c_str()); +} + DNS::~DNS() { } @@ -683,10 +695,12 @@ bool DNS::ReverseLookup(std::string ip) { binip = dns_aton4(ip.c_str()); if (binip == NULL) { - fprintf(stderr,"invalid IP address.\n"); - return 2; + return false; } this->fd = dns_getname4(binip); + if (this->fd == -1) + return false; + return true; } bool DNS::ForwardLookup(std::string host) @@ -695,14 +709,16 @@ bool DNS::ForwardLookup(std::string host) bool DNS::HasResult() { - fd_set fds; - FD_ZERO(&fds); - FD_SET(this->fd,&fds); - timeval tvs; - tvs.tv_usec = 0; - tvs.tv_sec = 0; - int result = select(this->fd+1, &fds, NULL, NULL, &tvs); - return (result > 0); + pollfd polls; + polls.fd = this->fd; + polls.events = POLLIN; + int ret = poll(&polls,1,1); + return (ret > 0); +} + +int DNS::GetFD() +{ + return this->fd; } std::string DNS::GetResult()