]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/dns.cpp
Changed to non-conflicting numeric 948 for invalid idle time
[user/henk/code/inspircd.git] / src / dns.cpp
index ffde3f2a1577d1f7079708569c865b4b2c3174e1..13a80311ad75aa555b9d0d9051c7c5065c6305d7 100644 (file)
@@ -28,6 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #include <stdio.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <poll.h>
 #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()