//not seem to have any form of retry code.\r
\r
unit dnsasync;\r
-\r
+{$ifdef fpc}\r
+ {$mode delphi}\r
+{$endif}\r
interface\r
\r
+{$include lcoreconfig.inc}\r
+\r
uses\r
- {$ifdef mswindows}\r
+ {$ifdef winasyncdns}\r
dnswin,\r
{$endif}\r
lsocket,lcore,\r
classes,binipstuff,dnscore,btime,lcorernd;\r
\r
-{$include lcoreconfig.inc}\r
-\r
const\r
numsock=1{$ifdef ipv6}+1{$endif};\r
\r
\r
dnsserverids : array[0..numsock-1] of integer;\r
startts:double;\r
- {$ifdef mswindows}\r
+ {$ifdef winasyncdns}\r
dwas : tdnswinasync;\r
{$endif}\r
\r
procedure asyncprocess(socketno:integer);\r
procedure receivehandler(sender:tobject;error:word);\r
function sendquery(socketno:integer;const packet:tdnspacket;len:integer):boolean;\r
- {$ifdef mswindows}\r
+ {$ifdef winasyncdns}\r
procedure winrequestdone(sender:tobject;error:word);\r
{$endif}\r
\r
\r
end;\r
\r
+//function that the app can use to know whether the builtin or system resolver is being used\r
+function willusebuiltindns_async:boolean;\r
+\r
implementation\r
\r
uses sysutils;\r
\r
+\r
+function willusebuiltindns_async:boolean;\r
+begin\r
+ result := true;\r
+ {$ifdef winasyncdns}if usewindns and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then result := false;{$endif}\r
+end;\r
+\r
+\r
constructor tdnsasync.create;\r
begin\r
inherited create(aowner);\r
end;\r
end;\r
\r
- {$ifdef mswindows}\r
+ {$ifdef winasyncdns}\r
if assigned(dwas) then begin\r
dwas.release;\r
dwas := nil;\r
if states[socketno].resultaction <> action_done then begin\r
//we ignore packets that come after we are done\r
if dnsserverids[socketno] >= 0 then begin\r
- reportlag(dnsserverids[socketno],trunc((unixtimefloat-startts)*1000000));\r
+ reportlag(dnsserverids[socketno],trunc((wintimefloat-startts)*1000000));\r
dnsserverids[socketno] := -1;\r
end;\r
{ writeln('received reply');}\r
result := false;\r
if len = 0 then exit; {no packet}\r
if sockets[socketno].state <> wsconnected then begin\r
- startts := unixtimefloat;\r
+ startts := wintimefloat;\r
if port = '' then port := '53';\r
sockets[socketno].Proto := 'udp';\r
sockets[socketno].ondataavailable := receivehandler;\r
var\r
bip : tbinip;\r
i : integer;\r
+ willusewindns:boolean;\r
begin\r
ipstrtobin(name,bip);\r
\r
exit;\r
end;\r
\r
+ willusewindns := false;\r
+ {$ifdef winasyncdns}\r
+ if usewindns and (addr = '') and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then willusewindns := true;\r
+ {$endif}\r
+\r
if overrideaf = useaf_default then begin\r
{$ifdef ipv6}\r
- {$ifdef mswindows}if not (usewindns and (addr = '')) then{$endif}\r
- initpreferredmode;\r
+ if not willusewindns then initpreferredmode;\r
{$endif}\r
requestaf := useaf;\r
end else begin\r
requestaf := overrideaf;\r
end;\r
\r
- {$ifdef mswindows}\r
- if usewindns and (addr = '') then begin\r
+ {$ifdef winasyncdns}\r
+ if willusewindns then begin\r
dwas := tdnswinasync.create;\r
dwas.onrequestdone := winrequestdone;\r
\r
end;\r
{$endif}\r
\r
+ if (((overridednsserver = '') and (addr = '')) or hostsfile_alsocustomserver) and (not hostsfile_disabled) then begin\r
+ //try a hosts file lookup\r
+ fresultlist := hostsfile_forwardlookuplist(name);\r
+ if (biniplist_getcount(fresultlist) > 0) then begin\r
+ onrequestdone(self,0);\r
+ exit;\r
+ end;\r
+ end;\r
+\r
numsockused := 0;\r
fresultlist := biniplist_new;\r
if (requestaf <> useaf_v6) then begin\r
\r
procedure tdnsasync.reverselookup;\r
begin\r
- {$ifdef mswindows}\r
- if usewindns and (addr = '') then begin\r
+ {$ifdef winasyncdns}\r
+ if usewindns and (addr = '') and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then begin\r
dwas := tdnswinasync.create;\r
dwas.onrequestdone := winrequestdone;\r
dwas.reverselookup(binip);\r
end;\r
{$endif}\r
\r
+ if (((overridednsserver = '') and (addr = '')) or hostsfile_alsocustomserver) and (not hostsfile_disabled) then begin\r
+ //try a hosts file lookup\r
+ states[0].resultstr := hostsfile_reverselookup(binip);\r
+ if (states[0].resultstr <> '') then begin\r
+ onrequestdone(self,0);\r
+ exit;\r
+ end;\r
+ end;\r
+\r
setstate_reverse(binip,states[0]);\r
numsockused := 1;\r
asyncprocess(0);\r
var\r
socketno : integer;\r
begin\r
- {$ifdef mswindows}\r
+ {$ifdef winasyncdns}\r
if assigned(dwas) then begin\r
dwas.release;\r
dwas := nil;\r
onrequestdone(self,0);\r
end;\r
\r
-{$ifdef mswindows}\r
+{$ifdef winasyncdns}\r
procedure tdnsasync.winrequestdone(sender:tobject;error:word);\r
\r
begin\r