| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 for (int i = 0; i < nscount; ++i) { | 404 for (int i = 0; i < nscount; ++i) { |
| 405 IPEndPoint ipe; | 405 IPEndPoint ipe; |
| 406 if (!ipe.FromSockAddr( | 406 if (!ipe.FromSockAddr( |
| 407 reinterpret_cast<const struct sockaddr*>(&addresses[i]), | 407 reinterpret_cast<const struct sockaddr*>(&addresses[i]), |
| 408 sizeof addresses[i])) { | 408 sizeof addresses[i])) { |
| 409 return CONFIG_PARSE_POSIX_BAD_ADDRESS; | 409 return CONFIG_PARSE_POSIX_BAD_ADDRESS; |
| 410 } | 410 } |
| 411 dns_config->nameservers.push_back(ipe); | 411 dns_config->nameservers.push_back(ipe); |
| 412 } | 412 } |
| 413 #elif defined(OS_LINUX) | 413 #elif defined(OS_LINUX) |
| 414 COMPILE_ASSERT(arraysize(res.nsaddr_list) >= MAXNS && | 414 static_assert(arraysize(res.nsaddr_list) >= MAXNS && |
| 415 arraysize(res._u._ext.nsaddrs) >= MAXNS, | 415 arraysize(res._u._ext.nsaddrs) >= MAXNS, |
| 416 incompatible_libresolv_res_state); | 416 "incompatible libresolv res_state"); |
| 417 DCHECK_LE(res.nscount, MAXNS); | 417 DCHECK_LE(res.nscount, MAXNS); |
| 418 // Initially, glibc stores IPv6 in |_ext.nsaddrs| and IPv4 in |nsaddr_list|. | 418 // Initially, glibc stores IPv6 in |_ext.nsaddrs| and IPv4 in |nsaddr_list|. |
| 419 // In res_send.c:res_nsend, it merges |nsaddr_list| into |nsaddrs|, | 419 // In res_send.c:res_nsend, it merges |nsaddr_list| into |nsaddrs|, |
| 420 // but we have to combine the two arrays ourselves. | 420 // but we have to combine the two arrays ourselves. |
| 421 for (int i = 0; i < res.nscount; ++i) { | 421 for (int i = 0; i < res.nscount; ++i) { |
| 422 IPEndPoint ipe; | 422 IPEndPoint ipe; |
| 423 const struct sockaddr* addr = NULL; | 423 const struct sockaddr* addr = NULL; |
| 424 size_t addr_len = 0; | 424 size_t addr_len = 0; |
| 425 if (res.nsaddr_list[i].sin_family) { // The indicator used by res_nsend. | 425 if (res.nsaddr_list[i].sin_family) { // The indicator used by res_nsend. |
| 426 addr = reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]); | 426 addr = reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 452 for (int i = 0; (i < MAXDNSRCH) && res.dnsrch[i]; ++i) { | 452 for (int i = 0; (i < MAXDNSRCH) && res.dnsrch[i]; ++i) { |
| 453 dns_config->search.push_back(std::string(res.dnsrch[i])); | 453 dns_config->search.push_back(std::string(res.dnsrch[i])); |
| 454 } | 454 } |
| 455 | 455 |
| 456 dns_config->ndots = res.ndots; | 456 dns_config->ndots = res.ndots; |
| 457 dns_config->timeout = base::TimeDelta::FromSeconds(res.retrans); | 457 dns_config->timeout = base::TimeDelta::FromSeconds(res.retrans); |
| 458 dns_config->attempts = res.retry; | 458 dns_config->attempts = res.retry; |
| 459 #if defined(RES_ROTATE) | 459 #if defined(RES_ROTATE) |
| 460 dns_config->rotate = res.options & RES_ROTATE; | 460 dns_config->rotate = res.options & RES_ROTATE; |
| 461 #endif | 461 #endif |
| 462 #if defined(RES_USE_EDNS0) |
| 462 dns_config->edns0 = res.options & RES_USE_EDNS0; | 463 dns_config->edns0 = res.options & RES_USE_EDNS0; |
| 464 #endif |
| 465 #if !defined(RES_USE_DNSSEC) |
| 466 // Some versions of libresolv don't have support for the DO bit. In this |
| 467 // case, we proceed without it. |
| 468 static const int RES_USE_DNSSEC = 0; |
| 469 #endif |
| 463 | 470 |
| 464 // The current implementation assumes these options are set. They normally | 471 // The current implementation assumes these options are set. They normally |
| 465 // cannot be overwritten by /etc/resolv.conf | 472 // cannot be overwritten by /etc/resolv.conf |
| 466 unsigned kRequiredOptions = RES_RECURSE | RES_DEFNAMES | RES_DNSRCH; | 473 unsigned kRequiredOptions = RES_RECURSE | RES_DEFNAMES | RES_DNSRCH; |
| 467 if ((res.options & kRequiredOptions) != kRequiredOptions) { | 474 if ((res.options & kRequiredOptions) != kRequiredOptions) { |
| 468 dns_config->unhandled_options = true; | 475 dns_config->unhandled_options = true; |
| 469 return CONFIG_PARSE_POSIX_MISSING_OPTIONS; | 476 return CONFIG_PARSE_POSIX_MISSING_OPTIONS; |
| 470 } | 477 } |
| 471 | 478 |
| 472 unsigned kUnhandledOptions = RES_USEVC | RES_IGNTC | RES_USE_DNSSEC; | 479 unsigned kUnhandledOptions = RES_USEVC | RES_IGNTC | RES_USE_DNSSEC; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 490 #endif // !defined(OS_ANDROID) | 497 #endif // !defined(OS_ANDROID) |
| 491 | 498 |
| 492 } // namespace internal | 499 } // namespace internal |
| 493 | 500 |
| 494 // static | 501 // static |
| 495 scoped_ptr<DnsConfigService> DnsConfigService::CreateSystemService() { | 502 scoped_ptr<DnsConfigService> DnsConfigService::CreateSystemService() { |
| 496 return scoped_ptr<DnsConfigService>(new internal::DnsConfigServicePosix()); | 503 return scoped_ptr<DnsConfigService>(new internal::DnsConfigServicePosix()); |
| 497 } | 504 } |
| 498 | 505 |
| 499 } // namespace net | 506 } // namespace net |
| OLD | NEW |