fd_utils,\r
{$endif}\r
lcorernd,\r
- sysutils;\r
+ sysutils,\r
+ ltimevalstuff;\r
\r
//convert a name to an IP\r
//will return v4 or v6 depending on what seems favorable, or manual preference setting\r
//on error the binip will have a family of 0 (other fiels are also currently\r
//zeroed out but may be used for further error information in future)\r
//timeout is in miliseconds, it is ignored when using windows dns\r
-function forwardlookup(name:string;timeout:integer):tbinip;\r
+function forwardlookup(name:ansistring;timeout:integer):tbinip;\r
\r
//convert a name to a list of all IP's returned\r
//this returns both v4 and v6 IP's, or possibly only v4 or v6, depending on settings\r
//on error, returns an empty list\r
-function forwardlookuplist(name:string;timeout:integer):tbiniplist;\r
+function forwardlookuplist(name:ansistring;timeout:integer):tbiniplist;\r
\r
\r
//convert an IP to a name, on error a null string will be returned, other\r
//details as above\r
-function reverselookup(ip:tbinip;timeout:integer):string;\r
+function reverselookup(ip:tbinip;timeout:integer):ansistring;\r
\r
\r
\r
{$endif}\r
\r
{$i unixstuff.inc}\r
-{$i ltimevalstuff.inc}\r
\r
+\r
+{$ifdef syncdnscore}\r
var\r
numsockused:integer;\r
fd:array[0..numsock-1] of integer;\r
state:array[0..numsock-1] of tdnsstate;\r
toaddr:array[0..numsock-1] of tbinip;\r
\r
-{$ifdef syncdnscore}\r
-\r
{$ifdef win32}\r
const\r
winsocket = 'wsock32.dll';\r
\r
function sendquery(socknum:integer;const packet:tdnspacket;len:integer):boolean;\r
var\r
- a:integer;\r
- addr : string;\r
- port : string;\r
+ ip : tbinip;\r
+ port : ansistring;\r
inaddr : TInetSockAddrV;\r
begin\r
{ writeln('sendquery ',decodename(state.packet,state.packetlen,12,0,a),' ',state.requesttype);}\r
result := false;\r
if len = 0 then exit; {no packet}\r
\r
- if overridednsserver <> '' then addr := overridednsserver else addr := getcurrentsystemnameserver(id);\r
+ ip := getcurrentsystemnameserverbin(id);\r
\r
{$ifdef ipv6}{$ifdef win32}\r
if toaddr[socknum].family = AF_INET6 then if (useaf = 0) then useaf := useaf_preferv6;\r
{$endif}{$endif}\r
\r
port := toport;\r
- toaddr[socknum] := ipstrtobinf(addr);\r
+ toaddr[socknum] := ip;\r
makeinaddrv(toaddr[socknum],port,inaddr);\r
\r
sendto(fd[socknum],packet,len,0,inaddr,inaddrsize(inaddr));\r
inAddrtemp : TInetSockAddrV;\r
a:integer;\r
biniptemp:tbinip;\r
- addr:string;\r
+\r
begin\r
//init both sockets smultaneously, always, so they get succesive fd's\r
- if fd[0] > 0 then exit;\r
\r
- if overridednsserver <> '' then addr := overridednsserver else addr := getcurrentsystemnameserver(id);\r
- //must get the DNS server here so we know to init v4 or v6\r
+ {recreate sockets every time, reusing them will fail (hang) if the nameserver is changed\r
+ also changing the nameserver can't possibly work}\r
+ {if fd[0] > 0 then exit;}\r
+ for a := 0 to numsock-1 do if (fd[a] > 0) then closesocket(fd[a]);\r
\r
- ipstrtobin(addr,biniptemp);\r
+ biniptemp := getcurrentsystemnameserverbin(id);\r
+ //must get the DNS server here so we know to init v4 or v6\r
\r
if biniptemp.family = AF_INET6 then biniptemp := ipstrtobinf('::') else biniptemp := ipstrtobinf('0.0.0.0');\r
\r
currenttime : integer;\r
\r
lag : ttimeval;\r
- currenttimeout : ttimeval;\r
selecttimeout : ttimeval;\r
socknum:integer;\r
needprocessing:array[0..numsock-1] of boolean;\r
Srcx : {$ifdef win32}sockaddr_in{$else}TInetSockAddrV{$endif} absolute Src;\r
SrcLen : Integer;\r
fromip:tbinip;\r
- fromport:string;\r
+ fromport:ansistring;\r
\r
begin\r
if timeout < mintimeout then timeout := defaulttimeout;\r
fillchar(state[socknum].recvpacket,sizeof(state[socknum].recvpacket),0);\r
msectotimeval(lag,(currenttime-sendquerytime[socknum]) and tsmask);\r
\r
- if overridednsserver = '' then reportlag(id,(lag.tv_sec*1000000)+lag.tv_usec);\r
+ reportlag(id,(lag.tv_sec*1000000)+lag.tv_usec);\r
\r
SrcLen := SizeOf(Src);\r
state[socknum].recvpacketlen := recvfrom(fd[socknum],state[socknum].recvpacket, SizeOf(state[socknum].recvpacket),0,Srcx,SrcLen);\r
\r
currenttime := getts;\r
\r
- if overridednsserver = '' then reportlag(id,-1);\r
+ reportlag(id,-1);\r
if (currenttime >= endtime) and ((not wrapmode) or (currenttime < starttime)) then begin\r
exit;\r
end else begin\r
\r
\r
\r
-function forwardlookuplist(name:string;timeout:integer):tbiniplist;\r
+function forwardlookuplist(name:ansistring;timeout:integer):tbiniplist;\r
var\r
dummy : integer;\r
- a,b:integer;\r
+ a:integer;\r
biniptemp:tbinip;\r
l:tbiniplist;\r
begin\r
end;\r
end;\r
\r
-function forwardlookup(name:string;timeout:integer):tbinip;\r
+function forwardlookup(name:ansistring;timeout:integer):tbinip;\r
var\r
listtemp:tbiniplist;\r
begin\r
result := biniplist_get(listtemp,0);\r
end;\r
\r
-function reverselookup(ip:tbinip;timeout:integer):string;\r
+function reverselookup(ip:tbinip;timeout:integer):ansistring;\r
var\r
dummy : integer;\r
begin\r