From 6022cd2ef97c4898540ec00260ce71de5aa03c6d Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 8 Mar 2006 16:07:28 +0000 Subject: * syscalls.cc: Include winioctl.h. (statvfs): Request correct volume size using DeviceIoControl if quotas are enforced on the file system. --- winsup/cygwin/ChangeLog | 13 +++++++++++++ winsup/cygwin/syscalls.cc | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 45ca8de43..a817b2da9 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +2006-03-08 Corinna Vinschen + + * 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 + + * 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 * dir.cc (opendir): Fix indentation. diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 33eef64d3..0538ffa8a 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -42,6 +42,7 @@ details. */ #include #include #include +#include #include /* for UNLEN */ #include @@ -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; -- cgit v1.2.3