Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-05-25 13:18:43 +0400
committerCorinna Vinschen <corinna@vinschen.de>2003-05-25 13:18:43 +0400
commita80229fd4934b438677ec3ac2a7cb9f369c0050c (patch)
treee5684e765ac36191b7e56455ebda72fbf790807d /winsup/cygwin/syscalls.cc
parentc295ce6f6e18cac30b0e5313cecad9fdab1809c6 (diff)
* 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.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc19
1 files changed, 16 insertions, 3 deletions
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;