#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
+#include <poll.h>
#include "dns.h"
static const char tagstring[] = "$Id$";
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;
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)
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));
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;
}
}
if (s->fd == -1) {
- free(s);
+ delete s;
return NULL;
}
/* create new connection object, add to linked list */
in_addr* ip;
ip = new in_addr;
if(dns_aton4_s(ipstring,ip) == NULL) {
- free(ip);
+ delete ip;
return NULL;
}
return ip;
char *result;
result = new char[RESULTSIZE];
if(dns_getresult_s(fd,result) == NULL) {
- free(result);
+ delete result;
return NULL;
}
return result;
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 */
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 */
}
}
if (l - i < 10) {
- free(c);
+ delete c;
return NULL;
}
dns_fill_rr(&rr,&h.payload[i]);
if (rr._class != 1)
break;
if (rr.rdlength != 4) {
- free(c);
+ delete c;
return NULL;
}
memcpy(&alist->ip,&h.payload[i],4);
}
}
if (l - i < 10) {
- free(c);
+ delete c;
return NULL;
}
dns_fill_rr(&rr,&h.payload[i]);
result[rr.rdlength] = '\0';
break;
}
- free(c);
+ delete c;
return result;
}
dns_init_2(dnsserver.c_str());
}
+void DNS::SetNS(std::string dnsserver)
+{
+ dns_init_2(dnsserver.c_str());
+}
+
DNS::~DNS()
{
}
{
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)
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()