Skip to content
Snippets Groups Projects
Commit 6256277c authored by Henrik (Grubba) Grubbström's avatar Henrik (Grubba) Grubbström
Browse files

Now scans through all nameservers and not only the last one.

Rev: lib/modules/Protocols.pmod/DNS.pmod:1.7
parent c3d843c5
No related branches found
No related tags found
No related merge requests found
...@@ -211,14 +211,21 @@ class protocol ...@@ -211,14 +211,21 @@ class protocol
class client { class client {
inherit protocol; inherit protocol;
string nameserver; array(string) nameservers = ({});
array domains = ({}); array domains = ({});
void create(void|string server) void create(void|string server)
{ {
if(!server) if(!server)
{ {
string domain; string domain;
foreach(Stdio.read_file("/etc/resolv.conf")/"\n", string line) string resolv_conf = Stdio.read_file("/etc/resolv.conf");
if (!resolv_conf) {
throw(({ "Protocols.DNS.client(): No /etc/resolv.conf!\n",
backtrace() }));
}
foreach(resolv_conf/"\n", string line)
{ {
string rest; string rest;
sscanf(line,"%s#",line); sscanf(line,"%s#",line);
...@@ -240,14 +247,17 @@ class client { ...@@ -240,14 +247,17 @@ class client {
break; break;
case "nameserver": case "nameserver":
nameserver=rest; nameservers += ({ rest });
break; break;
} }
} }
if (!sizeof(nameservers)) {
nameservers = ({ "127.0.0.1" });
}
if(domain) if(domain)
domains = ({ domain }) + domains; domains = ({ domain }) + domains;
} else { } else {
nameserver=server; nameservers= ({ server });
} }
} }
...@@ -257,12 +267,12 @@ class client { ...@@ -257,12 +267,12 @@ class client {
{ {
object udp=spider.dumUDP(); object udp=spider.dumUDP();
udp->bind(0); udp->bind(0);
udp->send(nameserver,53,s); udp->send(nameservers[0],53,s);
mapping m; mapping m;
do { do {
m=udp->read(); m=udp->read();
} while (m->port != 53 || } while (m->port != 53 ||
m->ip != nameserver || m->ip != nameservers[0] ||
m->data[0..1]!=s[0..1]); m->data[0..1]!=s[0..1]);
return decode_res(m->data); return decode_res(m->data);
} }
...@@ -391,16 +401,21 @@ class async_client ...@@ -391,16 +401,21 @@ class async_client
destruct(r); destruct(r);
} }
void retry(object(Request) r) void retry(object(Request) r, void|int nsno)
{ {
if(!r) return; if(!r) return;
if(r->retries++ > 12) if (nsno >= sizeof(nameservers)) {
{ if(r->retries++ > 12)
call_out(remove,120,r); {
}else{ call_out(remove,120,r);
call_out(retry,5,r); return;
send(nameserver,53,r->req); } else {
nsno = 0;
}
} }
send(nameservers[nsno],53,r->req);
call_out(retry,5,r,nsno+1);
} }
void do_query(string domain, int cl, int type, void do_query(string domain, int cl, int type,
...@@ -419,14 +434,14 @@ class async_client ...@@ -419,14 +434,14 @@ class async_client
r->callback=callback; r->callback=callback;
r->args=args; r->args=args;
requests[id]=r; requests[id]=r;
call_out(retry,5,r); udp::send(nameservers[0],53,r->req);
udp::send(nameserver,53,r->req); call_out(retry,5,r,1);
} }
static private void rec_data() static private void rec_data()
{ {
mapping m=udp::read(); mapping m=udp::read();
if(m->port != 53 || m->ip != nameserver) return; if(m->port != 53 || search(nameservers, m->ip) == -1) return;
sscanf(m->data,"%2c",int id); sscanf(m->data,"%2c",int id);
object r=requests[id]; object r=requests[id];
if(!r) return; if(!r) return;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment