diff --git a/src/Resolver.cc b/src/Resolver.cc index 0332d5be4..4e119966e 100644 --- a/src/Resolver.cc +++ b/src/Resolver.cc @@ -355,6 +355,19 @@ int Resolver::FindAddressFamily(const char *name) return -1; } +bool Resolver::IsAddressFamilySupporded(int af) +{ +#if INET6 + // check if ipv6 is really supported + if(af==AF_INET6 && (!FindGlobalIPv6Address() || !CanCreateIpv6Socket())) + { + LogNote(4, "IPv6 is not supported or configured"); + return false; + } +#endif // INET6 + return true; +} + void Resolver::ParseOrder(const char *s,int *o) { const char * const delim="\t "; @@ -364,7 +377,7 @@ void Resolver::ParseOrder(const char *s,int *o) for(s1=strtok(s1,delim); s1; s1=strtok(0,delim)) { int af=FindAddressFamily(s1); - if(af!=-1 && idx<15) + if(af!=-1 && idx<15 && IsAddressFamilySupporded(af)) { if(o) o[idx]=af; idx++; diff --git a/src/Resolver.h b/src/Resolver.h index 724714d94..18eeed42f 100644 --- a/src/Resolver.h +++ b/src/Resolver.h @@ -26,7 +26,7 @@ #include "Cache.h" #include "network.h" -class Resolver : public SMTask, protected ProtoLog +class Resolver : public SMTask, protected ProtoLog, protected Networker { xstring hostname; xstring portname; @@ -53,6 +53,7 @@ class Resolver : public SMTask, protected ProtoLog void DoGethostbyname(); static int FindAddressFamily(const char *name); + static bool IsAddressFamilySupporded(int af); static void ParseOrder(const char *s,int *o); void LookupOne(const char *name); diff --git a/src/network.cc b/src/network.cc index e54076dec..ea1b02ebb 100644 --- a/src/network.cc +++ b/src/network.cc @@ -454,7 +454,7 @@ const char *Networker::FindGlobalIPv6Address() return 0; } -static bool CanCreateIpv6Socket() +bool Networker::CanCreateIpv6Socket() { #if INET6 bool can=true; @@ -472,16 +472,3 @@ static bool CanCreateIpv6Socket() return false; #endif } - -static struct NetworkInit : private Networker { - NetworkInit(); -} NETWORK_INIT; - -NetworkInit::NetworkInit() -{ -#if INET6 - // check if ipv6 is really supported - if(!Networker::FindGlobalIPv6Address() || !CanCreateIpv6Socket()) - ResMgr::Set("dns:order",0,"inet"); -#endif // INET6 -} diff --git a/src/network.h b/src/network.h index 3223ce82b..e4ede6ef2 100644 --- a/src/network.h +++ b/src/network.h @@ -140,6 +140,7 @@ class Networker static int SocketCreateUnboundTCP(int af,const char *hostname); static void SocketSinglePF(int sock,int pf); static const char *FindGlobalIPv6Address(); + static bool CanCreateIpv6Socket(); }; #endif //NETWORK_H