Commit 12dc142a authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Dominick Meglio host file path discovery patch for windows

parent cb806708
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
  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.
+16 −5
Original line number Diff line number Diff line
@@ -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 {
    GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
    strcat(PATH_HOSTS, PATH_HOSTS_9X);
	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, WIN_PATH_HOSTS);

#elif defined(WATT32)
  extern const char *_w32_GetHostsFile (void);
+16 −6
Original line number Diff line number Diff line
@@ -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 {
    GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
    strcat(PATH_HOSTS, PATH_HOSTS_9X);
	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, WIN_PATH_HOSTS);

#elif defined(WATT32)
  extern const char *_w32_GetHostsFile (void);
+2 −2
Original line number Diff line number Diff line
@@ -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)