hosts file support in the built in dns resolver
[lcore.git] / dnsasync.pas
index 68b5c1f3adf3573b1a710c1808441a950eea8dd5..d3870591318bb5ff42f8a81d7c5945f35fbeb4e7 100644 (file)
@@ -7,9 +7,13 @@
 //not seem to have any form of retry code.\r
 \r
 unit dnsasync;\r
 //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
 interface\r
 \r
+{$include lcoreconfig.inc}\r
+\r
 uses\r
   {$ifdef winasyncdns}\r
     dnswin,\r
 uses\r
   {$ifdef winasyncdns}\r
     dnswin,\r
@@ -17,8 +21,6 @@ uses
   lsocket,lcore,\r
   classes,binipstuff,dnscore,btime,lcorernd;\r
 \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
 const\r
   numsock=1{$ifdef ipv6}+1{$endif};\r
 \r
@@ -78,10 +80,21 @@ type
 \r
   end;\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
 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
 constructor tdnsasync.create;\r
 begin\r
   inherited create(aowner);\r
@@ -147,7 +160,7 @@ begin
   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
   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
       dnsserverids[socketno] := -1;\r
     end;\r
   {  writeln('received reply');}\r
@@ -170,7 +183,7 @@ begin
   result := false;\r
   if len = 0 then exit; {no packet}\r
   if sockets[socketno].state <> wsconnected then begin\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
     if port = '' then port := '53';\r
     sockets[socketno].Proto := 'udp';\r
     sockets[socketno].ondataavailable := receivehandler;\r
@@ -252,6 +265,7 @@ procedure tdnsasync.forwardlookup;
 var\r
   bip : tbinip;\r
   i : integer;\r
 var\r
   bip : tbinip;\r
   i : integer;\r
+  willusewindns:boolean;\r
 begin\r
   ipstrtobin(name,bip);\r
 \r
 begin\r
   ipstrtobin(name,bip);\r
 \r
@@ -263,10 +277,14 @@ begin
     exit;\r
   end;\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
   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
     {$endif}\r
     requestaf := useaf;\r
   end else begin\r
@@ -274,7 +292,7 @@ begin
   end;\r
 \r
   {$ifdef winasyncdns}\r
   end;\r
 \r
   {$ifdef winasyncdns}\r
-    if usewindns and (addr = '') then begin\r
+    if willusewindns then begin\r
       dwas := tdnswinasync.create;\r
       dwas.onrequestdone := winrequestdone;\r
 \r
       dwas := tdnswinasync.create;\r
       dwas.onrequestdone := winrequestdone;\r
 \r
@@ -284,6 +302,15 @@ begin
     end;\r
   {$endif}\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
   numsockused := 0;\r
   fresultlist := biniplist_new;\r
   if (requestaf <> useaf_v6) then begin\r
@@ -306,7 +333,7 @@ end;
 procedure tdnsasync.reverselookup;\r
 begin\r
   {$ifdef winasyncdns}\r
 procedure tdnsasync.reverselookup;\r
 begin\r
   {$ifdef winasyncdns}\r
-    if usewindns and (addr = '') then begin\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
       dwas := tdnswinasync.create;\r
       dwas.onrequestdone := winrequestdone;\r
       dwas.reverselookup(binip);\r
@@ -314,6 +341,15 @@ begin
     end;\r
   {$endif}\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
+    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
   setstate_reverse(binip,states[0]);\r
   numsockused := 1;\r
   asyncprocess(0);\r