sin4.sin_port=htons(port);
if(!IpToU32(str, (uint32_t*)&sin4.sin_addr.s_addr)) {
sin6.sin6_family = AF_INET6;
- if(Utility::inet_pton(AF_INET6, str.c_str(), &sin6.sin6_addr) <= 0)
+ if(makeIPv6sockaddr(str, &sin6) < 0)
throw AhuException("Unable to convert presentation address '"+ str +"'");
}
}
address.sin4.sin_family=AF_INET;
if(Utility::inet_pton(AF_INET, str.c_str(), &address.sin4.sin_addr) <= 0) {
address.sin4.sin_family=AF_INET6;
- if(Utility::inet_pton(AF_INET6, str.c_str(), &address.sin6.sin6_addr) <= 0)
+ if(makeIPv6sockaddr(str, &address.sin6) < 0)
throw NetmaskException("Unable to convert '"+str+"' to a netmask");
}
return address;
else
return a+"."+b;
}
+
+int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret)
+{
+ struct addrinfo* res;
+ struct addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+
+ hints.ai_family = AF_INET6;
+ hints.ai_flags = AI_NUMERICHOST;
+
+ if(getaddrinfo(addr.c_str(), 0, &hints, &res) < 0) {
+ perror("getaddrinfo");
+ return -1;
+ }
+
+ memcpy(ret, res->ai_addr, sizeof(*ret));
+
+ freeaddrinfo(res);
+ return 0;
+}
string makeRelative(const std::string& fqdn, const std::string& zone);
string labelReverse(const std::string& qname);
std::string dotConcat(const std::string& a, const std::string &b);
-
+int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret);
#endif
sin.sin4.sin_family = AF_INET;
if(!IpToU32(st.host, (uint32_t*)&sin.sin4.sin_addr.s_addr)) {
sin.sin6.sin6_family = AF_INET6;
- if(Utility::inet_pton(AF_INET6, st.host.c_str(), &sin.sin6.sin6_addr) <= 0)
+ if(makeIPv6sockaddr(st.host, &sin.sin6) < 0)
throw AhuException("Unable to resolve local address for TCP server on '"+ st.host +"'");
}
sin.sin4.sin_family = AF_INET;
if(!IpToU32(st.host.c_str() , (uint32_t*)&sin.sin4.sin_addr.s_addr)) {
sin.sin6.sin6_family = AF_INET6;
- if(Utility::inet_pton(AF_INET6, st.host.c_str(), &sin.sin6.sin6_addr) <= 0)
+ if(makeIPv6sockaddr(st.host, &sin.sin6) < 0)
throw AhuException("Unable to resolve local address for UDP server on '"+ st.host +"'");
}