From a80229fd4934b438677ec3ac2a7cb9f369c0050c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sun, 25 May 2003 09:18:43 +0000 Subject: * autoload.cc (GetDiskFreeSpaceEx): Add. * syscalls.cc (statfs): Call full_path.root_dir() instead of rootdir(full_path). Use GetDiskFreeSpaceEx when available and report space available in addition to free space. * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_name): Do not call FindFirstFile for disk root directories. --- winsup/cygwin/syscalls.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'winsup/cygwin/syscalls.cc') diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 625e05957..3c3be8664 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1871,11 +1871,12 @@ statfs (const char *fname, struct statfs *sfs) } path_conv full_path (fname, PC_SYM_FOLLOW | PC_FULL); - char *root = rootdir (full_path); + + const char *root = full_path.root_dir(); syscall_printf ("statfs %s", root); - DWORD spc, bps, freec, totalc; + DWORD spc, bps, availc, freec, totalc; if (!GetDiskFreeSpace (root, &spc, &bps, &freec, &totalc)) { @@ -1883,6 +1884,17 @@ statfs (const char *fname, struct statfs *sfs) return -1; } + ULARGE_INTEGER availb, freeb, totalb; + + if (GetDiskFreeSpaceEx (root, &availb, &totalb, &freeb)) + { + availc = availb.QuadPart / (spc*bps); + totalc = totalb.QuadPart / (spc*bps); + freec = freeb.QuadPart / (spc*bps); + } + else + availc = freec; + DWORD vsn, maxlen, flags; if (!GetVolumeInformation (root, NULL, 0, &vsn, &maxlen, &flags, NULL, 0)) @@ -1893,7 +1905,8 @@ statfs (const char *fname, struct statfs *sfs) sfs->f_type = flags; sfs->f_bsize = spc*bps; sfs->f_blocks = totalc; - sfs->f_bfree = sfs->f_bavail = freec; + sfs->f_bavail = availc; + sfs->f_bfree = freec; sfs->f_files = -1; sfs->f_ffree = -1; sfs->f_fsid = vsn; -- cgit v1.2.3