X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/9763940f8849e5c807566157829a1e6d2c9172ee..560d0547386a23a8fb79d1919d60dfdd04b49f62:/dnsasync.pas diff --git a/dnsasync.pas b/dnsasync.pas index 59660d7..d387059 100644 --- a/dnsasync.pas +++ b/dnsasync.pas @@ -7,18 +7,20 @@ //not seem to have any form of retry code. unit dnsasync; - +{$ifdef fpc} + {$mode delphi} +{$endif} interface +{$include lcoreconfig.inc} + uses - {$ifdef mswindows} + {$ifdef winasyncdns} dnswin, {$endif} lsocket,lcore, classes,binipstuff,dnscore,btime,lcorernd; -{$include lcoreconfig.inc} - const numsock=1{$ifdef ipv6}+1{$endif}; @@ -39,7 +41,7 @@ type dnsserverids : array[0..numsock-1] of integer; startts:double; - {$ifdef mswindows} + {$ifdef winasyncdns} dwas : tdnswinasync; {$endif} @@ -49,7 +51,7 @@ type procedure asyncprocess(socketno:integer); procedure receivehandler(sender:tobject;error:word); function sendquery(socketno:integer;const packet:tdnspacket;len:integer):boolean; - {$ifdef mswindows} + {$ifdef winasyncdns} procedure winrequestdone(sender:tobject;error:word); {$endif} @@ -78,10 +80,21 @@ type end; +//function that the app can use to know whether the builtin or system resolver is being used +function willusebuiltindns_async:boolean; + implementation uses sysutils; + +function willusebuiltindns_async:boolean; +begin + result := true; + {$ifdef winasyncdns}if usewindns and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then result := false;{$endif} +end; + + constructor tdnsasync.create; begin inherited create(aowner); @@ -110,7 +123,7 @@ begin end; end; - {$ifdef mswindows} + {$ifdef winasyncdns} if assigned(dwas) then begin dwas.release; dwas := nil; @@ -147,7 +160,7 @@ begin if states[socketno].resultaction <> action_done then begin //we ignore packets that come after we are done if dnsserverids[socketno] >= 0 then begin - reportlag(dnsserverids[socketno],trunc((unixtimefloat-startts)*1000000)); + reportlag(dnsserverids[socketno],trunc((wintimefloat-startts)*1000000)); dnsserverids[socketno] := -1; end; { writeln('received reply');} @@ -170,7 +183,7 @@ begin result := false; if len = 0 then exit; {no packet} if sockets[socketno].state <> wsconnected then begin - startts := unixtimefloat; + startts := wintimefloat; if port = '' then port := '53'; sockets[socketno].Proto := 'udp'; sockets[socketno].ondataavailable := receivehandler; @@ -252,6 +265,7 @@ procedure tdnsasync.forwardlookup; var bip : tbinip; i : integer; + willusewindns:boolean; begin ipstrtobin(name,bip); @@ -263,18 +277,22 @@ begin exit; end; + willusewindns := false; + {$ifdef winasyncdns} + if usewindns and (addr = '') and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then willusewindns := true; + {$endif} + if overrideaf = useaf_default then begin {$ifdef ipv6} - {$ifdef mswindows}if not (usewindns and (addr = '')) then{$endif} - initpreferredmode; + if not willusewindns then initpreferredmode; {$endif} requestaf := useaf; end else begin requestaf := overrideaf; end; - {$ifdef mswindows} - if usewindns and (addr = '') then begin + {$ifdef winasyncdns} + if willusewindns then begin dwas := tdnswinasync.create; dwas.onrequestdone := winrequestdone; @@ -284,6 +302,15 @@ begin end; {$endif} + if (((overridednsserver = '') and (addr = '')) or hostsfile_alsocustomserver) and (not hostsfile_disabled) then begin + //try a hosts file lookup + fresultlist := hostsfile_forwardlookuplist(name); + if (biniplist_getcount(fresultlist) > 0) then begin + onrequestdone(self,0); + exit; + end; + end; + numsockused := 0; fresultlist := biniplist_new; if (requestaf <> useaf_v6) then begin @@ -305,8 +332,8 @@ end; procedure tdnsasync.reverselookup; begin - {$ifdef mswindows} - if usewindns and (addr = '') then begin + {$ifdef winasyncdns} + if usewindns and (addr = '') and (overridednsserver = '') and not (hostsfile_disabled or hostsfile_onlylocalhost) then begin dwas := tdnswinasync.create; dwas.onrequestdone := winrequestdone; dwas.reverselookup(binip); @@ -314,6 +341,15 @@ begin end; {$endif} + if (((overridednsserver = '') and (addr = '')) or hostsfile_alsocustomserver) and (not hostsfile_disabled) then begin + //try a hosts file lookup + states[0].resultstr := hostsfile_reverselookup(binip); + if (states[0].resultstr <> '') then begin + onrequestdone(self,0); + exit; + end; + end; + setstate_reverse(binip,states[0]); numsockused := 1; asyncprocess(0); @@ -342,7 +378,7 @@ procedure tdnsasync.cancel; var socketno : integer; begin - {$ifdef mswindows} + {$ifdef winasyncdns} if assigned(dwas) then begin dwas.release; dwas := nil; @@ -365,7 +401,7 @@ begin onrequestdone(self,0); end; -{$ifdef mswindows} +{$ifdef winasyncdns} procedure tdnsasync.winrequestdone(sender:tobject;error:word); begin