| Index: net/base/host_resolver_proc.cc
|
| ===================================================================
|
| --- net/base/host_resolver_proc.cc (revision 37474)
|
| +++ net/base/host_resolver_proc.cc (working copy)
|
| @@ -6,7 +6,7 @@
|
|
|
| #include "build/build_config.h"
|
|
|
| -#if defined(OS_LINUX)
|
| +#if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| #include <resolv.h>
|
| #endif
|
|
|
| @@ -16,7 +16,7 @@
|
| #include "net/base/net_errors.h"
|
| #include "net/base/sys_addrinfo.h"
|
|
|
| -#if defined(OS_LINUX)
|
| +#if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| #include "base/singleton.h"
|
| #include "base/thread_local_storage.h"
|
| #endif
|
| @@ -77,9 +77,9 @@
|
| return SystemHostResolverProc(host, address_family, addrlist);
|
| }
|
|
|
| -#if defined(OS_LINUX)
|
| -// On Linux changes to /etc/resolv.conf can go unnoticed thus resulting in
|
| -// DNS queries failing either because nameservers are unknown on startup
|
| +#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
|
| +// On Linux/BSD, changes to /etc/resolv.conf can go unnoticed thus resulting
|
| +// in DNS queries failing either because nameservers are unknown on startup
|
| // or because nameserver info has changed as a result of e.g. connecting to
|
| // a new network. Some distributions patch glibc to stat /etc/resolv.conf
|
| // to try to automatically detect such changes but these patches are not
|
| @@ -89,6 +89,9 @@
|
| // We adopt the Mozilla solution here which is to call res_ninit when
|
| // lookups fail and to rate limit the reloading to once per second per
|
| // thread.
|
| +//
|
| +// OpenBSD does not have thread-safe res_ninit/res_nclose so we can't do
|
| +// the same trick there.
|
|
|
| // Keep a timer per calling thread to rate limit the calling of res_ninit.
|
| class DnsReloadTimer {
|
| @@ -145,7 +148,7 @@
|
| // static
|
| ThreadLocalStorage::Slot DnsReloadTimer::tls_index_(base::LINKER_INITIALIZED);
|
|
|
| -#endif // defined(OS_LINUX)
|
| +#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
|
|
|
| int SystemHostResolverProc(const std::string& host,
|
| AddressFamily address_family,
|
| @@ -174,7 +177,7 @@
|
| hints.ai_family = AF_UNSPEC;
|
| }
|
|
|
| -#if defined(OS_WIN)
|
| +#if defined(OS_WIN) || defined(OS_OPENBSD)
|
| // DO NOT USE AI_ADDRCONFIG ON WINDOWS.
|
| //
|
| // The following comment in <winsock2.h> is the best documentation I found
|
| @@ -195,6 +198,8 @@
|
| // The IPv4 or IPv6 loopback address is not considered a valid global
|
| // address.
|
| // See http://crbug.com/5234.
|
| + //
|
| + // OpenBSD does not support it, either.
|
| hints.ai_flags = 0;
|
| #else
|
| hints.ai_flags = AI_ADDRCONFIG;
|
| @@ -204,7 +209,7 @@
|
| hints.ai_socktype = SOCK_STREAM;
|
|
|
| int err = getaddrinfo(host.c_str(), NULL, &hints, &ai);
|
| -#if defined(OS_LINUX)
|
| +#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD)
|
| net::DnsReloadTimer* dns_timer = Singleton<net::DnsReloadTimer>::get();
|
| // If we fail, re-initialise the resolver just in case there have been any
|
| // changes to /etc/resolv.conf and retry. See http://crbug.com/11380 for info.
|
|
|