* syscalls.cc (try_to_bin): Improve debug output.
(check_dir_not_empty): Take additional path_conv argument. Improve debug output. Change syscall_printf to debug_printf. (unlink_nt): Improve debug output. Change syscall_printf to debug_printf. (unlink): Change syscall_printf to debug_printf. * cygthread.h: Fix copyright dates.
This commit is contained in:
parent
ba52f4444b
commit
aa982024d1
|
@ -1,3 +1,14 @@
|
||||||
|
2011-10-20 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* syscalls.cc (try_to_bin): Improve debug output.
|
||||||
|
(check_dir_not_empty): Take additional path_conv argument. Improve
|
||||||
|
debug output. Change syscall_printf to debug_printf.
|
||||||
|
(unlink_nt): Improve debug output. Change syscall_printf to
|
||||||
|
debug_printf.
|
||||||
|
(unlink): Change syscall_printf to debug_printf.
|
||||||
|
|
||||||
|
* cygthread.h: Fix copyright dates.
|
||||||
|
|
||||||
2011-10-18 Corinna Vinschen <corinna@vinschen.de>
|
2011-10-18 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* path.cc: Extend two comments. Mention the name RtlpCurDirRef
|
* path.cc: Extend two comments. Mention the name RtlpCurDirRef
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* cygthread.h
|
/* cygthread.h
|
||||||
|
|
||||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2010
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2010,
|
||||||
Red Hat, Inc.
|
2011 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
|
|
@ -232,8 +232,8 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
status = NtQueryInformationFile (fh, &io, pfni, 65536, FileNameInformation);
|
status = NtQueryInformationFile (fh, &io, pfni, 65536, FileNameInformation);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtQueryInformationFile (FileNameInformation) failed, %08x",
|
debug_printf ("NtQueryInformationFile (%S, FileNameInformation) "
|
||||||
status);
|
"failed, status = %p", pc.get_nt_native_path (), status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* The filename could change, the parent dir not. So we split both paths
|
/* The filename could change, the parent dir not. So we split both paths
|
||||||
|
@ -277,7 +277,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_SHARE_VALID_FLAGS, FILE_OPEN_FOR_BACKUP_INTENT);
|
FILE_SHARE_VALID_FLAGS, FILE_OPEN_FOR_BACKUP_INTENT);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtOpenFile (%S) failed, %08x", &root, status);
|
debug_printf ("NtOpenFile (%S) failed, status = %p", &root, status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,8 +320,8 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FileInternalInformation);
|
FileInternalInformation);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtQueryInformationFile (FileInternalInformation) failed, "
|
debug_printf ("NtQueryInformationFile (%S, FileInternalInformation) "
|
||||||
"%08x", status);
|
"failed, status = %p", pc.get_nt_native_path (), status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
RtlInt64ToHexUnicodeString (pfii->FileId.QuadPart, &recycler, TRUE);
|
RtlInt64ToHexUnicodeString (pfii->FileId.QuadPart, &recycler, TRUE);
|
||||||
|
@ -343,7 +343,8 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_SHARE_VALID_FLAGS, FILE_OPEN_FOR_BACKUP_INTENT);
|
FILE_SHARE_VALID_FLAGS, FILE_OPEN_FOR_BACKUP_INTENT);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtOpenFile (%S) failed, %08x", &recycler, status);
|
debug_printf ("NtOpenFile (%S) failed, status = %p",
|
||||||
|
&recycler, status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Then check if recycler exists by opening and potentially creating it.
|
/* Then check if recycler exists by opening and potentially creating it.
|
||||||
|
@ -364,7 +365,8 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_DIRECTORY_FILE, NULL, 0);
|
FILE_DIRECTORY_FILE, NULL, 0);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtCreateFile (%S) failed, %08x", &recycler, status);
|
debug_printf ("NtCreateFile (%S) failed, status = %p",
|
||||||
|
&recycler, status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Next, if necessary, check if the recycler/SID dir exists and
|
/* Next, if necessary, check if the recycler/SID dir exists and
|
||||||
|
@ -381,7 +383,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_DIRECTORY_FILE, NULL, 0);
|
FILE_DIRECTORY_FILE, NULL, 0);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
debug_printf ("NtCreateFile (%S) failed, %08x",
|
debug_printf ("NtCreateFile (%S) failed, status = %p",
|
||||||
&recycler, status);
|
&recycler, status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -400,13 +402,15 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT
|
FILE_SYNCHRONOUS_IO_NONALERT
|
||||||
| FILE_NON_DIRECTORY_FILE, NULL, 0);
|
| FILE_NON_DIRECTORY_FILE, NULL, 0);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("NtCreateFile (%S) failed, %08x", &recycler, status);
|
debug_printf ("NtCreateFile (%S) failed, status = %p",
|
||||||
|
&recycler, status);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, desktop_ini,
|
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, desktop_ini,
|
||||||
sizeof desktop_ini - 1, NULL, NULL);
|
sizeof desktop_ini - 1, NULL, NULL);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("NtWriteFile (%S) failed, %08x", &fname, status);
|
debug_printf ("NtWriteFile (%S) failed, status = %p",
|
||||||
|
&fname, status);
|
||||||
NtClose (tmp_fh);
|
NtClose (tmp_fh);
|
||||||
}
|
}
|
||||||
if (!wincap.has_recycle_dot_bin ()) /* No INFO2 file since Vista */
|
if (!wincap.has_recycle_dot_bin ()) /* No INFO2 file since Vista */
|
||||||
|
@ -419,14 +423,14 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT
|
FILE_SYNCHRONOUS_IO_NONALERT
|
||||||
| FILE_NON_DIRECTORY_FILE, NULL, 0);
|
| FILE_NON_DIRECTORY_FILE, NULL, 0);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("NtCreateFile (%S) failed, %08x",
|
debug_printf ("NtCreateFile (%S) failed, status = %p",
|
||||||
&recycler, status);
|
&recycler, status);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, info2,
|
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, info2,
|
||||||
sizeof info2, NULL, NULL);
|
sizeof info2, NULL, NULL);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("NtWriteFile (%S) failed, %08x",
|
debug_printf ("NtWriteFile (%S) failed, status = %p",
|
||||||
&fname, status);
|
&fname, status);
|
||||||
NtClose (tmp_fh);
|
NtClose (tmp_fh);
|
||||||
}
|
}
|
||||||
|
@ -485,17 +489,17 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access)
|
||||||
FileRenameInformation);
|
FileRenameInformation);
|
||||||
NtClose (tmp_fh);
|
NtClose (tmp_fh);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("Overwriting with another file failed, status = %p",
|
debug_printf ("Overwriting with another file failed, status = %p", status);
|
||||||
status);
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (rootdir)
|
if (rootdir)
|
||||||
NtClose (rootdir);
|
NtClose (rootdir);
|
||||||
|
debug_printf ("%S, return status %d", pc.get_nt_native_path (), bin_stat);
|
||||||
return bin_stat;
|
return bin_stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
check_dir_not_empty (HANDLE dir)
|
check_dir_not_empty (HANDLE dir, path_conv &pc)
|
||||||
{
|
{
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
const ULONG bufsiz = 3 * sizeof (FILE_NAMES_INFORMATION)
|
const ULONG bufsiz = 3 * sizeof (FILE_NAMES_INFORMATION)
|
||||||
|
@ -507,8 +511,8 @@ check_dir_not_empty (HANDLE dir)
|
||||||
FALSE, NULL, TRUE);
|
FALSE, NULL, TRUE);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
syscall_printf ("Checking if directory is empty failed, "
|
debug_printf ("Checking if directory %S is empty failed, status = %p",
|
||||||
"status = %p", status);
|
pc.get_nt_native_path (), status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
int cnt = 1;
|
int cnt = 1;
|
||||||
|
@ -516,11 +520,20 @@ check_dir_not_empty (HANDLE dir)
|
||||||
{
|
{
|
||||||
if (++cnt > 2)
|
if (++cnt > 2)
|
||||||
{
|
{
|
||||||
syscall_printf ("Directory not empty");
|
if (strace.active ())
|
||||||
return STATUS_DIRECTORY_NOT_EMPTY;
|
{
|
||||||
}
|
UNICODE_STRING fname;
|
||||||
|
|
||||||
pfni = (PFILE_NAMES_INFORMATION)
|
pfni = (PFILE_NAMES_INFORMATION)
|
||||||
((caddr_t) pfni + pfni->NextEntryOffset);
|
((caddr_t) pfni + pfni->NextEntryOffset);
|
||||||
|
RtlInitCountedUnicodeString(&fname, pfni->FileName,
|
||||||
|
pfni->FileNameLength);
|
||||||
|
debug_printf ("Directory %S not empty, found file <%S>",
|
||||||
|
pc.get_nt_native_path (), &fname);
|
||||||
|
}
|
||||||
|
return STATUS_DIRECTORY_NOT_EMPTY;
|
||||||
|
}
|
||||||
|
pfni = (PFILE_NAMES_INFORMATION) ((caddr_t) pfni + pfni->NextEntryOffset);
|
||||||
}
|
}
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -538,6 +551,8 @@ unlink_nt (path_conv &pc)
|
||||||
|
|
||||||
bin_status bin_stat = dont_move;
|
bin_status bin_stat = dont_move;
|
||||||
|
|
||||||
|
syscall_printf ("Trying to delete %S, isdir = %d",
|
||||||
|
pc.get_nt_native_path (), pc.isdir ());
|
||||||
ACCESS_MASK access = DELETE;
|
ACCESS_MASK access = DELETE;
|
||||||
ULONG flags = FILE_OPEN_FOR_BACKUP_INTENT;
|
ULONG flags = FILE_OPEN_FOR_BACKUP_INTENT;
|
||||||
/* Add the reparse point flag to native symlinks, otherwise we remove the
|
/* Add the reparse point flag to native symlinks, otherwise we remove the
|
||||||
|
@ -566,10 +581,19 @@ unlink_nt (path_conv &pc)
|
||||||
FILE_SHARE_VALID_FLAGS, flags);
|
FILE_SHARE_VALID_FLAGS, flags);
|
||||||
if (NT_SUCCESS (status))
|
if (NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
NtSetAttributesFile (fh_ro, pc.file_attributes ()
|
debug_printf ("Opening %S for removing R/O succeeded",
|
||||||
|
pc.get_nt_native_path ());
|
||||||
|
NTSTATUS status2 = NtSetAttributesFile (fh_ro,
|
||||||
|
pc.file_attributes ()
|
||||||
& ~FILE_ATTRIBUTE_READONLY);
|
& ~FILE_ATTRIBUTE_READONLY);
|
||||||
|
if (!NT_SUCCESS (status2))
|
||||||
|
debug_printf ("Removing R/O on %S failed, status = %p",
|
||||||
|
pc.get_nt_native_path (), status2);
|
||||||
pc.init_reopen_attr (&attr, fh_ro);
|
pc.init_reopen_attr (&attr, fh_ro);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
debug_printf ("Opening %S for removing R/O failed, status = %p",
|
||||||
|
pc.get_nt_native_path (), status);
|
||||||
if (pc.is_lnk_symlink ())
|
if (pc.is_lnk_symlink ())
|
||||||
{
|
{
|
||||||
status = NtQueryInformationFile (fh_ro, &io, &fsi, sizeof fsi,
|
status = NtQueryInformationFile (fh_ro, &io, &fsi, sizeof fsi,
|
||||||
|
@ -605,6 +629,8 @@ unlink_nt (path_conv &pc)
|
||||||
Netapp filesystems don't understand the "move and delete" method
|
Netapp filesystems don't understand the "move and delete" method
|
||||||
at all and have all kinds of weird effects. Just setting the delete
|
at all and have all kinds of weird effects. Just setting the delete
|
||||||
dispositon usually works fine, though. */
|
dispositon usually works fine, though. */
|
||||||
|
debug_printf ("Sharing violation when opening %S",
|
||||||
|
pc.get_nt_native_path ());
|
||||||
if (!pc.fs_is_nfs () && !pc.fs_is_netapp ())
|
if (!pc.fs_is_nfs () && !pc.fs_is_netapp ())
|
||||||
bin_stat = move_to_bin;
|
bin_stat = move_to_bin;
|
||||||
if (!pc.isdir () || pc.isremote ())
|
if (!pc.isdir () || pc.isremote ())
|
||||||
|
@ -629,7 +655,7 @@ unlink_nt (path_conv &pc)
|
||||||
flags | FILE_SYNCHRONOUS_IO_NONALERT);
|
flags | FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
if (NT_SUCCESS (status))
|
if (NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
status = check_dir_not_empty (fh);
|
status = check_dir_not_empty (fh, pc);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
NtClose (fh);
|
NtClose (fh);
|
||||||
|
@ -646,11 +672,12 @@ unlink_nt (path_conv &pc)
|
||||||
{
|
{
|
||||||
if (status == STATUS_DELETE_PENDING)
|
if (status == STATUS_DELETE_PENDING)
|
||||||
{
|
{
|
||||||
syscall_printf ("Delete already pending");
|
debug_printf ("Delete %S already pending", pc.get_nt_native_path ());
|
||||||
status = 0;
|
status = 0;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
syscall_printf ("Opening file for delete failed, status = %p", status);
|
debug_printf ("Opening %S for delete failed, status = %p",
|
||||||
|
pc.get_nt_native_path (), status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Try to move to bin if a sharing violation occured. If that worked,
|
/* Try to move to bin if a sharing violation occured. If that worked,
|
||||||
|
@ -666,8 +693,24 @@ unlink_nt (path_conv &pc)
|
||||||
FileDispositionInformation);
|
FileDispositionInformation);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
syscall_printf ("Setting delete disposition failed, status = %p",
|
debug_printf ("Setting delete disposition on %S failed, status = %p",
|
||||||
status);
|
pc.get_nt_native_path (), status);
|
||||||
|
if (status == STATUS_DIRECTORY_NOT_EMPTY)
|
||||||
|
{
|
||||||
|
pc.get_object_attr (attr, sec_none_nih);
|
||||||
|
NtClose (fh);
|
||||||
|
status = NtOpenFile (&fh, access | FILE_LIST_DIRECTORY | SYNCHRONIZE,
|
||||||
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
||||||
|
flags | FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
|
if (NT_SUCCESS (status))
|
||||||
|
check_dir_not_empty (fh, pc);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fh = NULL;
|
||||||
|
debug_printf ("Opening dir %S for check_dir_not_empty failed, "
|
||||||
|
"status = %p", pc.get_nt_native_path (), status);
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Trying to delete a hardlink to a file in use by the system in some
|
/* Trying to delete a hardlink to a file in use by the system in some
|
||||||
way (for instance, font files) by setting the delete disposition fails
|
way (for instance, font files) by setting the delete disposition fails
|
||||||
with STATUS_CANNOT_DELETE. Strange enough, deleting these hardlinks
|
with STATUS_CANNOT_DELETE. Strange enough, deleting these hardlinks
|
||||||
|
@ -684,6 +727,8 @@ unlink_nt (path_conv &pc)
|
||||||
{
|
{
|
||||||
HANDLE fh2;
|
HANDLE fh2;
|
||||||
|
|
||||||
|
debug_printf ("Cannot delete %S, try delete-on-close",
|
||||||
|
pc.get_nt_native_path ());
|
||||||
/* Re-open from handle so we open the correct file no matter if it
|
/* Re-open from handle so we open the correct file no matter if it
|
||||||
has been moved to the bin or not. */
|
has been moved to the bin or not. */
|
||||||
pc.init_reopen_attr (&attr, fh);
|
pc.init_reopen_attr (&attr, fh);
|
||||||
|
@ -693,8 +738,8 @@ unlink_nt (path_conv &pc)
|
||||||
flags | FILE_DELETE_ON_CLOSE);
|
flags | FILE_DELETE_ON_CLOSE);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
syscall_printf ("Setting delete-on-close failed, status = %p",
|
debug_printf ("Setting delete-on-close on %S failed, status = %p",
|
||||||
status);
|
pc.get_nt_native_path (), status);
|
||||||
/* This is really the last chance. If it hasn't been moved
|
/* This is really the last chance. If it hasn't been moved
|
||||||
to the bin already, try it now. If moving to the bin
|
to the bin already, try it now. If moving to the bin
|
||||||
succeeds, we got rid of the file in some way, even if
|
succeeds, we got rid of the file in some way, even if
|
||||||
|
@ -740,6 +785,7 @@ out:
|
||||||
&& (pc.fs_flags () & FILE_SUPPORTS_TRANSACTIONS))
|
&& (pc.fs_flags () & FILE_SUPPORTS_TRANSACTIONS))
|
||||||
stop_transaction (status, old_trans, trans);
|
stop_transaction (status, old_trans, trans);
|
||||||
|
|
||||||
|
syscall_printf ("%S, return status = %p", pc.get_nt_native_path (), status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,13 +813,13 @@ unlink (const char *ourname)
|
||||||
|
|
||||||
if (!win32_name.exists ())
|
if (!win32_name.exists ())
|
||||||
{
|
{
|
||||||
syscall_printf ("unlinking a nonexistent file");
|
debug_printf ("unlinking a nonexistent file");
|
||||||
set_errno (ENOENT);
|
set_errno (ENOENT);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
else if (win32_name.isdir ())
|
else if (win32_name.isdir ())
|
||||||
{
|
{
|
||||||
syscall_printf ("unlinking a directory");
|
debug_printf ("unlinking a directory");
|
||||||
set_errno (EPERM);
|
set_errno (EPERM);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue