summaryrefslogtreecommitdiffstats
path: root/net/dns/dns_config_service_win.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/dns/dns_config_service_win.h')
-rw-r--r--net/dns/dns_config_service_win.h71
1 files changed, 67 insertions, 4 deletions
diff --git a/net/dns/dns_config_service_win.h b/net/dns/dns_config_service_win.h
index 97dcf6c..d60ae04 100644
--- a/net/dns/dns_config_service_win.h
+++ b/net/dns/dns_config_service_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,6 +6,11 @@
#define NET_DNS_DNS_CONFIG_SERVICE_WIN_H_
#pragma once
+// The sole purpose of dns_config_service_win.h is for unittests so we just
+// include these headers here.
+#include <winsock2.h>
+#include <iphlpapi.h>
+
#include <string>
#include <vector>
@@ -15,6 +20,17 @@
#include "net/base/net_export.h"
#include "net/dns/dns_config_service.h"
+// The general effort of DnsConfigServiceWin is to configure |nameservers| and
+// |search| in DnsConfig. The settings are stored in the Windows registry, but
+// to simplify the task we use the IP Helper API wherever possible. That API
+// yields the complete and ordered |nameservers|, but to determine |search| we
+// need to use the registry. On Windows 7, WMI does return the correct |search|
+// but on earlier versions it is insufficient.
+//
+// Experimental evaluation of Windows behavior suggests that domain parsing is
+// naive. Domain suffixes in |search| are not validated until they are appended
+// to the resolved name. We attempt to replicate this behavior.
+
namespace net {
class WatchingFileReader;
@@ -35,13 +51,60 @@ class NET_EXPORT_PRIVATE DnsConfigServiceWin
DISALLOW_COPY_AND_ASSIGN(DnsConfigServiceWin);
};
+// All relevant settings read from registry and IP Helper. This isolates our
+// logic from system calls and is exposed for unit tests. Keep it an aggregate
+// struct for easy initialization.
+struct NET_EXPORT_PRIVATE DnsSystemSettings {
+ // The |set| flag distinguishes between empty and unset values.
+ struct RegString {
+ bool set;
+ string16 value;
+ };
+
+ struct RegDword {
+ bool set;
+ DWORD value;
+ };
+
+ struct DevolutionSetting {
+ // UseDomainNameDevolution
+ RegDword enabled;
+ // DomainNameDevolutionLevel
+ RegDword level;
+ };
+
+ // Filled in by GetAdapterAddresses.
+ scoped_ptr_malloc<IP_ADAPTER_ADDRESSES> addresses;
+
+ // SOFTWARE\Policies\Microsoft\Windows NT\DNSClient\SearchList
+ RegString policy_search_list;
+ // SYSTEM\CurrentControlSet\Tcpip\Parameters\SearchList
+ RegString tcpip_search_list;
+ // SYSTEM\CurrentControlSet\Tcpip\Parameters\Domain
+ RegString tcpip_domain;
+
+ // SOFTWARE\Policies\Microsoft\Windows NT\DNSClient
+ DevolutionSetting policy_devolution;
+ // SYSTEM\CurrentControlSet\Dnscache\Parameters
+ DevolutionSetting dnscache_devolution;
+ // SYSTEM\CurrentControlSet\Tcpip\Parameters
+ DevolutionSetting tcpip_devolution;
+
+ // SOFTWARE\Policies\Microsoft\Windows NT\DNSClient\AppendToMultiLabelName
+ RegDword append_to_multi_label_name;
+};
+
// Parses |value| as search list (comma-delimited list of domain names) from
-// a registry key and stores it in |out|. Returns true on success.
-// Empty entries (e.g., "chromium.org,,org") terminate the list.
-// Non-ascii hostnames are converted to punycode.
+// a registry key and stores it in |out|. Returns true on success. Empty
+// entries (e.g., "chromium.org,,org") terminate the list. Non-ascii hostnames
+// are converted to punycode.
bool NET_EXPORT_PRIVATE ParseSearchList(const string16& value,
std::vector<std::string>* out);
+// Fills in |dns_config| from |settings|. Exposed for tests.
+bool NET_EXPORT_PRIVATE ConvertSettingsToDnsConfig(
+ const DnsSystemSettings& settings, DnsConfig* dns_config);
+
} // namespace net
#endif // NET_DNS_DNS_CONFIG_SERVICE_WIN_H_