diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-11-04 17:00:45 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-11-04 17:00:45 +0000 |
commit | b5f48aa96165f6f18f4f5c2b337171c626c6b423 (patch) | |
tree | 15260f52949ccf73e45c16c034540b9123cff86f /winsup/utils | |
parent | 44a019897fde5a5fbbd2a36c8a6c99066ec18d42 (diff) | |
download | newlib-b5f48aa96165f6f18f4f5c2b337171c626c6b423.zip newlib-b5f48aa96165f6f18f4f5c2b337171c626c6b423.tar.gz newlib-b5f48aa96165f6f18f4f5c2b337171c626c6b423.tar.bz2 |
* 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.
Diffstat (limited to 'winsup/utils')
-rw-r--r-- | winsup/utils/ChangeLog | 9 | ||||
-rw-r--r-- | winsup/utils/cygcheck.cc | 2 | ||||
-rw-r--r-- | winsup/utils/path.cc | 30 | ||||
-rw-r--r-- | winsup/utils/strace.cc | 2 |
4 files changed, 28 insertions, 15 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index 8f8ffe8..398670d 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 62065d2..da151ae 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 9495fbf..34001f0 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 eb3b1a8..f3acec6 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; |