--- syscalls.cc.old Fri Mar 9 13:34:56 2001 +++ syscalls.cc Fri Mar 9 13:29:14 2001 @@ -8,6 +8,8 @@ This software is a copyrighted work lice Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ +static char *cvsid = "$RCSFile$ $Revision$ $Date$"; + #include "winsup.h" #include #include /* needed for statfs */ @@ -1681,7 +1683,8 @@ statfs (const char *fname, struct statfs char *root = rootdir (full_path); syscall_printf ("statfs %s", root); - + + // Need to do the GetDiskFreeSpace() in order to get the block size DWORD spc, bps, freec, totalc; if (!GetDiskFreeSpace (root, &spc, &bps, &freec, &totalc)) @@ -1690,6 +1693,37 @@ statfs (const char *fname, struct statfs return -1; } + sfs->f_bsize = spc*bps; + + // Check to see if the GetDiskFreeSpaceEx method is available to us + FARPROC pGetDiskFreeSpaceEx; + pGetDiskFreeSpaceEx = GetProcAddress( GetModuleHandle("kernel32.dll"), + "GetDiskFreeSpaceExA"); + + if (pGetDiskFreeSpaceEx) + { + ULARGE_INTEGER freeSize, totDisk, totFree; + + if (!pGetDiskFreeSpaceEx (root, + (PULARGE_INTEGER)&freeSize, + (PULARGE_INTEGER)&totDisk, + (PULARGE_INTEGER)&totFree)) + { + __seterrno (); + return -1; + } + + // Calculate the stats based upon the above generated block size + sfs->f_blocks = (long) (totDisk.QuadPart / sfs->f_bsize); + sfs->f_bavail = (long) (freeSize.QuadPart / sfs->f_bsize); + sfs->f_bfree = (long) (totFree.QuadPart / sfs->f_bsize); + } // Process GetDiskFreeSpaceEx results. + else + { + sfs->f_blocks = totalc; + sfs->f_bfree = sfs->f_bavail = freec; + } + DWORD vsn, maxlen, flags; if (!GetVolumeInformation (root, NULL, 0, &vsn, &maxlen, &flags, NULL, 0)) @@ -1698,9 +1732,6 @@ statfs (const char *fname, struct statfs return -1; } sfs->f_type = flags; - sfs->f_bsize = spc*bps; - sfs->f_blocks = totalc; - sfs->f_bfree = sfs->f_bavail = freec; sfs->f_files = -1; sfs->f_ffree = -1; sfs->f_fsid = vsn;