| Index: net/dns/dns_config_service_posix.cc
|
| diff --git a/net/dns/dns_config_service_posix.cc b/net/dns/dns_config_service_posix.cc
|
| index baf917284c7f3010db9cde820eaa920aa0b0cedd..b352d3269c040f84cb87c3219e1d3e917b8e0c36 100644
|
| --- a/net/dns/dns_config_service_posix.cc
|
| +++ b/net/dns/dns_config_service_posix.cc
|
| @@ -21,68 +21,9 @@
|
| #include "net/dns/notify_watcher_mac.h"
|
| #include "net/dns/serial_worker.h"
|
|
|
| -#if defined(OS_MACOSX)
|
| -#include <dlfcn.h>
|
| -
|
| -#include "third_party/apple_apsl/dnsinfo.h"
|
| -
|
| -namespace {
|
| -
|
| -// dnsinfo symbols are available via libSystem.dylib, but can also be present in
|
| -// SystemConfiguration.framework. To avoid confusion, load them explicitly from
|
| -// libSystem.dylib.
|
| -class DnsInfoApi {
|
| - public:
|
| - typedef const char* (*dns_configuration_notify_key_t)();
|
| - typedef dns_config_t* (*dns_configuration_copy_t)();
|
| - typedef void (*dns_configuration_free_t)(dns_config_t*);
|
| -
|
| - DnsInfoApi()
|
| - : dns_configuration_notify_key(NULL),
|
| - dns_configuration_copy(NULL),
|
| - dns_configuration_free(NULL) {
|
| - handle_ = dlopen("/usr/lib/libSystem.dylib",
|
| - RTLD_LAZY | RTLD_NOLOAD);
|
| - if (!handle_)
|
| - return;
|
| - dns_configuration_notify_key =
|
| - reinterpret_cast<dns_configuration_notify_key_t>(
|
| - dlsym(handle_, "dns_configuration_notify_key"));
|
| - dns_configuration_copy =
|
| - reinterpret_cast<dns_configuration_copy_t>(
|
| - dlsym(handle_, "dns_configuration_copy"));
|
| - dns_configuration_free =
|
| - reinterpret_cast<dns_configuration_free_t>(
|
| - dlsym(handle_, "dns_configuration_free"));
|
| - }
|
| -
|
| - ~DnsInfoApi() {
|
| - if (handle_)
|
| - dlclose(handle_);
|
| - }
|
| -
|
| - dns_configuration_notify_key_t dns_configuration_notify_key;
|
| - dns_configuration_copy_t dns_configuration_copy;
|
| - dns_configuration_free_t dns_configuration_free;
|
| -
|
| - private:
|
| - void* handle_;
|
| -};
|
| -
|
| -const DnsInfoApi& GetDnsInfoApi() {
|
| - static base::LazyInstance<DnsInfoApi>::Leaky api = LAZY_INSTANCE_INITIALIZER;
|
| - return api.Get();
|
| -}
|
| -
|
| -struct DnsConfigTDeleter {
|
| - inline void operator()(dns_config_t* ptr) const {
|
| - if (GetDnsInfoApi().dns_configuration_free)
|
| - GetDnsInfoApi().dns_configuration_free(ptr);
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| -#endif // defined(OS_MACOSX)
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| +#include "net/dns/dns_config_watcher_mac.h"
|
| +#endif
|
|
|
| namespace net {
|
|
|
| @@ -94,20 +35,20 @@ namespace {
|
| const base::FilePath::CharType* kFilePathHosts =
|
| FILE_PATH_LITERAL("/etc/hosts");
|
|
|
| -#if defined(OS_MACOSX)
|
| -class ConfigWatcher {
|
| +#if defined(OS_IOS)
|
| +
|
| +// There is no plublic API to watch the DNS configuration on iOS.
|
| +class DnsConfigWatcher {
|
| public:
|
| - bool Watch(const base::Callback<void(bool succeeded)>& callback) {
|
| - if (!GetDnsInfoApi().dns_configuration_notify_key)
|
| - return false;
|
| - return watcher_.Watch(GetDnsInfoApi().dns_configuration_notify_key(),
|
| - callback);
|
| - }
|
| + typedef base::Callback<void(bool succeeded)> CallbackType;
|
|
|
| - private:
|
| - NotifyWatcherMac watcher_;
|
| + bool Watch(const CallbackType& callback) {
|
| + return false;
|
| + }
|
| };
|
| -#else
|
| +
|
| +#elif !defined(OS_MACOSX)
|
| +// DnsConfigWatcher for OS_MACOSX is in dns_config_watcher_mac.{hh,cc}.
|
|
|
| #ifndef _PATH_RESCONF // Normally defined in <resolv.h>
|
| #define _PATH_RESCONF "/etc/resolv.conf"
|
| @@ -116,14 +57,14 @@ class ConfigWatcher {
|
| static const base::FilePath::CharType* kFilePathConfig =
|
| FILE_PATH_LITERAL(_PATH_RESCONF);
|
|
|
| -class ConfigWatcher {
|
| +class DnsConfigWatcher {
|
| public:
|
| typedef base::Callback<void(bool succeeded)> CallbackType;
|
|
|
| bool Watch(const CallbackType& callback) {
|
| callback_ = callback;
|
| return watcher_.Watch(base::FilePath(kFilePathConfig), false,
|
| - base::Bind(&ConfigWatcher::OnCallback,
|
| + base::Bind(&DnsConfigWatcher::OnCallback,
|
| base::Unretained(this)));
|
| }
|
|
|
| @@ -165,31 +106,18 @@ ConfigParsePosixResult ReadDnsConfig(DnsConfig* config) {
|
| #endif
|
| #endif
|
|
|
| -#if defined(OS_MACOSX)
|
| - if (!GetDnsInfoApi().dns_configuration_copy)
|
| - return CONFIG_PARSE_POSIX_NO_DNSINFO;
|
| - scoped_ptr<dns_config_t, DnsConfigTDeleter> dns_config(
|
| - GetDnsInfoApi().dns_configuration_copy());
|
| - if (!dns_config)
|
| - return CONFIG_PARSE_POSIX_NO_DNSINFO;
|
| -
|
| - // TODO(szym): Parse dns_config_t for resolvers rather than res_state.
|
| - // DnsClient can't handle domain-specific unscoped resolvers.
|
| - unsigned num_resolvers = 0;
|
| - for (int i = 0; i < dns_config->n_resolver; ++i) {
|
| - dns_resolver_t* resolver = dns_config->resolver[i];
|
| - if (!resolver->n_nameserver)
|
| - continue;
|
| - if (resolver->options && !strcmp(resolver->options, "mdns"))
|
| - continue;
|
| - ++num_resolvers;
|
| - }
|
| - if (num_resolvers > 1) {
|
| - LOG(WARNING) << "dns_config has unhandled options!";
|
| - config->unhandled_options = true;
|
| - return CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS;
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + ConfigParsePosixResult error = DnsConfigWatcher::CheckDnsConfig();
|
| + switch (error) {
|
| + case CONFIG_PARSE_POSIX_OK:
|
| + break;
|
| + case CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS:
|
| + LOG(WARNING) << "dns_config has unhandled options!";
|
| + config->unhandled_options = true;
|
| + default:
|
| + return error;
|
| }
|
| -#endif // defined(OS_MACOSX)
|
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| // Override timeout value to match default setting on Windows.
|
| config->timeout = base::TimeDelta::FromSeconds(kDnsTimeoutSeconds);
|
| return result;
|
| @@ -246,7 +174,7 @@ class DnsConfigServicePosix::Watcher {
|
|
|
| base::WeakPtrFactory<Watcher> weak_factory_;
|
| DnsConfigServicePosix* service_;
|
| - ConfigWatcher config_watcher_;
|
| + DnsConfigWatcher config_watcher_;
|
| base::FilePathWatcher hosts_watcher_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Watcher);
|
|
|