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); int __reg2 fstat_by_name (struct stat *buf);
public: public:
virtual int __reg2 fstatvfs (struct statvfs *buf); virtual int __reg2 fstatvfs (struct statvfs *buf);
int __reg2 fstatvfs_by_handle (HANDLE h, struct statvfs *buf);
int __reg2 utimens_fs (const struct timespec *); int __reg2 utimens_fs (const struct timespec *);
virtual int __reg1 fchmod (mode_t mode); virtual int __reg1 fchmod (mode_t mode);
virtual int __reg2 fchown (uid_t uid, gid_t gid); 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) fhandler_disk_file::fstatvfs (struct statvfs *sfs)
{ {
int ret = -1, opened = 0; int ret = -1, opened = 0;
NTSTATUS status;
IO_STATUS_BLOCK io; 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 /* 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 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 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_files = ULONG_MAX;
sfs->f_ffree = ULONG_MAX; sfs->f_ffree = ULONG_MAX;
sfs->f_favail = ULONG_MAX; sfs->f_favail = ULONG_MAX;
@ -688,10 +702,6 @@ fhandler_disk_file::fstatvfs (struct statvfs *sfs)
debug_printf ("%y = NtQueryVolumeInformationFile" debug_printf ("%y = NtQueryVolumeInformationFile"
"(%S, FileFsFullSizeInformation)", "(%S, FileFsFullSizeInformation)",
status, pc.get_nt_native_path ()); status, pc.get_nt_native_path ());
out:
if (opened)
NtClose (fh);
syscall_printf ("%d = fstatvfs(%s, %p)", ret, get_name (), sfs);
return ret; return ret;
} }