* 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.
This commit is contained in:
Corinna Vinschen 2008-04-30 08:49:23 +00:00
parent f77a1a8848
commit 7e2b8e7d2a
3 changed files with 25 additions and 21 deletions

View File

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

View File

@ -42,7 +42,10 @@ details. */
#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)
@ -50,7 +53,7 @@ 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]));
}
@ -576,10 +579,9 @@ mount_info::conv_to_posix_path (PWCHAR src_path, char *posix_path,
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;
}
}
@ -881,12 +883,6 @@ mount_info::from_fstab (bool user)
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)
{

View File

@ -1353,7 +1353,7 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
&& 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;
@ -1643,10 +1643,9 @@ symlink_worker (const char *oldpath, const char *newpath, bool use_winsym,
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,
@ -2013,11 +2012,8 @@ symlink_info::posixify (char *srcbuf)
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);
@ -2729,7 +2725,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to,
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;