summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-08-25 11:27:03 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-08-25 11:27:03 +0000
commitc177980e756d448fb7a9afc9b814fa3da3cc7bb8 (patch)
treed18b79107be395983fed1f1d8a767cb606177b37 /winsup/cygwin/path.cc
parent162a23c5049fc63373543f6edd60713d52530e4b (diff)
downloadcygnal-c177980e756d448fb7a9afc9b814fa3da3cc7bb8.tar.gz
cygnal-c177980e756d448fb7a9afc9b814fa3da3cc7bb8.tar.bz2
cygnal-c177980e756d448fb7a9afc9b814fa3da3cc7bb8.zip
* mount.cc (fs_info::update): Add comment.
* path.cc (symlink_info::check_reparse_point): Return -1 for volume mount points. Explain why. (symlink_info::check): Call fs.update again for volume mount points. Explain why.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index e6782f6e9..4d0b1b9d2 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1874,8 +1874,10 @@ symlink_info::check_reparse_point (HANDLE h)
if (rp->MountPointReparseBuffer.PrintNameLength == 0
|| RtlEqualUnicodePathPrefix (&subst, &ro_u_volume, TRUE))
{
- /* Volume mount point. Not treated as symlink. */
- return 0;
+ /* Volume mount point. Not treated as symlink. The return
+ value of -1 is a hint for the caller to treat this as a
+ volume mount point. */
+ return -1;
}
sys_wcstombs (srcbuf, SYMLINK_MAX + 1,
(WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer
@@ -2410,7 +2412,17 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
else if (fileattr & FILE_ATTRIBUTE_REPARSE_POINT)
{
res = check_reparse_point (h);
- if (res)
+ if (res == -1)
+ {
+ /* Volume mount point. The filesystem information for the top
+ level directory should be for the volume top level directory
+ itself, rather than for the reparse point itself. So we
+ fetch the filesystem information again, but with a NULL
+ handle. This does what we want because fs_info::update opens
+ the handle without FILE_OPEN_REPARSE_POINT. */
+ fs.update (&upath, NULL);
+ }
+ else if (res)
break;
}