OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/dns/dns_config_service_posix.h" | 5 #include "net/dns/dns_config_service_posix.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
(...skipping 12 matching lines...) Expand all Loading... | |
23 | 23 |
24 // A SerialWorker that uses ResolverLib to initialize res_state and converts | 24 // A SerialWorker that uses ResolverLib to initialize res_state and converts |
25 // it to DnsConfig. | 25 // it to DnsConfig. |
26 class DnsConfigServicePosix::ConfigReader : public SerialWorker { | 26 class DnsConfigServicePosix::ConfigReader : public SerialWorker { |
27 public: | 27 public: |
28 explicit ConfigReader(DnsConfigServicePosix* service) | 28 explicit ConfigReader(DnsConfigServicePosix* service) |
29 : service_(service), | 29 : service_(service), |
30 success_(false) {} | 30 success_(false) {} |
31 | 31 |
32 void DoWork() OVERRIDE { | 32 void DoWork() OVERRIDE { |
33 // Note: res_ninit in glibc always returns 0 and sets RES_INIT. | |
34 // res_init behaves the same way. | |
35 success_ = false; | |
joth
2011/11/03 19:45:02
I like this tidy up in terms of un-interleaving th
Jing Zhao
2011/11/04 08:01:43
Done.
| |
33 #if defined(OS_OPENBSD) | 36 #if defined(OS_OPENBSD) |
34 if ((res_init() == 0) && (_res.options & RES_INIT)) { | 37 if ((res_init() == 0) && (_res.options & RES_INIT)) { |
35 success_ = ConvertResToConfig(_res, &dns_config_); | 38 success_ = ConvertResToConfig(_res, &dns_config_); |
36 #else | 39 } |
40 #elif !defined(OS_ANDROID) | |
37 struct __res_state res; | 41 struct __res_state res; |
38 if ((res_ninit(&res) == 0) && (res.options & RES_INIT)) { | 42 if ((res_ninit(&res) == 0) && (res.options & RES_INIT)) { |
39 success_ = ConvertResToConfig(res, &dns_config_); | 43 success_ = ConvertResToConfig(res, &dns_config_); |
44 } | |
40 #endif | 45 #endif |
41 } else { | |
42 // Note: res_ninit in glibc always returns 0 and sets RES_INIT. | |
43 // res_init behaves the same way. | |
44 success_ = false; | |
45 } | |
46 #if defined(OS_MACOSX) | 46 #if defined(OS_MACOSX) |
47 res_ndestroy(&res); | 47 res_ndestroy(&res); |
48 #elif !defined(OS_OPENBSD) | 48 #elif !defined(OS_OPENBSD) && !defined(ANDROID) |
49 res_nclose(&res); | 49 res_nclose(&res); |
50 #endif | 50 #endif |
51 } | 51 } |
52 | 52 |
53 void OnWorkFinished() OVERRIDE { | 53 void OnWorkFinished() OVERRIDE { |
54 DCHECK(!IsCancelled()); | 54 DCHECK(!IsCancelled()); |
55 if (success_) | 55 if (success_) |
56 service_->OnConfigRead(dns_config_); | 56 service_->OnConfigRead(dns_config_); |
57 } | 57 } |
58 | 58 |
(...skipping 18 matching lines...) Expand all Loading... | |
77 new ConfigReader(this)); | 77 new ConfigReader(this)); |
78 FilePath hosts_path(FILE_PATH_LITERAL("/etc/hosts")); | 78 FilePath hosts_path(FILE_PATH_LITERAL("/etc/hosts")); |
79 hosts_watcher_->StartWatch(hosts_path, new DnsHostsReader(hosts_path, this)); | 79 hosts_watcher_->StartWatch(hosts_path, new DnsHostsReader(hosts_path, this)); |
80 } | 80 } |
81 | 81 |
82 // static | 82 // static |
83 DnsConfigService* DnsConfigService::CreateSystemService() { | 83 DnsConfigService* DnsConfigService::CreateSystemService() { |
84 return new DnsConfigServicePosix(); | 84 return new DnsConfigServicePosix(); |
85 } | 85 } |
86 | 86 |
87 #if !defined(OS_ANDROID) | |
87 bool ConvertResToConfig(const struct __res_state& res, DnsConfig* dns_config) { | 88 bool ConvertResToConfig(const struct __res_state& res, DnsConfig* dns_config) { |
88 CHECK(dns_config != NULL); | 89 CHECK(dns_config != NULL); |
89 DCHECK(res.options & RES_INIT); | 90 DCHECK(res.options & RES_INIT); |
90 | 91 |
91 dns_config->nameservers.clear(); | 92 dns_config->nameservers.clear(); |
92 | 93 |
93 #if defined(OS_LINUX) | 94 #if defined(OS_LINUX) |
94 // Initially, glibc stores IPv6 in _ext.nsaddrs and IPv4 in nsaddr_list. | 95 // Initially, glibc stores IPv6 in _ext.nsaddrs and IPv4 in nsaddr_list. |
95 // Next (res_send.c::__libc_res_nsend), it copies nsaddr_list after nsaddrs. | 96 // Next (res_send.c::__libc_res_nsend), it copies nsaddr_list after nsaddrs. |
96 // If RES_ROTATE is enabled, the list is shifted left after each res_send. | 97 // If RES_ROTATE is enabled, the list is shifted left after each res_send. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 dns_config->ndots = res.ndots; | 130 dns_config->ndots = res.ndots; |
130 dns_config->timeout = base::TimeDelta::FromSeconds(res.retrans); | 131 dns_config->timeout = base::TimeDelta::FromSeconds(res.retrans); |
131 dns_config->attempts = res.retry; | 132 dns_config->attempts = res.retry; |
132 #if defined(RES_ROTATE) | 133 #if defined(RES_ROTATE) |
133 dns_config->rotate = res.options & RES_ROTATE; | 134 dns_config->rotate = res.options & RES_ROTATE; |
134 #endif | 135 #endif |
135 dns_config->edns0 = res.options & RES_USE_EDNS0; | 136 dns_config->edns0 = res.options & RES_USE_EDNS0; |
136 | 137 |
137 return true; | 138 return true; |
138 } | 139 } |
140 #endif | |
139 | 141 |
140 } // namespace net | 142 } // namespace net |
OLD | NEW |