* 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.
This commit is contained in:
Corinna Vinschen
2003-05-25 09:18:43 +00:00
parent c295ce6f6e
commit a80229fd49
4 changed files with 45 additions and 35 deletions

View File

@ -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;