From 44a019897fde5a5fbbd2a36c8a6c99066ec18d42 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 4 Nov 2009 15:47:29 +0000 Subject: [PATCH] * path.cc (read_mounts): First get installation path from own path. Check if cygwin1.dll exists in same directory. Only if not, try to get installation path from setup registry key. Add ample warnings. --- winsup/utils/ChangeLog | 6 ++++ winsup/utils/path.cc | 63 ++++++++++++++++++++++++++++-------------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index c87d2cae3..8f8ffe889 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,9 @@ +2009-11-04 Corinna Vinschen + + * path.cc (read_mounts): First get installation path from own path. + Check if cygwin1.dll exists in same directory. Only if not, try to + get installation path from setup registry key. Add ample warnings. + 2009-11-04 Corinna Vinschen * Makefile.in (cygpath.exe): Add -fno-threadsafe-statics to CXXFLAGS. diff --git a/winsup/utils/path.cc b/winsup/utils/path.cc index 63c2ccc43..9495fbf44 100644 --- a/winsup/utils/path.cc +++ b/winsup/utils/path.cc @@ -577,33 +577,56 @@ read_mounts () } max_mount_entry = 0; - for (int i = 0; i < 2; ++i) - if ((ret = RegOpenKeyExW (i ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, - L"Software\\Cygwin\\setup", 0, - KEY_READ, &setup_key)) == ERROR_SUCCESS) - { - len = 32768 * sizeof (WCHAR); - ret = RegQueryValueExW (setup_key, L"rootdir", NULL, NULL, - (PBYTE) path, &len); - RegCloseKey (setup_key); - if (ret == ERROR_SUCCESS) - break; - } - if (ret == ERROR_SUCCESS) - path_end = wcschr (path, L'\0'); - else + /* First check where cygcheck is living itself and try to fetch installation + path from here. Does cygwin1.dll exist in the same path? */ + if (!GetModuleFileNameW (NULL, path, 32768)) + return; + path_end = wcsrchr (path, L'\\'); + if (path_end) { - if (!GetModuleFileNameW (NULL, path, 32768)) - return; - path_end = wcsrchr (path, L'\\'); - if (path_end) + wcscpy (path_end, L"\\cygwin1.dll"); + DWORD attr = GetFileAttributesW (path); + if (attr == (DWORD) -1 + || (attr & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT))) + path_end = NULL; + else { *path_end = L'\0'; path_end = wcsrchr (path, L'\\'); } } + /* If we can't create a valid installation dir from that, try to fetch + the installation dir from the setup registry key. */ if (!path_end) - return; + { + for (int i = 0; i < 2; ++i) + if ((ret = RegOpenKeyExW (i ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, + L"Software\\Cygwin\\setup", 0, + KEY_READ, &setup_key)) == ERROR_SUCCESS) + { + len = 32768 * sizeof (WCHAR); + ret = RegQueryValueExW (setup_key, L"rootdir", NULL, NULL, + (PBYTE) path, &len); + RegCloseKey (setup_key); + if (ret == ERROR_SUCCESS) + break; + } + if (ret == ERROR_SUCCESS) + { + printf ("\n" +"Warning! Computing mount points from setup registry key. Mount points might\n" +"be wrong if you have multiple Cygwin installations on this machine.\n"); + path_end = wcschr (path, L'\0'); + } + } + /* If we can't fetch an installation dir, bail out. */ + if (!path_end) + { + printf ("\n" +"Warning! Could not generate mount table since no valid installation path\n" +"could be found.\n"); + return; + } *path_end = L'\0'; from_fstab (false, path, path_end); -- 2.43.5