add linux syscall sys_getrandom to lcorernd
[lcore.git] / dnscore.pas
index fa9eee2fc0a76c40a6eafdf764ab6e6b69ebe33f..08f99d1c87180bd0b3cc351f84d68c988db0efca 100644 (file)
@@ -6,12 +6,12 @@
 {\r
 \r
   code wanting to use this dns system should act as follows (note: app\r
 {\r
 \r
   code wanting to use this dns system should act as follows (note: app\r
-  developers will probablly want to use dnsasync or dnssync or write a similar\r
-  wrapper unit of thier own).\r
+  developers will probably want to use dnsasync or dnssync or write a similar\r
+  wrapper unit of their own).\r
 \r
   for normal lookups call setstate_forward or setstate_reverse to set up the\r
   state, for more obscure lookups use setstate_request_init and fill in other\r
 \r
   for normal lookups call setstate_forward or setstate_reverse to set up the\r
   state, for more obscure lookups use setstate_request_init and fill in other\r
-  relavent state manually.\r
+  relevant state manually.\r
 \r
   call state_process which will do processing on the information in the state\r
   and return an action\r
 \r
   call state_process which will do processing on the information in the state\r
   and return an action\r
@@ -20,7 +20,7 @@
   action_sendpacket means that dnscore wants the code that calls it to send\r
   the packet in sendpacket/sendpacketlen and then start (or go back to) listening\r
   for\r
   action_sendpacket means that dnscore wants the code that calls it to send\r
   the packet in sendpacket/sendpacketlen and then start (or go back to) listening\r
   for\r
-  action_done means the request has completed (either suceeded or failed)\r
+  action_done means the request has completed (either succeeded or failed)\r
 \r
   callers should resend the last packet they tried to send if they have not\r
   been asked to send a new packet for more than some timeout value they choose.\r
 \r
   callers should resend the last packet they tried to send if they have not\r
   been asked to send a new packet for more than some timeout value they choose.\r
   following ways.\r
 \r
   on failure state.resultstr will be an empty string and state.resultbin will\r
   following ways.\r
 \r
   on failure state.resultstr will be an empty string and state.resultbin will\r
-  be zeroed out (easilly detected by the fact that it will have a family of 0)\r
+  be zeroed out (easily detected by the fact that it will have a family of 0)\r
 \r
   on success for a A or AAAA lookup state.resultstr will be an empty string\r
 \r
   on success for a A or AAAA lookup state.resultstr will be an empty string\r
-  and state.resultbin will contain the result (note: AAAA lookups require IPV6\r
+  and state.resultbin will contain the result (note: AAAA lookups require IPv6\r
   enabled).\r
 \r
   enabled).\r
 \r
-  if an A lookup fails and the code is built with ipv6 enabled then the code\r
+  if an A lookup fails and the code is built with IPv6 enabled then the code\r
   will return any AAAA records with the same name. The reverse does not apply\r
   will return any AAAA records with the same name. The reverse does not apply\r
-  so if an application preffers IPV6 but wants IPV4 results as well it must\r
-  check them seperately.\r
+  so if an application prefers IPv6 but wants IPv4 results as well it must\r
+  check them separately.\r
 \r
   on success for any other type of lookup state.resultstr will be an empty\r
 \r
   note the state contains ansistrings, setstate_init with a null name parameter\r
 \r
   on success for any other type of lookup state.resultstr will be an empty\r
 \r
   note the state contains ansistrings, setstate_init with a null name parameter\r
-  can be used to clean theese up if required.\r
+  can be used to clean these up if required.\r
 \r
 \r
-  callers may use setstate_failure to mark the state as failed themseleves\r
+  callers may use setstate_failure to mark the state as failed themselves\r
   before passing it on to other code, for example this may be done in the event\r
   of a timeout.\r
 }\r
   before passing it on to other code, for example this may be done in the event\r
   of a timeout.\r
 }\r
@@ -62,7 +62,7 @@ interface
 \r
 uses binipstuff,classes,pgtypes,lcorernd;\r
 \r
 \r
 uses binipstuff,classes,pgtypes,lcorernd;\r
 \r
-var usewindns : boolean = {$ifdef win32}true{$else}false{$endif};\r
+var usewindns : boolean = {$ifdef mswindows}true{$else}false{$endif};\r
 {hint to users of this unit that they should use windows dns instead.\r
 May be disabled by applications if desired. (e.g. if setting a custom\r
 dnsserverlist).\r
 {hint to users of this unit that they should use windows dns instead.\r
 May be disabled by applications if desired. (e.g. if setting a custom\r
 dnsserverlist).\r
@@ -106,7 +106,10 @@ const
   querytype_txt=16;\r
   querytype_spf=99;\r
   maxrecursion=50;\r
   querytype_txt=16;\r
   querytype_spf=99;\r
   maxrecursion=50;\r
-  maxrrofakind=20;\r
+  maxrrofakind=32;\r
+  {the maximum number of RR of a kind of purely an extra sanity check and could be omitted.\r
+  before, i set it to 20, but valid replies can have more. dnscore only does udp requests,\r
+  and ordinary DNS, so up to 512 bytes. the maximum number of A records that fits seems to be 29}\r
 \r
   retryafter=300000; //microseconds must be less than one second;\r
   timeoutlag=1000000000; // penalty value to be treated as lag in the event of a timeout (microseconds)\r
 \r
   retryafter=300000; //microseconds must be less than one second;\r
   timeoutlag=1000000000; // penalty value to be treated as lag in the event of a timeout (microseconds)\r
@@ -159,7 +162,7 @@ type
   end;\r
 \r
 //commenting out functions from interface that do not have documented semantics\r
   end;\r
 \r
 //commenting out functions from interface that do not have documented semantics\r
-//and probablly should not be called from outside this unit, reenable them\r
+//and probably should not be called from outside this unit, reenable them\r
 //if you must but please document them at the same time --plugwash\r
 \r
 //function buildrequest(const name:string;var packet:tdnspacket;requesttype:word):integer;\r
 //if you must but please document them at the same time --plugwash\r
 \r
 //function buildrequest(const name:string;var packet:tdnspacket;requesttype:word):integer;\r
@@ -169,7 +172,7 @@ function makereversename(const binip:tbinip):ansistring;
 \r
 procedure setstate_request_init(const name:ansistring;var state:tdnsstate);\r
 \r
 \r
 procedure setstate_request_init(const name:ansistring;var state:tdnsstate);\r
 \r
-//set up state for a foward lookup. A family value of AF_INET6 will give only\r
+//set up state for a forward lookup. A family value of AF_INET6 will give only\r
 //ipv6 results. Any other value will give only ipv4 results\r
 procedure setstate_forward(const name:ansistring;var state:tdnsstate;family:integer);\r
 \r
 //ipv6 results. Any other value will give only ipv4 results\r
 procedure setstate_forward(const name:ansistring;var state:tdnsstate;family:integer);\r
 \r
@@ -502,7 +505,10 @@ begin
     state.numrr2 := 0;\r
     for a := 0 to 3 do begin\r
       state.numrr1[a] := htons(state.recvpacket.rrcount[a]);\r
     state.numrr2 := 0;\r
     for a := 0 to 3 do begin\r
       state.numrr1[a] := htons(state.recvpacket.rrcount[a]);\r
-      if state.numrr1[a] > maxrrofakind then goto failure;\r
+      if state.numrr1[a] > maxrrofakind then begin\r
+        failurereason := 'exceeded maximum RR of a kind';\r
+        goto failure;\r
+      end;\r
       inc(state.numrr2,state.numrr1[a]);\r
     end;\r
 \r
       inc(state.numrr2,state.numrr1[a]);\r
     end;\r
 \r
@@ -591,7 +597,7 @@ recursed:
     goto failure;\r
   end;\r
 \r
     goto failure;\r
   end;\r
 \r
-  {do /ets/hosts lookup here}\r
+  {do /etc/hosts lookup here}\r
   state.sendpacketlen := buildrequest(state.queryname,state.sendpacket,state.requesttype);\r
   if state.sendpacketlen = 0 then begin\r
     failurereason := 'building request packet failed';\r
   state.sendpacketlen := buildrequest(state.queryname,state.sendpacket,state.requesttype);\r
   if state.sendpacketlen = 0 then begin\r
     failurereason := 'building request packet failed';\r
@@ -633,7 +639,7 @@ function getcurrentsystemnameserverbin(var id:integer):tbinip;
 var\r
   counter : integer;\r
 begin\r
 var\r
   counter : integer;\r
 begin\r
-  {override the name server choice here, instead of overriding it whereever it's called\r
+  {override the name server choice here, instead of overriding it wherever it's called\r
   setting ID to -1 causes it to be ignored in reportlag}\r
   if (overridednsserver <> '') then begin\r
     result := ipstrtobinf(overridednsserver);\r
   setting ID to -1 causes it to be ignored in reportlag}\r
   if (overridednsserver <> '') then begin\r
     result := ipstrtobinf(overridednsserver);\r
@@ -644,7 +650,7 @@ begin
   end;\r
 \r
   if not assigned(dnsserverlag) then populatednsserverlist;\r
   end;\r
 \r
   if not assigned(dnsserverlag) then populatednsserverlist;\r
-  if dnsserverlag.count=0 then raise exception.create('no dns servers availible');\r
+  if dnsserverlag.count=0 then raise exception.create('no dns servers available');\r
   id := 0;\r
   if dnsserverlag.count >1 then begin\r
     for counter := dnsserverlag.count-1 downto 1 do begin\r
   id := 0;\r
   if dnsserverlag.count >1 then begin\r
     for counter := dnsserverlag.count-1 downto 1 do begin\r
@@ -678,31 +684,16 @@ end;
 {$ifdef ipv6}\r
 \r
 procedure initpreferredmode;\r
 {$ifdef ipv6}\r
 \r
 procedure initpreferredmode;\r
-var\r
-  l:tbiniplist;\r
-  a:integer;\r
-  ip:tbinip;\r
-  ipmask_global,ipmask_6to4,ipmask_teredo:tbinip;\r
-\r
 begin\r
   if preferredmodeinited then exit;\r
   if useaf <> useaf_default then exit;\r
 begin\r
   if preferredmodeinited then exit;\r
   if useaf <> useaf_default then exit;\r
-  l := getv6localips;\r
-  if biniplist_getcount(l) = 0 then exit;\r
-  useaf := useaf_preferv4;\r
-  ipstrtobin('2000::',ipmask_global);\r
-  ipstrtobin('2001::',ipmask_teredo);\r
-  ipstrtobin('2002::',ipmask_6to4);\r
-  {if there is any v6 IP which is globally routable and not 6to4 and not teredo, prefer v6}\r
-  for a := biniplist_getcount(l)-1 downto 0 do begin\r
-    ip := biniplist_get(l,a);\r
-    if not comparebinipmask(ip,ipmask_global,3) then continue;\r
-    if comparebinipmask(ip,ipmask_teredo,32) then continue;\r
-    if comparebinipmask(ip,ipmask_6to4,16) then continue;\r
-    useaf := useaf_preferv6;\r
-    preferredmodeinited := true;\r
-    exit;\r
-  end;\r
+\r
+  if (have_ipv6_connectivity) then\r
+    useaf := useaf_preferv6\r
+  else\r
+    useaf := useaf_preferv4;\r
+\r
+  preferredmodeinited := true;\r
 end;\r
 \r
 {$endif}\r
 end;\r
 \r
 {$endif}\r