added ipv6 detection on windows for built-in resolver
authorbeware <beware@bircd.org>
Tue, 22 Feb 2011 05:40:41 +0000 (05:40 +0000)
committerbeware <beware@bircd.org>
Tue, 22 Feb 2011 05:40:41 +0000 (05:40 +0000)
git-svn-id: file:///svnroot/lcore/trunk@95 b1de8a11-f9be-4011-bde0-cc7ace90066a

dnscore.pas

index d0dbbf035f329d8e7304e32f588fdad907d09eca..7cbb82831303a538d6dca7b1fad38161c288884e 100644 (file)
@@ -221,7 +221,7 @@ implementation
 \r
 uses\r
   {$ifdef win32}\r
 \r
 uses\r
   {$ifdef win32}\r
-    windows,\r
+    windows,winsock,\r
   {$endif}\r
 \r
   sysutils;\r
   {$endif}\r
 \r
   sysutils;\r
@@ -781,9 +781,34 @@ begin
 end;\r
 \r
 {$else}\r
 end;\r
 \r
 {$else}\r
+\r
+{the following code's purpose is to determine what IP windows would come from, to reach an IP\r
+it can be abused to find if there's any global v6 IPs, getaddrinfo seems unreliable (not working on XP atleast)\r
+}\r
+const\r
+  SIO_ROUTING_INTERFACE_QUERY = $c8000014;\r
+  function WSAIoctl(s: TSocket; code:integer; const Buf; len: Integer; var output; outlen:integer; var outreturned: Integer; overlapped:pointer; completion: pointer): Integer; stdcall; external 'ws2_32.dll' name 'WSAIoctl';\r
+\r
+function getlocalipforip(const ip:tbinip):tbinip;\r
+var\r
+  handle:integer;\r
+  a,b:integer;\r
+  inaddrv,inaddrv2:tinetsockaddrv;\r
+  srcx:winsock.tsockaddr absolute inaddrv2;\r
+begin\r
+  makeinaddrv(ip,'0',inaddrv);\r
+  handle := Socket(inaddrv.inaddr.family,SOCK_DGRAM,IPPROTO_UDP);\r
+  if WSAIoctl(handle, SIO_ROUTING_INTERFACE_QUERY, inaddrv, sizeof(inaddrv), inaddrv2, sizeof(inaddrv2), a, nil, nil) <> 0\r
+  then raise exception.create('getlocalipforip failed with error: '+inttostr(wsagetlasterror));\r
+  result := inaddrvtobinip(inaddrv2);\r
+  closesocket(handle);\r
+end;\r
+\r
 function getv6localips:tbiniplist;\r
 begin\r
   result := biniplist_new;\r
 function getv6localips:tbiniplist;\r
 begin\r
   result := biniplist_new;\r
+  {this IP is chosen because it's the first normal global v6 IP that has no special purpose}\r
+  biniplist_add(result,getlocalipforip(ipstrtobinf('2001:200::')));\r
 end;\r
 {$endif}\r
 \r
 end;\r
 {$endif}\r
 \r