From 54baea76c00e60c3e49bc3a3fa4292cf637dfbf9 Mon Sep 17 00:00:00 2001 From: MegaBrutal Date: Thu, 8 Nov 2018 05:40:00 +0100 Subject: [PATCH] Option to use getnameinfo for address to string conversion 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 | 33 +++++++++++++++++++++++++++++---- buildall.bat | 4 ++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/DNSResolve.pas b/DNSResolve.pas index 27913b0..48ef5dd 100644 --- a/DNSResolve.pas +++ b/DNSResolve.pas @@ -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; diff --git a/buildall.bat b/buildall.bat index 492ae9f..bb284c5 100644 --- a/buildall.bat +++ b/buildall.bat @@ -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 -- 2.34.1