From 2e17c67a611eec3d3224faf314475b74ec2572bb Mon Sep 17 00:00:00 2001 From: joost Date: Sun, 2 Feb 2020 10:36:26 +0000 Subject: [PATCH] * Support the ndots and search resolve options git-svn-id: trunk@44088 - --- packages/fcl-net/src/netdb.pp | 75 +++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/packages/fcl-net/src/netdb.pp b/packages/fcl-net/src/netdb.pp index beeeb71c77..4136933f3c 100644 --- a/packages/fcl-net/src/netdb.pp +++ b/packages/fcl-net/src/netdb.pp @@ -126,6 +126,7 @@ Type Var DNSServers : TDNSServerArray; + DNSOptions : String; DefaultDomainList : String; CheckResolveFileAge : Boolean; CheckHostsFileAge : Boolean; @@ -176,6 +177,9 @@ uses BaseUnix, sysutils; +var + DefaultDomainListArr : array of string; + NDots: Integer; const { from http://www.iana.org/assignments/dns-parameters } @@ -568,6 +572,8 @@ begin Result:=0; ResolveFileName:=Fn; ResolveFileAge:=FileAge(FN); + DefaultDomainListArr:=[]; + NDots:=1; {$push}{$i-} Assign(R,FN); Reset(R); @@ -598,11 +604,16 @@ begin else if CheckDirective('domain') then DefaultDomainList:=L else if CheckDirective('search') then - DefaultDomainList:=L; + DefaultDomainList:=L + else if CheckDirective('options') then + DNSOptions:=L; end; Finally Close(R); - end; + end; + L := GetEnvironmentVariable('LOCALDOMAIN'); + if L <> '' then + DefaultDomainList := L; end; Procedure CheckResolveFile; @@ -1143,14 +1154,70 @@ begin (HostAddr.u6_addr16[5] = $FFFF); end; +Function HandleAsFullyQualifiedName(const HostName: String) : Boolean; +var + I,J : Integer; +begin + Result := False; + J := 0; + for I := 1 to Length(HostName) do + if HostName[I] = '.' then + begin + Inc(J); + if J >= NDots then + begin + Result := True; + Break; + end; + end; +end; + Function ResolveHostByName(HostName : String; Var H : THostEntry) : Boolean; Var Address : Array[1..MaxResolveAddr] of THostAddr; + AbsoluteQueryFirst : Boolean; L : Integer; - + K : Integer; + begin - L:=ResolveName(HostName,Address); + // Use domain or search-list to append to the searched hostname. + // When the amount of dots in hostname is higher or equal to ndots, + // do the query without adding any search-domain first. + // See the resolv.conf manual for more info. + if (DefaultDomainList<>'') then + begin + // Fill the cached DefaultDomainListArr and NDots + if (Length(DefaultDomainListArr) = 0) then + begin + DefaultDomainListArr := DefaultDomainList.Split(' ',Char(9)); + L := Pos('ndots:', DNSOptions); + if L > 0 then + NDots := StrToIntDef(Trim(Copy(DNSOptions, L+6, 2)), 1); + end; + + AbsoluteQueryFirst := HandleAsFullyQualifiedName(HostName); + if AbsoluteQueryFirst then + L:=ResolveName(HostName,Address) + else + L := -1; + + K := 0; + while (L < 1) and (K < Length(DefaultDomainListArr)) do + begin + L:=ResolveName(HostName + '.' + DefaultDomainListArr[K],Address); + Inc(K); + end; + end + else + begin + AbsoluteQueryFirst := False; + L := -1; + end; + + if (L<1) and not AbsoluteQueryFirst then + L:=ResolveName(HostName,Address); + Result:=(L>0); If Result then begin