OSDN Git Service

* path.cc (read_mounts): First get installation path from own path.
authorcorinna <corinna>
Thu, 5 Nov 2009 00:47:29 +0000 (00:47 +0000)
committercorinna <corinna>
Thu, 5 Nov 2009 00:47:29 +0000 (00:47 +0000)
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
winsup/utils/path.cc

index c87d2ca..8f8ffe8 100644 (file)
@@ -1,5 +1,11 @@
 2009-11-04  Corinna Vinschen  <corinna@vinschen.de>
 
+       * 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  <corinna@vinschen.de>
+
        * Makefile.in (cygpath.exe): Add -fno-threadsafe-statics to CXXFLAGS.
 
 2009-10-31  Corinna Vinschen  <corinna@vinschen.de>
index 63c2ccc..9495fbf 100644 (file)
@@ -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);