* sec_acl.cc (setacl): Ditto. Set to true if any ACE with write
permissions is created.
* fhandler_disk_file.cc (fhandler_disk_file::facl): Reset
FILE_ATTRIBUTE_READONLY if ACL contains an ACE with write permissions.
(rmdir): Don't check last path component for "..".
* fhandler_disk_file.cc (fhandler_disk_file::rmdir): Drop kludge
which tries to allow deleting the current working directory.
* path.cc (has_dot_last_component): Add parameter to indicate testing
for "..". Take trailing slash into account.
(symlink_info::posixify): Rely on cygheap->cwd.win32 having a
useful value.
(cwdstuff::init): Initialize cygheap->cwd with current working
directory. Change to windows_system_directory afterwards.
(cwdstuff::set): Never call SetCurrentDirectory here. Just check
if changing into target directory would be allowed. Add comment to
explain why.
* path.h (has_dot_last_component): Declare with second parameter.
* pinfo.cc (pinfo::zap_cwd): Remove.
(pinfo::exit): Drop call to zap_cwd.
* pinfo.h (class pinfo): Remove declaration of zap_cwd.
* spawn.cc (spawn_guts): Set current working directory for non-Cygwin
child applications. Drop call to zap_cwd.
(mount_info::conv_to_win32_path): Update comment.
* fhandler_disk_file.cc (path_conv::ndisk_links): Use backslashes
to make NT kernel functions work for \\?\GLOBALROOT paths.
performance on remote shares.
(fhandler_disk_file::opendir): Move comment about Samba weirdness into
fhandler_disk_file::readdir. Don't disallow
FileIdBothDirectoryInformation on Samba.
(fhandler_disk_file::readdir): Workaround Samba problem with
FileIdBothDirectoryInformation by rereading already read entries
using FileBothDirectoryInformation. Change comment about Samba
weirdness explaining this change.
to take file size and inode number as 64 bit values.
* fhandler_disk_file.cc (FS_IS_SAMBA): Move to path.cc
(FS_IS_SAMBA_WITH_QUOTA): Ditto.
(path_conv::hasgood_inode): Delete.
(path_conv::is_samba): Delete.
(path_conv::isgood_inode): Centralized function to recognize
a good inode number.
(fhandler_base::fstat_by_handle): Constify fvi_size and fai_size.
Accomodate argument change in fstat_helper.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_helper): Accomodate argument change. Call
path_conv::isgood_inode to recognize good inodes.
(fhandler_disk_file::opendir): Explain Samba weirdness here.
Call path_conv::fs_is_samba instead of path_conv::is_samba.
(fhandler_disk_file::readdir): Add STATUS_INVALID_INFO_CLASS
as valid return code from NtQueryDirectoryFile to indicate that
FileIdBothDirectoryInformation is not supported.
Call path_conv::isgood_inode to recognize good inodes.
* ntdll.h (STATUS_INVALID_INFO_CLASS): Define.
* path.cc (fs_info::update): Rework file system recognition
and set appropriate flags.
* path.h (struct fs_info): Add is_ntfs, is_samba and is_nfs flags.
Constify pure read accessors.
Drop remote fs handling entirely since unreliable inode numbers
are now recognized differently.
(path_conv::is_samba): Make inline.
(fhandler_disk_file::opendir): Reformat comment.
(fhandler_base::fstat_helper): Special case remote file systems
returning (unreliable) 32 bit inode numbers.
(fhandler_base::readdir): Ditto.
* fhandler_netdrive.cc (fhandler_netdrive::readdir): Ditto.
(path_conv::hasgood_inode): Recognize Samba with quota support
compiled in.
(path_conv::is_samba): Ditto. Fix comment to include Samba version
numbers for later reference.
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Move storing
fhandler in file descriptor table to some point very late in function
to avoid double free'ing. Add comment to explain what happens.
Add label free_mounts and don't forget to delete __DIR_mounts structure
if NtOpenFile fails.
dirent_saw_dev and dirent_saw_proc.
(fhandler_cygdrive::open): Declare.
(fhandler_cygdrive::close): Declare.
* fhandler_disk_file.cc (class __DIR_mounts): Move to beginning of file.
(__DIR_mounts::check_mount): New parameter to indicate if inode number
is needed in calling function or not. Add /proc and /cygdrive handling.
(__DIR_mounts::check_missing_mount): Ditto.
(path_conv::ndisk_links): Use __DIR_mounts class to create correct
hardlink count for directories with mount points in them.
(fhandler_disk_file::readdir_helper): Remove /dev, /proc and /cygdrive
handling.
(fhandler_cygdrive::open): New method.
(fhandler_cygdrive::close): New method.
(fhandler_cygdrive::fstat): Always return fixed inode number 2 and
fixed link count of 1. Drop call to set_drives.
(fhandler_cygdrive::opendir): Drop call to get_namehash.
(fhandler_cygdrive::readdir): Handle "." entry to return fixed inode
number 2.
__d_internal.
* fhandler_disk_file.cc (struct __DIR_cache): Remove useless "typedef".
(d_dirname): Remove useless "struct".
(d_cachepos): Ditto.
(d_cache): Ditto.
(class __DIR_mounts): New class, implementing mount point tracking
for readdir.
(d_mounts): New macro for easy access to __DIR_mounts structure.
(fhandler_disk_file::opendir): Allocate __DIR_mounts structure and
let __d_internal element of dir point to it.
(fhandler_disk_file::readdir_helper): Add mount points in the current
directory, which don't have a real directory backing them.
Don't generate an inode number for /dev. Add comment, why.
(fhandler_disk_file::readdir): Move filling fname to an earlier point.
Check if current entry is a mount point and evaluate correct inode
number for it.
(fhandler_disk_file::readdir_9x): Ditto.
(fhandler_disk_file::rewinddir): Set all mount points in this directory
to "not found" so that they are listed again after calling rewinddir().
(fhandler_disk_file::closedir): Deallocate __DIR_mounts structure.
* path.cc (mount_info::get_mounts_here): New method to evaluate a list
of mount points in a given parent directory.
* shared_info.h (class mount_info): Declare get_mounts_here.
under NT or suffer memory corruption.
(fhandler_disk_file::readdir_helper): Avoid else with a return. Just calculate
extension location once when doing symlink checks.
(fhandler_disk_file::readdir): Make debug output more useful.
(fhandler_disk_file::readdir_9x): Ditto. Eliminate redundant variable.
path_conv::hasgood_inode.
(path_conv::is_samba): New method.
(fhandler_base::fstat_by_handle): Don't even try to use
FileIdBothDirectoryInformation on Samba.
* path.h (class path_conv): Declare is_samba method.
sys_wcstombs.
* fhandler_disk_file.cc (fhandler_disk_file::readdir): Call sys_wcstombs
instead of just wcstombs to accomodate OEM codepages.
* miscfuncs.cc (sys_wcstombs): Split len argument in source and target
length. Always 0-terminate result in target string.
* security.cc (lsa2wchar): Remove unused function.
(lsa2str): Ditto.
(get_lsa_srv_inf): Ditto.
(get_logon_server): Accomodate new argument order in call to
sys_wcstombs.
(get_user_groups): Ditto.
(get_user_local_groups): Ditto.
(get_priv_list): Call sys_wcstombs directly instead of lsa2str.
* uinfo.cc (cygheap_user::ontherange): Accomodate new argument order
in call to sys_wcstombs.
* winsup.h (sys_wcstombs): Change prototype to match new argument order.
when we hit EOF since rewwindir may reactivate it.
(fhandler_disk_file::readdir_9x): Eliminate superfluous temporary variable.
(fhandler_disk_file::closedir): Return EBADF when trying to close unopened DIR.
Reorganize slightly. Return actual derived error value rather than always
returning 0.
minimum number of dir entries which fit into the readdir cache.
(DIR_BUF_SIZE): Define globally as size of readdir cache.
(struct __DIR_cache): New structure used for readdir caching on NT.
(d_dirname): Accessor for struct __DIR_cache, use throughout.
(d_pos): Ditto.
(d_cache): Ditto.
(fhandler_disk_file::opendir): Allocate __d_dirname to contain readdir
cache on NT.
(fhandler_disk_file::readdir): Use buf as pointer into readdir cache.
Implement readdir caching.
* dir.cc (__opendir_with_d_ino): Just call opendir.
(opendir): Remove CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO handling.
(readdir_worker): Only try generating d_ino if it's 0.
Utilize namehash of directories fhandler. Call readdir_get_ino to
generate d_ino for "..".
(seekdir64): Keep dirent_set_d_ino flag.
* fhandler.h (enum dirent_states): Add dirent_get_d_ino.
(class fhandler_disk_file): Declare new private methods readdir_helper
and readdir_9x.
* fhandler_disk_file.cc (path_conv::hasgood_inode): New method to
evaluate if a filesystem has reliable inode numbers.
(fhandler_base::fstat_by_handle): Accomodate structure member name
change from IndexNumber to FileId.
(fhandler_base::fstat_helper): Call hasgood_inode here.
(fhandler_disk_file::opendir): Call fhaccess only for real files.
Don't append '*' to __d_dirname here, move to readdir_9x. On NT,
open directory handle here. Set dirent_get_d_ino and dirent_set_d_ino
flags according to wincap and filesystem.
(fhandler_disk_file::readdir_helper): New method to implement readdir
postprocessing only once.
(readdir_get_ino_by_handle): New static function.
(readdir_get_ino): New function to centralize inode number evaluation
in case inode number hasn't been returned by NtQueryDirectoryFile.
(fhandler_disk_file::readdir): Move old functionality to readdir_9x.
Call readdir_9x when on 9x/Me. Implement NT specific readdir here.
(fhandler_disk_file::readdir_9x): Move 9x specific readdir here.
(fhandler_disk_file::seekdir): Accomodate new NT readdir method.
(fhandler_disk_file::closedir): Ditto.
(fhandler_cygdrive::fstat): Set d_ino to namehash. Add comment.
(fhandler_cygdrive::opendir): Call get_namehash to prepare later
correct evaluation of d_ino.
(fhandler_cygdrive::readdir): Replace recursion with loop. Evaluate
drive's d_ino by calling readdir_get_ino.
* fhandler_proc.cc (fhandler_proc::readdir): Set dirent_saw_dot and
dirent_saw_dot_dot to avoid seeing . and .. entries twice.
* fhandler_process.cc (fhandler_process::readdir): Ditto.
* fhandler_registry.cc (fhandler_registry::readdir): Ditto.
* ntdll.h (STATUS_INVALID_PARAMETER): New define.
(STATUS_INVALID_LEVEL): New define.
(struct _FILE_INTERNAL_INFORMATION): Rename member IndexNumber to
FileId (as in Nebbitt).
* path.h (path_conv::hasgood_inode): Now implemented in
fhandler_disk_file.cc.
* wincap.h (wincaps::has_fileid_dirinfo): New element.
* wincap.cc: Implement above element throughout.
* winsup.h (readdir_get_ino): Add declaration.
* include/sys/dirent.h (struct dirent): Slightly rename structure
members to accomodate changes.
Remove __USE_EXPENSIVE_CYGWIN_D_INO handling and declaration of
__opendir_with_d_ino.
* dir.cc (__opendir_with_d_ino): New function.
(opendir): Set flag if we should be calculating inodes.
(readdir_worker): Calculate d_ino by calling stat if the user has asked for it.
(seekdir64): Maintain all persistent flag settings.
* fhandler.h (dirent_states): Add dirent_set_d_ino.
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Reflect changes to
dirent structure.
* fhandler_virtual.cc (fhandler_virtual::opendir): Ditto.
* include/sys/dirent.h (struct dirent): Coalesce two similar structures.
Remove all threads of the apparently highly confusing references to inodes.
Add support for calculating a real inode if __USE_EXPENSIVE_CYGWIN_D_INO is
defined.