summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/syscalls.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2006-10-31 11:40:47 +0000
committerCorinna Vinschen <corinna@vinschen.de>2006-10-31 11:40:47 +0000
commit9740f34d11c458fd7a07a025810422a6db1ad374 (patch)
treef534b30bf61b4392013eabe56906a053207a3acc /winsup/cygwin/syscalls.cc
parent3ddf69712bc97460fe6b0e82379e0c1132dce866 (diff)
downloadcygnal-9740f34d11c458fd7a07a025810422a6db1ad374.tar.gz
cygnal-9740f34d11c458fd7a07a025810422a6db1ad374.tar.bz2
cygnal-9740f34d11c458fd7a07a025810422a6db1ad374.zip
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Drop
directory attribute for reparse points to avoid mistreating. (fhandler_base::fstat_by_name): Ditto. * path.cc (symlink_info::check_reparse_point): New method testing reparse points for symbolic links. (symlink_info::check_shortcut): Move file attribute tesat to calling function. (symlink_info::check): Add handling for reparse points. * path.h (enum path_types): Add PATH_REP to denote reparse point based symlinks. (path_conv::is_rep_symlink): New method. * syscalls.cc (unlink): Handle reparse points.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc12
1 files changed, 10 insertions, 2 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 66839be95..eb07890a1 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -205,8 +205,11 @@ unlink (const char *ourname)
if (!win32_name.isremote () && wincap.has_delete_on_close ())
{
HANDLE h;
+ DWORD flags = FILE_FLAG_DELETE_ON_CLOSE;
+ if (win32_name.is_rep_symlink ())
+ flags |= FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS;
h = CreateFile (win32_name, 0, FILE_SHARE_READ, &sec_none_nih,
- OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0);
+ OPEN_EXISTING, flags, 0);
if (h != INVALID_HANDLE_VALUE)
{
if (wincap.has_hard_links () && setattrs)
@@ -229,7 +232,12 @@ unlink (const char *ourname)
}
/* Try a delete with attributes reset */
- if (DeleteFile (win32_name))
+ if (win32_name.is_rep_symlink () && RemoveDirectory (win32_name))
+ {
+ syscall_printf ("RemoveDirectory after CreateFile/CloseHandle succeeded");
+ goto ok;
+ }
+ else if (DeleteFile (win32_name))
{
syscall_printf ("DeleteFile after CreateFile/CloseHandle succeeded");
goto ok;