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
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/utils/ChangeLog9
-rw-r--r--winsup/utils/cygcheck.cc2
-rw-r--r--winsup/utils/path.cc30
-rw-r--r--winsup/utils/strace.cc2
4 files changed, 28 insertions, 15 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog
index 8f8ffe889..398670d8f 100644
--- a/winsup/utils/ChangeLog
+++ b/winsup/utils/ChangeLog
@@ -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.
diff --git a/winsup/utils/cygcheck.cc b/winsup/utils/cygcheck.cc
index 62065d25b..da151ae44 100644
--- a/winsup/utils/cygcheck.cc
+++ b/winsup/utils/cygcheck.cc
@@ -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);
diff --git a/winsup/utils/path.cc b/winsup/utils/path.cc
index 9495fbf44..34001f057 100644
--- a/winsup/utils/path.cc
+++ b/winsup/utils/path.cc
@@ -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);
diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc
index eb3b1a875..f3acec68f 100644
--- a/winsup/utils/strace.cc
+++ b/winsup/utils/strace.cc
@@ -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;