blob: 6826ece4222275ab180927230ca8bc0d68b1be84 [file] [log] [blame]
Thieu Le3bd0faa2012-02-15 15:44:46 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewartb6063942011-08-05 10:17:29 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/resolver.h"
6
Paul Stewart4d5efb72012-09-17 12:24:34 -07007#include <algorithm>
Paul Stewartb6063942011-08-05 10:17:29 -07008#include <string>
9#include <vector>
10
11#include <base/file_util.h>
12#include <base/string_util.h>
13#include <base/stringprintf.h>
14
15#include "shill/ipconfig.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070016#include "shill/logging.h"
Paul Stewartb6063942011-08-05 10:17:29 -070017
Paul Stewartb6063942011-08-05 10:17:29 -070018using base::StringPrintf;
19using std::string;
20using std::vector;
21
Paul Stewart0d2ada32011-08-09 17:01:57 -070022namespace shill {
23
Ben Chanbbdef5f2012-04-23 13:58:15 -070024namespace {
25base::LazyInstance<Resolver> g_resolver = LAZY_INSTANCE_INITIALIZER;
26} // namespace
Paul Stewart0d2ada32011-08-09 17:01:57 -070027
Paul Stewart4d5efb72012-09-17 12:24:34 -070028const char Resolver::kDefaultIgnoredSearchList[] = "gateway.2wire.net";
Paul Stewartbf667612012-06-29 14:49:54 -070029const char Resolver::kDefaultShortTimeoutTechnologies[] = "ethernet,wifi";
30const char Resolver::kDefaultTimeoutOptions[] =
31 "options single-request timeout:1 attempts:3";
32const char Resolver::kShortTimeoutOptions[] =
33 "options single-request timeout-ms:300 attempts:15";
34
Paul Stewartb6063942011-08-05 10:17:29 -070035Resolver::Resolver() {}
36
37Resolver::~Resolver() {}
38
39Resolver* Resolver::GetInstance() {
Paul Stewart0d2ada32011-08-09 17:01:57 -070040 return g_resolver.Pointer();
Paul Stewartb6063942011-08-05 10:17:29 -070041}
42
Paul Stewart4d5efb72012-09-17 12:24:34 -070043bool Resolver::SetDNSFromLists(const vector<string> &dns_servers,
44 const vector<string> &domain_search,
Paul Stewartbf667612012-06-29 14:49:54 -070045 TimeoutParameters timeout) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070046 SLOG(Resolver, 2) << __func__;
Paul Stewarte6132022011-08-16 09:11:02 -070047
Paul Stewart6f65c0b2012-09-11 14:57:32 -070048 CHECK(!path_.empty());
49
Paul Stewartdd60e452011-08-08 11:38:36 -070050 if (dns_servers.empty() && domain_search.empty()) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070051 SLOG(Resolver, 2) << "DNS list is empty";
Paul Stewartb6063942011-08-05 10:17:29 -070052 return ClearDNS();
53 }
54
55 vector<string> lines;
56 vector<string>::const_iterator iter;
Paul Stewartdd60e452011-08-08 11:38:36 -070057 for (iter = dns_servers.begin();
58 iter != dns_servers.end(); ++iter) {
Paul Stewartb6063942011-08-05 10:17:29 -070059 lines.push_back("nameserver " + *iter);
60 }
61
Paul Stewart4d5efb72012-09-17 12:24:34 -070062 vector<string> filtered_domain_search;
63 for (iter = domain_search.begin();
64 iter != domain_search.end(); ++iter) {
65 if (std::find(ignored_search_list_.begin(),
66 ignored_search_list_.end(),
67 *iter) == ignored_search_list_.end()) {
68 filtered_domain_search.push_back(*iter);
69 }
70 }
71
72 if (!filtered_domain_search.empty()) {
73 lines.push_back("search " + JoinString(filtered_domain_search, ' '));
Paul Stewartb6063942011-08-05 10:17:29 -070074 }
75
Thieu Le3bd0faa2012-02-15 15:44:46 -080076 // Send queries one-at-a-time, rather than parallelizing IPv4
Paul Stewartabc41aa2012-04-07 13:15:37 -070077 // and IPv6 queries for a single host. Also override the default
Paul Stewartbf667612012-06-29 14:49:54 -070078 // 5-second request timeout and 2 retries.
79 if (timeout == kDefaultTimeout) {
80 lines.push_back(kDefaultTimeoutOptions);
81 } else if (timeout == kShortTimeout) {
82 lines.push_back(kShortTimeoutOptions);
83 } else {
84 NOTIMPLEMENTED() << "Unknown Resolver timeout parameters";
85 }
Thieu Le3bd0faa2012-02-15 15:44:46 -080086
Paul Stewartb6063942011-08-05 10:17:29 -070087 // Newline at end of file
88 lines.push_back("");
89
90 string contents = JoinString(lines, '\n');
Paul Stewarte6132022011-08-16 09:11:02 -070091
Ben Chanfad4a0b2012-04-18 15:49:59 -070092 SLOG(Resolver, 2) << "Writing DNS out to " << path_.value();
Paul Stewartb6063942011-08-05 10:17:29 -070093 int count = file_util::WriteFile(path_, contents.c_str(), contents.size());
94
95 return count == static_cast<int>(contents.size());
96}
97
98bool Resolver::ClearDNS() {
Ben Chanfad4a0b2012-04-18 15:49:59 -070099 SLOG(Resolver, 2) << __func__;
Paul Stewarte6132022011-08-16 09:11:02 -0700100
Paul Stewartb6063942011-08-05 10:17:29 -0700101 CHECK(!path_.empty());
102
103 return file_util::Delete(path_, false);
104}
105
106} // namespace shill