From 12dc142a2847c11596ecd44c7a4d2d57960dcd85 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Sun, 26 Sep 2004 18:20:58 +0000
Subject: [PATCH] Dominick Meglio host file path discovery patch for windows

---
 ares/CHANGES              | 14 ++++++++++++++
 ares/ares_gethostbyaddr.c | 21 ++++++++++++++++-----
 ares/ares_gethostbyname.c | 22 ++++++++++++++++------
 ares/ares_private.h       |  4 ++--
 4 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/ares/CHANGES b/ares/CHANGES
index 869ad02ff..0c3d6a3d5 100644
--- a/ares/CHANGES
+++ b/ares/CHANGES
@@ -1,5 +1,19 @@
   Changelog for the c-ares project
 
+* September 26
+
+- Dominick Meglio patched: C-ares on Windows assumed that the HOSTS file is
+  located in a static location. It assumed
+  C:\Windows\System32\Drivers\Etc. This is a poor assumption to make. In fact,
+  the location of the HOSTS file can be changed via a registry setting.
+
+  There is a key called DatabasePath which specifies the path to the HOSTS
+  file:
+  http://www.microsoft.com/technet/itsolutions/network/deploy/depovg/tcpip2k.mspx
+
+  The patch will make c-ares correctly consult the registry for the location
+  of this file.
+
 * August 29
 
 - Gisle Vanem fixed the MSVC build files.
diff --git a/ares/ares_gethostbyaddr.c b/ares/ares_gethostbyaddr.c
index f44b3fb38..978beba47 100644
--- a/ares/ares_gethostbyaddr.c
+++ b/ares/ares_gethostbyaddr.c
@@ -150,12 +150,23 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
 
   char PATH_HOSTS[MAX_PATH];
   if (IsNT) {
-    GetSystemDirectory(PATH_HOSTS, MAX_PATH);
-    strcat(PATH_HOSTS, PATH_HOSTS_NT);
-  } else {
+	char tmp[MAX_PATH];
+	HKEY hkeyHosts;
+
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
+		== ERROR_SUCCESS)
+	{
+		DWORD dwLength = MAX_PATH;
+		RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, 
+			&dwLength);
+		ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
+		RegCloseKey(hkeyHosts);
+	}
+  } 
+  else
     GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
-    strcat(PATH_HOSTS, PATH_HOSTS_9X);
-  }
+
+  strcat(PATH_HOSTS, WIN_PATH_HOSTS);
 
 #elif defined(WATT32)
   extern const char *_w32_GetHostsFile (void);
diff --git a/ares/ares_gethostbyname.c b/ares/ares_gethostbyname.c
index b39d53be6..decac5583 100644
--- a/ares/ares_gethostbyname.c
+++ b/ares/ares_gethostbyname.c
@@ -220,15 +220,25 @@ static int file_lookup(const char *name, struct hostent **host)
   int status;
 
 #ifdef WIN32
-
   char PATH_HOSTS[MAX_PATH];
   if (IsNT) {
-    GetSystemDirectory(PATH_HOSTS, MAX_PATH);
-    strcat(PATH_HOSTS, PATH_HOSTS_NT);
-  } else {
+	char tmp[MAX_PATH];
+	HKEY hkeyHosts;
+
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
+		== ERROR_SUCCESS)
+	{
+		DWORD dwLength = MAX_PATH;
+		RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, 
+			&dwLength);
+		ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
+		RegCloseKey(hkeyHosts);
+	}
+  } 
+  else
     GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
-    strcat(PATH_HOSTS, PATH_HOSTS_9X);
-  }
+
+  strcat(PATH_HOSTS, WIN_PATH_HOSTS);
 
 #elif defined(WATT32)
   extern const char *_w32_GetHostsFile (void);
diff --git a/ares/ares_private.h b/ares/ares_private.h
index 0b16dc0df..06f876836 100644
--- a/ares/ares_private.h
+++ b/ares/ares_private.h
@@ -46,8 +46,8 @@
 #define WIN_NS_NT_KEY  "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
 #define NAMESERVER     "NameServer"
 #define DHCPNAMESERVER "DhcpNameServer"
-#define PATH_HOSTS_NT  "\\drivers\\etc\\hosts"
-#define PATH_HOSTS_9X  "\\hosts"
+#define DATABASEPATH   "DatabasePath"
+#define WIN_PATH_HOSTS  "\\hosts"
 
 #elif defined(WATT32)
 
-- 
2.40.0