summaryrefslogtreecommitdiffstats
path: root/net/dns
diff options
context:
space:
mode:
authorszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-20 21:14:49 +0000
committerszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-20 21:14:49 +0000
commit6c8f65e51ccdf4abd5815e4316364b87bb544fd1 (patch)
tree4db984427e082112c85542f04aa6895cc3b27027 /net/dns
parentaad6ced7fac07957bcbf5e1b8009b93ce71588ef (diff)
downloadchromium_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.cc21
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) {