* fhandler.cc (fhandler_disk_file::open): Check for buggy CreateFile
condition. * path.cc (path_conv::check): Get file system type in call to GetVolumeInformation to check for file systems with buggy CreateFile. * path.h (enum path_types): Add PATH_HASBUGGYOPEN. (class path_conv): Add methods `has_buggy_open' and `set_has_buggy_open'.
This commit is contained in:
parent
91797c6d8e
commit
e1a993d549
|
@ -1,3 +1,13 @@
|
|||
Tue Nov 28 18:08:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler.cc (fhandler_disk_file::open): Check for buggy CreateFile
|
||||
condition.
|
||||
* path.cc (path_conv::check): Get file system type in call to
|
||||
GetVolumeInformation to check for file systems with buggy CreateFile.
|
||||
* path.h (enum path_types): Add PATH_HASBUGGYOPEN.
|
||||
(class path_conv): Add methods `has_buggy_open' and
|
||||
`set_has_buggy_open'.
|
||||
|
||||
Sun Nov 26 16:26:14 2000 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* fhandler.cc (is_at_eof): New function.
|
||||
|
|
|
@ -1238,6 +1238,21 @@ fhandler_disk_file::open (path_conv& real_path, int flags, mode_t mode)
|
|||
if (!res)
|
||||
goto out;
|
||||
|
||||
/* This is for file systems known for having a buggy CreateFile call
|
||||
which might return a valid HANDLE without having actually opened
|
||||
the file.
|
||||
The only known file system to date is the SUN NFS Solstice Client 3.1
|
||||
which returns a valid handle when trying to open a file in a non
|
||||
existant directory. */
|
||||
if (real_path.has_buggy_open ()
|
||||
&& GetFileAttributes (win32_path_name_) == (DWORD) -1)
|
||||
{
|
||||
debug_printf ("Buggy open detected.");
|
||||
close ();
|
||||
set_errno (ENOENT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern BOOL allow_ntea;
|
||||
extern BOOL allow_ntsec;
|
||||
|
||||
|
|
|
@ -389,20 +389,26 @@ out:
|
|||
return;
|
||||
}
|
||||
DWORD serial, volflags;
|
||||
char fs_name[16];
|
||||
|
||||
strcpy (tmp_buf, full_path);
|
||||
if (!rootdir (tmp_buf) ||
|
||||
!GetVolumeInformation (tmp_buf, NULL, 0, &serial, NULL, &volflags, NULL, 0))
|
||||
!GetVolumeInformation (tmp_buf, NULL, 0, &serial, NULL,
|
||||
&volflags, fs_name, 16))
|
||||
{
|
||||
debug_printf ("GetVolumeInformation(%s) = ERR, full_path(%s), set_has_acls(FALSE)",
|
||||
tmp_buf, full_path, GetLastError ());
|
||||
set_has_acls (FALSE);
|
||||
set_has_buggy_open (FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_printf ("GetVolumeInformation(%s) = OK, full_path(%s), set_has_acls(%d)",
|
||||
tmp_buf, full_path, volflags & FS_PERSISTENT_ACLS);
|
||||
set_has_acls (volflags & FS_PERSISTENT_ACLS);
|
||||
/* Known file systems with buggy open calls. Further explanation
|
||||
in fhandler.cc (fhandler_disk_file::open). */
|
||||
set_has_buggy_open (strcmp (fs_name, "SUNWNFS") == 0);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
|
|
@ -37,6 +37,7 @@ enum path_types
|
|||
PATH_EXEC = MOUNT_EXEC,
|
||||
PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC,
|
||||
PATH_ALL_EXEC = PATH_CYGWIN_EXEC | PATH_EXEC,
|
||||
PATH_HASBUGGYOPEN = 0x20000000,
|
||||
PATH_SOCKET = 0x40000000,
|
||||
PATH_HASACLS = 0x80000000
|
||||
};
|
||||
|
@ -50,6 +51,7 @@ class path_conv
|
|||
|
||||
int has_acls () {return path_flags & PATH_HASACLS;}
|
||||
int hasgood_inode () {return path_flags & PATH_HASACLS;} // Not strictly correct
|
||||
int has_buggy_open () {return path_flags & PATH_HASBUGGYOPEN;}
|
||||
int isbinary () {return path_flags & PATH_BINARY;}
|
||||
int issymlink () {return path_flags & PATH_SYMLINK;}
|
||||
int issocket () {return path_flags & PATH_SOCKET;}
|
||||
|
@ -60,6 +62,7 @@ class path_conv
|
|||
void set_symlink () {path_flags |= PATH_SYMLINK;}
|
||||
void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTHING;}
|
||||
void set_has_acls (int x = 1) {path_flags |= x ? PATH_HASACLS : PATH_NOTHING;}
|
||||
void set_has_buggy_open (int x = 1) {path_flags |= x ? PATH_HASBUGGYOPEN : PATH_NOTHING;}
|
||||
|
||||
char *known_suffix;
|
||||
|
||||
|
|
Loading…
Reference in New Issue