diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4881f97e6..20260ddcd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2006-02-09 Corinna Vinschen + + * fhandler_disk_file.cc (fhandler_disk_file::opendir): Only set + the dirent_get_d_ino flag on filesystems having useful File IDs. + Add comment explaining why. + 2006-02-07 Corinna Vinschen * dtable.cc (handle_to_fn): Accomodate new argument order in call to diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 6edd010b6..3d286ebe9 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -1450,10 +1450,20 @@ fhandler_disk_file::opendir () __seterrno (); goto free_dirent; } - if (wincap.has_fileid_dirinfo ()) - dir->__flags |= dirent_get_d_ino; + /* FileIdBothDirectoryInformation is apparently unsupported on XP + when accessing directories on UDF. When trying to use it so, + NtQueryDirectoryFile returns with STATUS_ACCESS_VIOLATION. It's + not clear if the call isn't also unsupported on other OS/FS + combinations (say, Win2K/CDFS or so). Instead of testing in + readdir for yet another error code, let's use + FileIdBothDirectoryInformation only on filesystems supporting + persistent ACLs, FileBothDirectoryInformation otherwise. */ if (pc.hasgood_inode ()) - dir->__flags |= dirent_set_d_ino; + { + dir->__flags |= dirent_set_d_ino; + if (wincap.has_fileid_dirinfo ()) + dir->__flags |= dirent_get_d_ino; + } } res = dir; }