(mount_info::from_fstab): Remove patch from 2008-04-29.
* mount.cc (mount_info::conv_to_posix_path): Simplify test for native
UNC path.
* path.cc (normalize_win32_path): Ditto.
(symlink_worker): Ditto.
(symlink_info::posixify): Ditto.
(cygwin_conv_path): Ditto.
+2008-04-30 Corinna Vinschen <corinna@vinschen.de>
+
+ * mount.cc (is_unc_share): Allow \\?\ prefix as well. Enhance comment.
+ (mount_info::from_fstab): Remove patch from 2008-04-29.
+
+ * mount.cc (mount_info::conv_to_posix_path): Simplify test for native
+ UNC path.
+ * path.cc (normalize_win32_path): Ditto.
+ (symlink_worker): Ditto.
+ (symlink_info::posixify): Ditto.
+ (cygwin_conv_path): Ditto.
+
2008-04-29 Corinna Vinschen <corinna@vinschen.de>
* mount.cc (mount_info::from_fstab): Skip native path prefix in
#define isproc(path) \
(path_prefix_p (proc, (path), proc_len))
-/* is_unc_share: Return non-zero if PATH begins with //UNC/SHARE */
+/* is_unc_share: Return non-zero if PATH begins with //server/share
+ or with one of the native prefixes //./ or //?/
+ This function is only used to test for valid input strings.
+ The later normalization drops the native prefixes. */
static inline bool __stdcall
is_unc_share (const char *path)
const char *p;
return (isdirsep (path[0])
&& isdirsep (path[1])
- && (isalnum (path[2]) || path[2] == '.')
+ && (isalnum (path[2]) || path[2] == '.' || path[2] == '?')
&& ((p = strpbrk (path + 3, "\\/")) != NULL)
&& isalnum (p[1]));
}
if (!wcsncmp (src_path, L"\\\\?\\", 4))
{
src_path += 4;
- if (!wcsncmp (src_path, L"UNC\\", 4))
+ if (src_path[1] != L':') /* native UNC path */
{
- src_path += 2;
- src_path[0] = L'\\';
+ *(src_path += 2) = L'\\';
changed = true;
}
}
debug_printf ("GetModuleFileNameW, %E");
return false;
}
- if (!wcsncmp (path, L"\\\\?\\", 4))
- {
- path += 4;
- if (path[1] != L':')
- *(path += 2) = L'\\';
- }
w = wcsrchr (path, L'\\');
if (w)
{
&& src[2] == '?' && isdirsep (src[3]))
{
src += 4;
- if (ascii_strncasematch (src, "UNC", 3))
+ if (src[1] != ':') /* native UNC path */
{
src += 2; /* Fortunately the first char is not copied... */
beg_src_slash = true;
takes a wide char path name, it does not understand the
Win32 prefix for long pathnames! So we have to tack off
the prefix and convert the path to the "normal" syntax
- for ParseDisplayName. I have no idea if it's able to take
- long path names at all since I can't test it right now. */
+ for ParseDisplayName. */
WCHAR *wc = wc_path + 4;
- if (!wcsncmp (wc, L"UNC\\", 4))
+ if (wc[1] != L':') /* native UNC path */
*(wc += 2) = L'\\';
HRESULT res;
if (SUCCEEDED (res = psl->ParseDisplayName (NULL, NULL, wc, NULL,
if (srcbuf[0] == '\\' && !strncmp (srcbuf + 1, "??\\", 3))
{
srcbuf += 4;
- if (!strncmp (srcbuf, "UNC\\", 4))
- {
- srcbuf += 2;
- *srcbuf = '\\';
- }
+ if (srcbuf[1] != ':') /* native UNC path */
+ *(srcbuf += 2) = '\\';
}
if (isdrive (srcbuf))
mount_table->conv_to_posix_path (srcbuf, contents, 0);
buf = tp.c_get ();
sys_wcstombs (buf, NT_MAX_PATH, up->Buffer, up->Length / sizeof (WCHAR));
buf += 4; /* Skip \??\ */
- if (ascii_strncasematch (buf, "UNC\\", 4))
+ if (buf[1] != ':') /* native UNC path */
*(buf += 2) = '\\';
lsiz = strlen (buf) + 1;
break;