Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-11-04 18:47:29 +0300
committerCorinna Vinschen <corinna@vinschen.de>2009-11-04 18:47:29 +0300
commit44a019897fde5a5fbbd2a36c8a6c99066ec18d42 (patch)
tree37fad9d61e4e54fb71c9cd0bf7f8661cdda39b0d /winsup/utils/path.cc
parent73f2ecd19dea4a9c08f131af9a3dd2af6341d6b0 (diff)
* 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.
Diffstat (limited to 'winsup/utils/path.cc')
-rw-r--r--winsup/utils/path.cc63
1 files changed, 43 insertions, 20 deletions
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);