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>2006-03-08 19:07:28 +0300
committerCorinna Vinschen <corinna@vinschen.de>2006-03-08 19:07:28 +0300
commit6022cd2ef97c4898540ec00260ce71de5aa03c6d (patch)
tree4ad8505f82add97b8d439b79ec01530757839ccd
parentce10f1789e0a4b1f968203b23a25006f9e7d9e6c (diff)
* syscalls.cc: Include winioctl.h.
(statvfs): Request correct volume size using DeviceIoControl if quotas are enforced on the file system.
-rw-r--r--winsup/cygwin/ChangeLog13
-rw-r--r--winsup/cygwin/syscalls.cc22
2 files changed, 35 insertions, 0 deletions
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 <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.
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 <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;