W32: consider NTFS mounpoints to be symlinks

While mountpoints are *not* symlinks, strictly speaking,
they works in a similar enough way, so consider them to be
symlinks for the purpose of querying local file info.
This commit is contained in:
Руслан Ижбулатов 2018-08-08 21:42:45 +00:00
parent 929844fdf7
commit 075bb0f751

View File

@ -961,7 +961,8 @@ set_info_from_stat (GFileInfo *info,
else if (S_ISLNK (statbuf->st_mode)) else if (S_ISLNK (statbuf->st_mode))
file_type = G_FILE_TYPE_SYMBOLIC_LINK; file_type = G_FILE_TYPE_SYMBOLIC_LINK;
#elif defined (G_OS_WIN32) #elif defined (G_OS_WIN32)
if (statbuf->reparse_tag == IO_REPARSE_TAG_SYMLINK) if (statbuf->reparse_tag == IO_REPARSE_TAG_SYMLINK ||
statbuf->reparse_tag == IO_REPARSE_TAG_MOUNT_POINT)
file_type = G_FILE_TYPE_SYMBOLIC_LINK; file_type = G_FILE_TYPE_SYMBOLIC_LINK;
#endif #endif
@ -1808,7 +1809,9 @@ _g_local_file_info_get (const char *basename,
is_symlink = stat_ok && S_ISLNK (statbuf.st_mode); is_symlink = stat_ok && S_ISLNK (statbuf.st_mode);
#elif defined (G_OS_WIN32) #elif defined (G_OS_WIN32)
/* glib already checked the FILE_ATTRIBUTE_REPARSE_POINT for us */ /* glib already checked the FILE_ATTRIBUTE_REPARSE_POINT for us */
is_symlink = stat_ok && statbuf.reparse_tag == IO_REPARSE_TAG_SYMLINK; is_symlink = stat_ok &&
(statbuf.reparse_tag == IO_REPARSE_TAG_SYMLINK ||
statbuf.reparse_tag == IO_REPARSE_TAG_MOUNT_POINT);
#else #else
is_symlink = FALSE; is_symlink = FALSE;
#endif #endif
@ -2191,7 +2194,9 @@ set_unix_mode (char *filename,
GWin32PrivateStat statbuf; GWin32PrivateStat statbuf;
res = GLIB_PRIVATE_CALL (g_win32_lstat_utf8) (filename, &statbuf); res = GLIB_PRIVATE_CALL (g_win32_lstat_utf8) (filename, &statbuf);
is_symlink = (res == 0 && statbuf.reparse_tag == IO_REPARSE_TAG_SYMLINK); is_symlink = (res == 0 &&
(statbuf.reparse_tag == IO_REPARSE_TAG_SYMLINK ||
statbuf.reparse_tag == IO_REPARSE_TAG_MOUNT_POINT));
#endif #endif
if (is_symlink) if (is_symlink)
{ {