Option to use getnameinfo for address to string conversion
authorMegaBrutal <code+git@megabrutal.com>
Thu, 8 Nov 2018 04:40:00 +0000 (05:40 +0100)
committerMegaBrutal <code+git@megabrutal.com>
Sun, 11 Nov 2018 20:40:01 +0000 (21:40 +0100)
Compile-time option to use getnameinfo with NI_NUMERICHOST for address
to string conversion instead of NetAddrToStr and NetAddrToStr6 from
FPC RTL.

modified:   DNSResolve.pas
modified:   buildall.bat

DNSResolve.pas
buildall.bat

index 27913b0b8bf15f0e0e8c9da840ca3ca2a0c3ca20..48ef5dd7934b0ea552492a9221dd62a7c7242521 100644 (file)
@@ -23,6 +23,15 @@ unit DNSResolve;
 interface
 uses WinSock, Sockets, ctypes;
 
+const
+
+   NI_NOFQDN         =     $01;
+   NI_NUMERICHOST    =     $02;
+   NI_NAMEREQD       =     $04;
+   NI_NUMERICSERV    =     $08;
+   NI_DGRAM          =     $10;
+
+
 type
 
    PAddrInfo = ^TAddrInfo;
@@ -55,7 +64,9 @@ type
 
    function ResolveHost(HostName: ansistring; Family: cint): TGAIResult;
    procedure FreeHost(var GAIResult: TGAIResult);
+   function ResolveIP(AddrInfo: PAddrInfo; Flags: cint): ansistring; overload;
    function ResolveIP(AddrInfo: PAddrInfo): ansistring; overload;
+   function ResolveIP(SockAddr: PSockAddr; Flags: cint): ansistring; overload;
    function ResolveIP(SockAddr: PSockAddr): ansistring; overload;
    function IPToStr(SockAddr: PSockAddr): ansistring;
 
@@ -83,18 +94,23 @@ begin
    end;
 end;
 
-function ResolveIP(AddrInfo: PAddrInfo): ansistring;
+function ResolveIP(AddrInfo: PAddrInfo; Flags: cint): ansistring;
 var
    r: integer;
    NodeBuffer: array[0..255] of char;
 begin
    NodeBuffer[0]:= #0;
-   r:= getnameinfo(AddrInfo^.ai_addr, AddrInfo^.ai_addrlen, @NodeBuffer, SizeOf(NodeBuffer), nil, 0, 0);
+   r:= getnameinfo(AddrInfo^.ai_addr, AddrInfo^.ai_addrlen, @NodeBuffer, SizeOf(NodeBuffer), nil, 0, Flags);
    if r = 0 then ResolveIP:= PChar(@NodeBuffer)
    else ResolveIP:= IPToStr(AddrInfo^.ai_addr);
 end;
 
-function ResolveIP(SockAddr: PSockAddr): ansistring;
+function ResolveIP(AddrInfo: PAddrInfo): ansistring;
+begin
+   ResolveIP:= ResolveIP(AddrInfo, 0);
+end;
+
+function ResolveIP(SockAddr: PSockAddr; Flags: cint): ansistring;
 var
    AddrInfo: TAddrInfo;
 begin
@@ -107,17 +123,26 @@ begin
    else
       AddrInfo.ai_addrlen:= 0;
 
-   ResolveIP:= ResolveIP(PAddrInfo(@AddrInfo));
+   ResolveIP:= ResolveIP(PAddrInfo(@AddrInfo), Flags);
+end;
+
+function ResolveIP(SockAddr: PSockAddr): ansistring;
+begin
+   ResolveIP:= ResolveIP(SockAddr, 0);
 end;
 
 function IPToStr(SockAddr: PSockAddr): ansistring;
 begin
+{$IFNDEF GNI}
    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';
+{$ELSE}
+   IPToStr:= ResolveIP(SockAddr, NI_NUMERICHOST);
+{$ENDIF}
 end;
 
 
index 492ae9f2c2fa596be9b422007d8e0301a4ff18f8..bb284c553376546047cd3abd2f8fa26df92db41f 100644 (file)
@@ -3,8 +3,8 @@ del mgsmtp.exe mgsmtp64.exe
 echo Building for Win32...
 echo.
 del *.o *.ppu *.a
-fpc -omgsmtp.exe MgSMTP.pas
+fpc -dGNI -omgsmtp.exe MgSMTP.pas
 echo Building for Win64...
 echo.
 del *.o *.ppu *.a
-ppcrossx64 -omgsmtp64.exe MgSMTP.pas
\ No newline at end of file
+ppcrossx64 -dGNI -omgsmtp64.exe MgSMTP.pas
\ No newline at end of file