Add IPv6 support to Network unit
[mgsmtp.git] / DNSResolve.pas
index 2ca6439012e325b974d8c3df13b71bd19d6298fa..fb4b467bd6424946f05825e80f7dde6f2958a09f 100644 (file)
@@ -53,20 +53,21 @@ type
       ServiceBuffer: PChar; ServiceBufferSize: cuint32; Flags: cint): cint; stdcall;
       external 'ws2_32.dll' name 'getnameinfo';
 
-   function ResolveHost(HostName: ansistring): TGAIResult;
+   function ResolveHost(HostName: ansistring; Family: cint): TGAIResult;
    procedure FreeHost(var GAIResult: TGAIResult);
-   function ResolveIP(SockAddr: PSockAddr): ansistring;
+   function ResolveIP(AddrInfo: PAddrInfo): ansistring;
+   function IPToStr(SockAddr: PSockAddr): ansistring;
 
 
 implementation
 
 
-function ResolveHost(HostName: ansistring): TGAIResult;
+function ResolveHost(HostName: ansistring; Family: cint): TGAIResult;
 var hint: TAddrInfo;
 begin
    FillByte(hint, SizeOf(hint), 0);
    with hint do begin
-      ai_family:= AF_INET;
+      ai_family:= Family;
       ai_socktype:= SOCK_STREAM;
       ai_protocol:= IPPROTO_TCP;
    end;
@@ -77,21 +78,30 @@ procedure FreeHost(var GAIResult: TGAIResult);
 begin
    if GAIResult.AddrInfo <> nil then begin
       freeaddrinfo(GAIResult.AddrInfo);
-         GAIResult.AddrInfo:= nil;
+      GAIResult.AddrInfo:= nil;
    end;
 end;
 
-function ResolveIP(SockAddr: PSockAddr): ansistring;
+function ResolveIP(AddrInfo: PAddrInfo): ansistring;
 var
    r: integer;
    NodeBuffer: array[0..255] of char;
 begin
    NodeBuffer[0]:= #0;
-   r:= getnameinfo(SockAddr, SizeOf(TSockAddr), @NodeBuffer, SizeOf(NodeBuffer), nil, 0, 0);
+   r:= getnameinfo(AddrInfo^.ai_addr, AddrInfo^.ai_addrlen, @NodeBuffer, SizeOf(NodeBuffer), nil, 0, 0);
    if r = 0 then ResolveIP:= PChar(@NodeBuffer)
-   else ResolveIP:= NetAddrToStr(SockAddr^.sin_addr);
+   else ResolveIP:= IPToStr(AddrInfo^.ai_addr);
 end;
 
+function IPToStr(SockAddr: PSockAddr): ansistring;
+begin
+   if SockAddr^.sa_family = AF_INET then
+      IPToStr:= NetAddrToStr(SockAddr^.sin_addr)
+   else if SockAddr^.sa_family = AF_INET6 then
+      IPToStr:= NetAddrToStr6(PSockAddr6(SockAddr)^.sin6_addr)
+   else
+      IPToStr:= 'unknown';
+end;
 
 
 end.