* syscalls.cc: Include winioctl.h.

(statvfs): Request correct volume size using DeviceIoControl if
	quotas are enforced on the file system.
This commit is contained in:
Corinna Vinschen 2006-03-08 16:07:28 +00:00
parent ce10f1789e
commit 6022cd2ef9
2 changed files with 35 additions and 0 deletions

View File

@ -1,3 +1,16 @@
2006-03-08 Corinna Vinschen <corinna@vinschen.de>
* syscalls.cc: Include winioctl.h.
(statvfs): Request correct volume size using DeviceIoControl if
quotas are enforced on the file system.
2006-03-06 Corinna Vinschen <corinna@vinschen.de>
* dcrt0.cc (_dll_crt0): Revert to initialize *main_environ to NULL for
non-forked processes to circumvent problems with applications which
are messing around with the global variable "environ" in some
arbitrary way.
2006-03-03 Corinna Vinschen <corinna@vinschen.de>
* dir.cc (opendir): Fix indentation.

View File

@ -42,6 +42,7 @@ details. */
#include <setjmp.h>
#include <winnls.h>
#include <wininet.h>
#include <winioctl.h>
#include <lmcons.h> /* for UNLEN */
#include <rpc.h>
@ -1841,6 +1842,27 @@ statvfs (const char *fname, struct statvfs *sfs)
availc = availb.QuadPart / (spc*bps);
totalc = totalb.QuadPart / (spc*bps);
freec = freeb.QuadPart / (spc*bps);
if (freec > availc)
{
/* Quotas active. We can't trust totalc. */
HANDLE hdl = CreateFile (full_path.get_win32 (), READ_CONTROL,
wincap.shared (), &sec_none_nih,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (hdl == INVALID_HANDLE_VALUE)
debug_printf ("CreateFile (%s) failed, %E", full_path.get_win32 ());
else
{
NTFS_VOLUME_DATA_BUFFER nvdb;
DWORD bytes;
if (!DeviceIoControl (hdl, FSCTL_GET_NTFS_VOLUME_DATA, NULL,
0, &nvdb, sizeof nvdb, &bytes, NULL))
debug_printf ("DeviceIoControl (%s) failed, %E", full_path.get_win32 ());
else
totalc = nvdb.TotalClusters.QuadPart;
CloseHandle (hdl);
}
}
}
else
availc = freec;