* 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.
This commit is contained in:
Corinna Vinschen 2009-11-04 17:00:45 +00:00
parent 44a019897f
commit b5f48aa961
4 changed files with 28 additions and 15 deletions

View File

@ -1,3 +1,12 @@
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.

View File

@ -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);

View 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);

View File

@ -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;