summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/syscalls.cc
diff options
context:
space:
mode:
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;