diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2006-01-24 12:32:33 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2006-01-24 12:32:33 +0000 |
commit | 26d27a276f9490958d8318b5ac0087b4f81b072c (patch) | |
tree | 7a37dee57a5dab614173e658d7f288b40dc89e6c /winsup/cygwin/fhandler_disk_file.cc | |
parent | 3784b87b3208bdceaeb1ad7e38eed73cbb4e3b07 (diff) | |
download | cygnal-26d27a276f9490958d8318b5ac0087b4f81b072c.tar.gz cygnal-26d27a276f9490958d8318b5ac0087b4f81b072c.tar.bz2 cygnal-26d27a276f9490958d8318b5ac0087b4f81b072c.zip |
* fhandler_disk_file.cc (fhandler_base::fstat_helper): Try harder
to determine remote file systems with reliable inode numbers. Add
longish comment.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index ce0738b4a..ab277815b 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -326,14 +326,36 @@ fhandler_base::fstat_helper (struct __stat64 *buf, case DRIVE_REMOVABLE: case DRIVE_CDROM: case DRIVE_RAMDISK: - /* Temporarily enable remote drives until we find out why we disabled them - in the first place. When we find out don't forget to write a comment! */ - case DRIVE_REMOTE: /* Although the documentation indicates otherwise, it seems like "inodes" on these devices are persistent, at least across reboots. */ buf->st_ino = (((__ino64_t) nFileIndexHigh) << 32) | (__ino64_t) nFileIndexLow; break; + + case DRIVE_REMOTE: + /* From own experiments and replies from the Cygwin mailing list, + we're now trying to figure out how to determine remote file + systems which are capable of returning persistent inode + numbers. It seems that NT4 NTFS, when accessed remotly, and + some other remote file systems return unreliable values in + nFileIndex. The common factor of these unreliable remote FS + seem to be that FILE_SUPPORTS_OBJECT_IDS isn't set, even though + this should have nothing to do with inode numbers. + An exception is Samba, which seems to return valid inode numbers + without having the FILE_SUPPORTS_OBJECT_IDS flag set. So we're + testing for the flag values returned by a 3.x Samba explicitely + for now. */ +#define FS_IS_SAMBA (FILE_CASE_SENSITIVE_SEARCH \ + | FILE_CASE_PRESERVED_NAMES \ + | FILE_PERSISTENT_ACLS) + if ((pc.fs_flags () & FILE_SUPPORTS_OBJECT_IDS) + || pc.fs_flags () == FS_IS_SAMBA) + { + buf->st_ino = (((__ino64_t) nFileIndexHigh) << 32) + | (__ino64_t) nFileIndexLow; + break; + } + /*FALLTHRU*/ default: /* Either the nFileIndex* fields are unreliable or unavailable. Use the next best alternative. */ |