OSDN Git Service

* cygcheck.cc (cygwin_dll_path): New global variable.
authorcorinna <corinna>
Thu, 5 Nov 2009 02:00:45 +0000 (02:00 +0000)
committercorinna <corinna>
Thu, 5 Nov 2009 02:00:45 +0000 (02:00 +0000)
(load_cygwin): Fetch cygwin DLL path and store in cygwin_dll_path.
* strace.cc: Full ditto.
* path.cc (read_mounts): First use the path stored in cygwin_dll_path,
if available.  Then fall back to fetching own path.  Add comment.
Drop printing warnings since they look funny in strace output.

winsup/utils/ChangeLog
winsup/utils/cygcheck.cc
winsup/utils/path.cc
winsup/utils/strace.cc

index 8f8ffe8..398670d 100644 (file)
@@ -1,5 +1,14 @@
 2009-11-04  Corinna Vinschen  <corinna@vinschen.de>
 
+       * cygcheck.cc (cygwin_dll_path): New global variable.
+       (load_cygwin): Fetch cygwin DLL path and store in cygwin_dll_path.
+       * strace.cc: Full ditto.
+       * path.cc (read_mounts): First use the path stored in cygwin_dll_path,
+       if available.  Then fall back to fetching own path.  Add comment.
+       Drop printing warnings since they look funny in strace output.
+
+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.
index 5f079f0..5c5892d 100644 (file)
@@ -63,7 +63,7 @@ void dump_dodgy_apps (int verbose);
 /* Forward declaration */
 static void usage (FILE *, int);
 
-static const char version[] = "$Revision: 1.121 $";
+static const char version[] = "$Revision: 1.122 $";
 
 static const char *known_env_vars[] = {
   "c_include_path",
@@ -2270,6 +2270,7 @@ nuke (char *ev)
 
 extern "C" {
 unsigned long (*cygwin_internal) (int, ...);
+WCHAR cygwin_dll_path[32768];
 };
 
 static void
@@ -2279,6 +2280,7 @@ load_cygwin (int& argc, char **&argv)
 
   if (!(h = LoadLibrary ("cygwin1.dll")))
     return;
+  GetModuleFileNameW (h, cygwin_dll_path, 32768);
   if ((cygwin_internal = (DWORD (*) (int, ...)) GetProcAddress (h, "cygwin_internal")))
     {
       char **av = (char **) cygwin_internal (CW_ARGV);
index 9495fbf..34001f0 100644 (file)
@@ -556,6 +556,8 @@ mnt_sort (const void *a, const void *b)
   return strcmp (ma->posix, mb->posix);
 }
 
+extern "C" WCHAR cygwin_dll_path[];
+
 static void
 read_mounts ()
 {
@@ -567,6 +569,7 @@ read_mounts ()
   DWORD len;
   WCHAR path[32768];
   PWCHAR path_end;
+  HMODULE h;
 
   for (mnt_t *m1 = mount_table; m1->posix; m1++)
     {
@@ -577,9 +580,16 @@ read_mounts ()
     }
   max_mount_entry = 0;
 
-  /* 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))
+  /* First fetch the cygwin1.dll path from the LoadLibrary call in load_cygwin.
+     This utilizes the DLL search order to find a matching cygwin1.dll and to
+     compute the installation path from that DLL's path. */
+  if (cygwin_dll_path[0])
+    wcscpy (path, cygwin_dll_path);
+  /* If we can't load cygwin1.dll, check where cygcheck is living itself and
+     try to fetch installation path from here.  Does cygwin1.dll exist in the
+     same path?  This should only kick in if the cygwin1.dll in the same path
+     has been made non-executable for the current user accidentally. */
+  else if (!GetModuleFileNameW (NULL, path, 32768))
     return;
   path_end = wcsrchr (path, L'\\');
   if (path_end)
@@ -612,21 +622,11 @@ read_mounts ()
              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');
-       }
+       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;
-    }
+    return;
   *path_end = L'\0';
 
   from_fstab (false, path, path_end);
index eb3b1a8..9f8b77d 100644 (file)
@@ -31,7 +31,7 @@ details. */
 #define alloca __builtin_alloca
 
 // Version string.
-static const char version[] = "$Revision$";
+static const char version[] = "$Revision: 1.21 $";
 
 static const char *pgm;
 static int forkdebug = 1;
@@ -264,6 +264,7 @@ ctrl_c (DWORD)
 
 extern "C" {
 unsigned long (*cygwin_internal) (int, ...);
+WCHAR cygwin_dll_path[32768];
 };
 
 static int
@@ -282,6 +283,7 @@ load_cygwin ()
       errno = ENOENT;
       return 0;
     }
+  GetModuleFileNameW (h, cygwin_dll_path, 32768);
   if (!(cygwin_internal = (DWORD (*) (int, ...)) GetProcAddress (h, "cygwin_internal")))
     {
       errno = ENOSYS;