Add dns_resolver option

This allows one to configure the address of the DNS server to use for
lookup operations.

Addresses GH-216
This commit is contained in:
Jon Siwek 2018-11-21 13:42:25 -06:00
parent fd63168171
commit af82e87699
4 changed files with 121 additions and 23 deletions

View file

@ -376,12 +376,6 @@ DNS_Mgr::DNS_Mgr(DNS_MgrMode arg_mode)
mode = arg_mode;
char err[NB_DNS_ERRSIZE];
nb_dns = nb_dns_init(err);
if ( ! nb_dns )
reporter->Warning("problem initializing NB-DNS: %s", err);
dns_mapping_valid = dns_mapping_unverified = dns_mapping_new_name =
dns_mapping_lost_name = dns_mapping_name_changed =
dns_mapping_altered = 0;
@ -410,6 +404,35 @@ void DNS_Mgr::InitPostScript()
if ( did_init )
return;
auto dns_resolver_id = global_scope()->Lookup("dns_resolver");
auto dns_resolver_addr = dns_resolver_id->ID_Val()->AsAddr();
char err[NB_DNS_ERRSIZE];
if ( dns_resolver_addr == IPAddr("::") )
nb_dns = nb_dns_init(err);
else
{
struct sockaddr_storage ss = {0};
if ( dns_resolver_addr.GetFamily() == IPv4 )
{
struct sockaddr_in* sa = (struct sockaddr_in*)&ss;
sa->sin_family = AF_INET;
dns_resolver_addr.CopyIPv4(&sa->sin_addr);
}
else
{
struct sockaddr_in6* sa = (struct sockaddr_in6*)&ss;
sa->sin6_family = AF_INET6;
dns_resolver_addr.CopyIPv6(&sa->sin6_addr);
}
nb_dns = nb_dns_init2(err, (struct sockaddr*)&ss);
}
if ( ! nb_dns )
reporter->Warning("problem initializing NB-DNS: %s", err);
const char* cache_dir = dir ? dir : ".";
if ( mode == DNS_PRIME && ! ensure_dir(cache_dir) )
@ -471,15 +494,15 @@ static const char* fake_addr_lookup_result(const IPAddr& addr)
TableVal* DNS_Mgr::LookupHost(const char* name)
{
if ( mode == DNS_FAKE )
return fake_name_lookup_result(name);
if ( ! nb_dns )
return empty_addr_set();
if ( ! did_init )
Init();
if ( mode == DNS_FAKE )
return fake_name_lookup_result(name);
if ( mode != DNS_PRIME )
{
HostMap::iterator it = host_mappings.find(name);