diff options
Diffstat (limited to 'winsup/cygwin/dtable.cc')
-rw-r--r-- | winsup/cygwin/dtable.cc | 203 |
1 files changed, 98 insertions, 105 deletions
diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 7f997d479..cca215671 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -853,124 +853,117 @@ handle_to_fn (HANDLE h, char *posix_fn) NtQueryObject (h, ObjectNameInformation, &dummy_oni, sizeof (dummy_oni), &len); if (!len) + debug_printf ("NtQueryObject failed 1"); + else { - debug_printf ("NtQueryObject failed 1"); - goto unknown; - } - - OBJECT_NAME_INFORMATION *ntfn = (OBJECT_NAME_INFORMATION *) alloca (len + sizeof (WCHAR)); - NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, len, NULL); + OBJECT_NAME_INFORMATION *ntfn = (OBJECT_NAME_INFORMATION *) alloca (len + sizeof (WCHAR)); + NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, len, NULL); - if (!NT_SUCCESS (res)) - { - debug_printf ("NtQueryObject failed 2"); - goto unknown; - } + if (!NT_SUCCESS (res)) + debug_printf ("NtQueryObject failed 2"); + // NT seems to do this on an unopened file + else if (!ntfn->Name.Buffer) + debug_printf ("nt->Name.Buffer == NULL"); + else + { + WCHAR *w32 = ntfn->Name.Buffer; + size_t w32len = ntfn->Name.Length / sizeof (WCHAR); + w32[w32len] = L'\0'; - // NT seems to do this on an unopened file - if (!ntfn->Name.Buffer) - { - debug_printf ("nt->Name.Buffer == NULL"); - goto unknown; - } + if (wcscasecmp (w32, DEV_NULL) == 0) + { + strcpy (posix_fn, "/dev/null"); + return false; + } - WCHAR *w32 = ntfn->Name.Buffer; - size_t w32len = ntfn->Name.Length / sizeof (WCHAR); - w32[w32len] = L'\0'; + if (wcsncasecmp (w32, DEV_NAMED_PIPE, DEV_NAMED_PIPE_LEN) == 0) + { + w32 += DEV_NAMED_PIPE_LEN; + if (wcsncmp (w32, L"cygwin-", WCLEN (L"cygwin-")) != 0) + return false; + w32 += WCLEN (L"cygwin-"); + bool istty = wcsncmp (w32, L"tty", WCLEN (L"tty")) == 0; + if (istty) + decode_tty (posix_fn, w32 + WCLEN (L"tty")); + else if (wcsncmp (w32, L"pipe", WCLEN (L"pipe")) == 0) + strcpy (posix_fn, "/dev/pipe"); + return istty; + } - if (wcscasecmp (w32, DEV_NULL) == 0) - { - strcpy (posix_fn, "/dev/null"); - return false; - } - if (wcsncasecmp (w32, DEV_NAMED_PIPE, DEV_NAMED_PIPE_LEN) == 0) - { - w32 += DEV_NAMED_PIPE_LEN; - if (wcsncmp (w32, L"cygwin-", WCLEN (L"cygwin-")) != 0) - return false; - w32 += WCLEN (L"cygwin-"); - bool istty = wcsncmp (w32, L"tty", WCLEN (L"tty")) == 0; - if (istty) - decode_tty (posix_fn, w32 + WCLEN (L"tty")); - else if (wcsncmp (w32, L"pipe", WCLEN (L"pipe")) == 0) - strcpy (posix_fn, "/dev/pipe"); - return istty; - } + WCHAR fnbuf[64 * 1024]; + if (wcsncasecmp (w32, DEVICE_PREFIX, DEVICE_PREFIX_LEN) != 0 + || !QueryDosDeviceW (NULL, fnbuf, sizeof (fnbuf))) + { + sys_wcstombs (posix_fn, NT_MAX_PATH, w32, w32len); + return false; + } + for (WCHAR *s = fnbuf; *s; s = wcschr (s, '\0') + 1) + { + WCHAR device[NT_MAX_PATH]; + if (!QueryDosDeviceW (s, device, sizeof (device))) + continue; + if (wcschr (s, ':') == NULL) + continue; + WCHAR *q = wcsrchr (device, ';'); + if (q) + { + WCHAR *r = wcschr (q, '\\'); + if (r) + wcscpy (q, r + 1); + } + int devlen = wcslen (device); + if (device[devlen - 1] == L'\\') + device[--devlen] = L'\0'; + if (devlen < maxmatchlen) + continue; + if (wcsncmp (device, w32, devlen) != 0|| + (w32[devlen] != L'\0' && w32[devlen] != L'\\')) + continue; + maxmatchlen = devlen; + maxmatchdos = s; + debug_printf ("current match '%W' = '%W'\n", s, device); + } - WCHAR fnbuf[64 * 1024]; - if (wcsncasecmp (w32, DEVICE_PREFIX, DEVICE_PREFIX_LEN) != 0 - || !QueryDosDeviceW (NULL, fnbuf, sizeof (fnbuf))) - { - sys_wcstombs (posix_fn, NT_MAX_PATH, w32, w32len); - return false; - } + if (maxmatchlen) + { + WCHAR *p = wcschr (w32 + DEVICE_PREFIX_LEN, L'\\'); + size_t n = wcslen (maxmatchdos); + WCHAR ch; + if (!p) + ch = L'\0'; + else + { + if (maxmatchdos[n - 1] == L'\\') + n--; + w32 += maxmatchlen - n; + ch = L'\\'; + } + memcpy (w32, maxmatchdos, n * sizeof (WCHAR)); + w32[n] = ch; + } + else if (wcsncmp (w32, DEV_REMOTE, DEV_REMOTE_LEN) == 0) + { + w32 += DEV_REMOTE_LEN - 2; + *w32 = L'\\'; + debug_printf ("remote drive"); + } + else if (wcsncmp (w32, DEV_REMOTE1, DEV_REMOTE1_LEN) == 0) + { + w32 += DEV_REMOTE1_LEN - 2; + *w32 = L'\\'; + debug_printf ("remote drive"); + } - for (WCHAR *s = fnbuf; *s; s = wcschr (s, '\0') + 1) - { - WCHAR device[NT_MAX_PATH]; - if (!QueryDosDeviceW (s, device, sizeof (device))) - continue; - if (wcschr (s, ':') == NULL) - continue; - WCHAR *q = wcsrchr (device, ';'); - if (q) - { - WCHAR *r = wcschr (q, '\\'); - if (r) - wcscpy (q, r + 1); - } - int devlen = wcslen (device); - if (device[devlen - 1] == L'\\') - device[--devlen] = L'\0'; - if (devlen < maxmatchlen) - continue; - if (wcsncmp (device, w32, devlen) != 0|| - (w32[devlen] != L'\0' && w32[devlen] != L'\\')) - continue; - maxmatchlen = devlen; - maxmatchdos = s; - debug_printf ("current match '%W' = '%W'\n", s, device); - } + cygwin_conv_path (CCP_WIN_W_TO_POSIX | CCP_ABSOLUTE, w32, posix_fn, + NT_MAX_PATH); - if (maxmatchlen) - { - WCHAR *p = wcschr (w32 + DEVICE_PREFIX_LEN, L'\\'); - size_t n = wcslen (maxmatchdos); - WCHAR ch; - if (!p) - ch = L'\0'; - else - { - if (maxmatchdos[n - 1] == L'\\') - n--; - w32 += maxmatchlen - n; - ch = L'\\'; + debug_printf ("derived path '%W', posix '%s'", w32, posix_fn); + return false; } - memcpy (w32, maxmatchdos, n * sizeof (WCHAR)); - w32[n] = ch; - } - else if (wcsncmp (w32, DEV_REMOTE, DEV_REMOTE_LEN) == 0) - { - w32 += DEV_REMOTE_LEN - 2; - *w32 = L'\\'; - debug_printf ("remote drive"); } - else if (wcsncmp (w32, DEV_REMOTE1, DEV_REMOTE1_LEN) == 0) - { - w32 += DEV_REMOTE1_LEN - 2; - *w32 = L'\\'; - debug_printf ("remote drive"); - } - - cygwin_conv_path (CCP_WIN_W_TO_POSIX | CCP_ABSOLUTE, w32, posix_fn, - NT_MAX_PATH); - - debug_printf ("derived path '%W', posix '%s'", w32, posix_fn); - return false; -unknown: strcpy (posix_fn, unknown_file); return false; } |