Cygwin: fhandler_disk_file::fstatvfs: refactor

Define a new method fhandler_base::fstatvfs_by_handle, extracted from
fhandler_disk_file::fstatvfs, which gets the statvfs information when
a handle is available.

This will be used in future commits for special files that have been
opened with O_PATH.
This commit is contained in:
Ken Brown 2020-01-24 16:02:57 -05:00
parent 74e6e88143
commit 68b7a457f7
2 changed files with 17 additions and 6 deletions

View File

@ -392,6 +392,7 @@ private:
int __reg2 fstat_by_name (struct stat *buf);
public:
virtual int __reg2 fstatvfs (struct statvfs *buf);
int __reg2 fstatvfs_by_handle (HANDLE h, struct statvfs *buf);
int __reg2 utimens_fs (const struct timespec *);
virtual int __reg1 fchmod (mode_t mode);
virtual int __reg2 fchown (uid_t uid, gid_t gid);

View File

@ -600,9 +600,7 @@ int __reg2
fhandler_disk_file::fstatvfs (struct statvfs *sfs)
{
int ret = -1, opened = 0;
NTSTATUS status;
IO_STATUS_BLOCK io;
FILE_FS_FULL_SIZE_INFORMATION full_fsi;
/* We must not use the stat handle here, even if it exists. The handle
has been opened with FILE_OPEN_REPARSE_POINT, thus, in case of a volume
mount point, it points to the FS of the mount point, rather than to the
@ -630,6 +628,22 @@ fhandler_disk_file::fstatvfs (struct statvfs *sfs)
}
}
ret = fstatvfs_by_handle (fh, sfs);
out:
if (opened)
NtClose (fh);
syscall_printf ("%d = fstatvfs(%s, %p)", ret, get_name (), sfs);
return ret;
}
int __reg2
fhandler_base::fstatvfs_by_handle (HANDLE fh, struct statvfs *sfs)
{
int ret = -1;
NTSTATUS status;
IO_STATUS_BLOCK io;
FILE_FS_FULL_SIZE_INFORMATION full_fsi;
sfs->f_files = ULONG_MAX;
sfs->f_ffree = ULONG_MAX;
sfs->f_favail = ULONG_MAX;
@ -688,10 +702,6 @@ fhandler_disk_file::fstatvfs (struct statvfs *sfs)
debug_printf ("%y = NtQueryVolumeInformationFile"
"(%S, FileFsFullSizeInformation)",
status, pc.get_nt_native_path ());
out:
if (opened)
NtClose (fh);
syscall_printf ("%d = fstatvfs(%s, %p)", ret, get_name (), sfs);
return ret;
}