fix slow send speed, new fifo allows get of entire buffer
[lcore.git] / dnsasync.pas
index 4efc20545d014802130f3a0df3eca20617ff7c93..5e72cc040b140ac9b3d2eb8d419ada89879870b9 100644 (file)
@@ -7,18 +7,20 @@
 //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 win32}\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
@@ -39,7 +41,7 @@ type
 \r
     dnsserverids : array[0..numsock-1] of integer;\r
     startts:double;\r
-    {$ifdef win32}\r
+    {$ifdef winasyncdns}\r
       dwas : tdnswinasync;\r
     {$endif}\r
 \r
@@ -49,7 +51,7 @@ type
     procedure asyncprocess(socketno:integer);\r
     procedure receivehandler(sender:tobject;error:word);\r
     function sendquery(socketno:integer;const packet:tdnspacket;len:integer):boolean;\r
-    {$ifdef win32}\r
+    {$ifdef winasyncdns}\r
       procedure winrequestdone(sender:tobject;error:word);\r
     {$endif}\r
 \r
@@ -57,7 +59,7 @@ type
     onrequestdone:tsocketevent;\r
 \r
     //addr and port allow the application to specify a dns server specifically\r
-    //for this dnsasync object. This is not a reccomended mode of operation\r
+    //for this dnsasync object. This is not a recommended mode of operation\r
     //because it limits the app to one dns server but is kept for compatibility\r
     //and special uses.\r
     addr,port:ansistring;\r
@@ -69,7 +71,7 @@ type
     procedure dnsresultbin(var binip:tbinip); //get result of dnslookup as a tbinip\r
     property dnsresultlist : tbiniplist read fresultlist;\r
     procedure forwardlookup(const name:ansistring); //start forward lookup,\r
-                                                //preffering ipv4\r
+                                                //preferring ipv4\r
     procedure reverselookup(const binip:tbinip); //start reverse lookup\r
     procedure customlookup(const name:ansistring;querytype:integer); //start custom type lookup\r
 \r
@@ -109,6 +111,14 @@ begin
       setstate_request_init('',states[socketno]);\r
     end;\r
   end;\r
+\r
+  {$ifdef winasyncdns}\r
+  if assigned(dwas) then begin\r
+    dwas.release;\r
+    dwas := nil;\r
+  end;\r
+  {$endif}\r
+\r
   inherited destroy;\r
 end;\r
 \r
@@ -139,7 +149,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
-      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
@@ -153,7 +163,7 @@ end;
 \r
 function tdnsasync.sendquery(socketno:integer;const packet:tdnspacket;len:integer):boolean;\r
 var\r
-  destination : ansistring;\r
+  destination : tbinip;\r
   inaddr : tinetsockaddrv;\r
   trytolisten:integer;\r
 begin\r
@@ -162,7 +172,7 @@ begin
   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
@@ -185,13 +195,13 @@ begin
   end;\r
   if addr <> '' then begin\r
     dnsserverids[socketno] := -1;\r
-    destination := addr\r
+    destination := ipstrtobinf(addr);\r
   end else begin\r
-    destination := getcurrentsystemnameserver(dnsserverids[socketno]);\r
+    destination := getcurrentsystemnameserverbin(dnsserverids[socketno]);\r
   end;\r
-  destinations[socketno] := ipstrtobinf(destination);\r
+  destinations[socketno] := destination;\r
 \r
-  {$ifdef ipv6}{$ifdef win32}\r
+  {$ifdef ipv6}{$ifdef mswindows}\r
   if destinations[socketno].family = AF_INET6 then if (requestaf = useaf_default) then requestaf := useaf_preferv6;\r
   {$endif}{$endif}\r
 \r
@@ -255,11 +265,9 @@ begin
     exit;\r
   end;\r
 \r
-  if (overridednsserver <> '') and (addr = '') then addr := overridednsserver;\r
-\r
   if overrideaf = useaf_default then begin\r
     {$ifdef ipv6}\r
-      {$ifdef win32}if not (usewindns and (addr = '')) then{$endif}\r
+      {$ifdef winasyncdns}if not (usewindns and (addr = '') and (overridednsserver = '')) then{$endif}\r
       initpreferredmode;\r
     {$endif}\r
     requestaf := useaf;\r
@@ -267,8 +275,8 @@ begin
     requestaf := overrideaf;\r
   end;\r
 \r
-  {$ifdef win32}\r
-    if usewindns and (addr = '') then begin\r
+  {$ifdef winasyncdns}\r
+    if usewindns and (addr = '') and (overridednsserver = '') then begin\r
       dwas := tdnswinasync.create;\r
       dwas.onrequestdone := winrequestdone;\r
 \r
@@ -299,8 +307,7 @@ end;
 \r
 procedure tdnsasync.reverselookup;\r
 begin\r
-  if (overridednsserver <> '') and (addr = '') then addr := overridednsserver;\r
-  {$ifdef win32}\r
+  {$ifdef winasyncdns}\r
     if usewindns and (addr = '') then begin\r
       dwas := tdnswinasync.create;\r
       dwas.onrequestdone := winrequestdone;\r
@@ -316,7 +323,6 @@ end;
 \r
 procedure tdnsasync.customlookup;\r
 begin\r
-  if (overridednsserver <> '') and (addr = '') then addr := overridednsserver;\r
   setstate_custom(name,querytype,states[0]);\r
   numsockused := 1;\r
   asyncprocess(0);\r
@@ -338,7 +344,7 @@ procedure tdnsasync.cancel;
 var\r
   socketno : integer;\r
 begin\r
-  {$ifdef win32}\r
+  {$ifdef winasyncdns}\r
     if assigned(dwas) then begin\r
       dwas.release;\r
       dwas := nil;\r
@@ -361,7 +367,7 @@ begin
   onrequestdone(self,0);\r
 end;\r
 \r
-{$ifdef win32}\r
+{$ifdef winasyncdns}\r
   procedure tdnsasync.winrequestdone(sender:tobject;error:word);\r
  \r
   begin\r