* 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:
		| @@ -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> | 2006-03-03  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* dir.cc (opendir): Fix indentation. | 	* dir.cc (opendir): Fix indentation. | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ details. */ | |||||||
| #include <setjmp.h> | #include <setjmp.h> | ||||||
| #include <winnls.h> | #include <winnls.h> | ||||||
| #include <wininet.h> | #include <wininet.h> | ||||||
|  | #include <winioctl.h> | ||||||
| #include <lmcons.h> /* for UNLEN */ | #include <lmcons.h> /* for UNLEN */ | ||||||
| #include <rpc.h> | #include <rpc.h> | ||||||
|  |  | ||||||
| @@ -1841,6 +1842,27 @@ statvfs (const char *fname, struct statvfs *sfs) | |||||||
| 	  availc = availb.QuadPart / (spc*bps); | 	  availc = availb.QuadPart / (spc*bps); | ||||||
| 	  totalc = totalb.QuadPart / (spc*bps); | 	  totalc = totalb.QuadPart / (spc*bps); | ||||||
| 	  freec = freeb.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 |       else | ||||||
| 	availc = freec; | 	availc = freec; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user