diff options
author | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-20 21:14:49 +0000 |
---|---|---|
committer | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-20 21:14:49 +0000 |
commit | 6c8f65e51ccdf4abd5815e4316364b87bb544fd1 (patch) | |
tree | 4db984427e082112c85542f04aa6895cc3b27027 /net/dns | |
parent | aad6ced7fac07957bcbf5e1b8009b93ce71588ef (diff) | |
download | chromium_src-6c8f65e51ccdf4abd5815e4316364b87bb544fd1.zip chromium_src-6c8f65e51ccdf4abd5815e4316364b87bb544fd1.tar.gz chromium_src-6c8f65e51ccdf4abd5815e4316364b87bb544fd1.tar.bz2 |
[net/dns] Use res_getservers to retrieve nameserver addresses in DnsConfigService.
Where available (presently if OS_MACOSX or OS_FREEBSD), res_getservers reliably retrieves IPv4/IPv6
from struct __res_state.
BUG=123879
TEST=./net_unittests --gtest_filter=DnsConfigService.*
Review URL: http://codereview.chromium.org/10146011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133276 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/dns')
-rw-r--r-- | net/dns/dns_config_service_posix.cc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/net/dns/dns_config_service_posix.cc b/net/dns/dns_config_service_posix.cc index 3031386..1a331a13 100644 --- a/net/dns/dns_config_service_posix.cc +++ b/net/dns/dns_config_service_posix.cc @@ -57,7 +57,7 @@ class ConfigReader : public SerialWorker { success_ = internal::ConvertResStateToDnsConfig(res, &dns_config_); } // Prefer res_ndestroy where available. -#if defined(OS_MACOSX) +#if defined(OS_MACOSX) || defined(OS_FREEBSD) res_ndestroy(&res); #else res_nclose(&res); @@ -175,6 +175,22 @@ bool ConvertResStateToDnsConfig(const struct __res_state& res, dns_config->nameservers.clear(); +#if defined(OS_MACOSX) || defined(OS_FREEBSD) + union res_sockaddr_union addresses[MAXNS]; + int nscount = res_getservers(const_cast<res_state>(&res), addresses, MAXNS); + DCHECK_GE(nscount, 0); + DCHECK_LE(nscount, MAXNS); + for (int i = 0; i < nscount; ++i) { + IPEndPoint ipe; + if (ipe.FromSockAddr( + reinterpret_cast<const struct sockaddr*>(&addresses[i]), + sizeof addresses[i])) { + dns_config->nameservers.push_back(ipe); + } else { + return false; + } + } +#else // !(defined(OS_MACOSX) || defined(OS_FREEBSD)) #if defined(OS_LINUX) // Initially, glibc stores IPv6 in _ext.nsaddrs and IPv4 in nsaddr_list. // Next (res_send.c::__libc_res_nsend), it copies nsaddr_list after nsaddrs. @@ -193,7 +209,7 @@ bool ConvertResStateToDnsConfig(const struct __res_state& res, return false; } } -#endif +#endif // defined(OS_LINUX) for (int i = 0; i < res.nscount; ++i) { IPEndPoint ipe; @@ -205,6 +221,7 @@ bool ConvertResStateToDnsConfig(const struct __res_state& res, return false; } } +#endif dns_config->search.clear(); for (int i = 0; (i < MAXDNSRCH) && res.dnsrch[i]; ++i) { |