blob: d0d4d7ab80db8cde4ab56257859dbcf2a05a582f [file] [log] [blame]
Paul Stewartb6063942011-08-05 10:17:29 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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
7#include <string>
8#include <vector>
9
10#include <base/file_util.h>
11#include <base/string_util.h>
12#include <base/stringprintf.h>
13
14#include "shill/ipconfig.h"
15
Paul Stewartb6063942011-08-05 10:17:29 -070016using base::StringPrintf;
17using std::string;
18using std::vector;
19
Paul Stewart0d2ada32011-08-09 17:01:57 -070020namespace shill {
21
22static base::LazyInstance<Resolver> g_resolver(
23 base::LINKER_INITIALIZED);
24
Paul Stewartb6063942011-08-05 10:17:29 -070025Resolver::Resolver() {}
26
27Resolver::~Resolver() {}
28
29Resolver* Resolver::GetInstance() {
Paul Stewart0d2ada32011-08-09 17:01:57 -070030 return g_resolver.Pointer();
Paul Stewartb6063942011-08-05 10:17:29 -070031}
32
Paul Stewartdd60e452011-08-08 11:38:36 -070033bool Resolver::SetDNSFromIPConfig(const IPConfigRefPtr &ipconfig) {
Paul Stewarte6132022011-08-16 09:11:02 -070034 VLOG(2) << __func__;
35
Paul Stewartb6063942011-08-05 10:17:29 -070036 CHECK(!path_.empty());
37
38 const IPConfig::Properties &props = ipconfig->properties();
39
Paul Stewartdd60e452011-08-08 11:38:36 -070040 return SetDNSFromLists(props.dns_servers, props.domain_search);
41}
42
43bool Resolver::SetDNSFromLists(const std::vector<std::string> &dns_servers,
44 const std::vector<std::string> &domain_search) {
Paul Stewarte6132022011-08-16 09:11:02 -070045 VLOG(2) << __func__;
46
Paul Stewartdd60e452011-08-08 11:38:36 -070047 if (dns_servers.empty() && domain_search.empty()) {
Paul Stewarte6132022011-08-16 09:11:02 -070048 VLOG(2) << "DNS list is empty";
Paul Stewartb6063942011-08-05 10:17:29 -070049 return ClearDNS();
50 }
51
52 vector<string> lines;
53 vector<string>::const_iterator iter;
Paul Stewartdd60e452011-08-08 11:38:36 -070054 for (iter = dns_servers.begin();
55 iter != dns_servers.end(); ++iter) {
Paul Stewartb6063942011-08-05 10:17:29 -070056 lines.push_back("nameserver " + *iter);
57 }
58
Paul Stewartdd60e452011-08-08 11:38:36 -070059 if (!domain_search.empty()) {
60 lines.push_back("search " + JoinString(domain_search, ' '));
Paul Stewartb6063942011-08-05 10:17:29 -070061 }
62
63 // Newline at end of file
64 lines.push_back("");
65
66 string contents = JoinString(lines, '\n');
Paul Stewarte6132022011-08-16 09:11:02 -070067
68 VLOG(2) << "Writing DNS out to " << path_.value();
Paul Stewartb6063942011-08-05 10:17:29 -070069 int count = file_util::WriteFile(path_, contents.c_str(), contents.size());
70
71 return count == static_cast<int>(contents.size());
72}
73
74bool Resolver::ClearDNS() {
Paul Stewarte6132022011-08-16 09:11:02 -070075 VLOG(2) << __func__;
76
Paul Stewartb6063942011-08-05 10:17:29 -070077 CHECK(!path_.empty());
78
79 return file_util::Delete(path_, false);
80}
81
82} // namespace shill