From 247e44dbc71cb34013cd73bdc114eba72932a6a9 Mon Sep 17 00:00:00 2001 From: corinna Date: Thu, 20 Feb 2003 11:12:44 +0000 Subject: [PATCH] * autoload.cc (GetCompressedFileSize): Add. * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Compute st_blocks value from GetCompressedFileSize() if available. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/autoload.cc | 1 + winsup/cygwin/fhandler_disk_file.cc | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7d2ddccdad..276593926c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2003-02-20 Corinna Vinschen + + * autoload.cc (GetCompressedFileSize): Add. + * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Compute + st_blocks value from GetCompressedFileSize() if available. + 2003-02-18 Vaclav Haisman * wincap.h (wincaps::supports_sparse_files): New flag. diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc index 805055c82c..d071ab1d27 100644 --- a/winsup/cygwin/autoload.cc +++ b/winsup/cygwin/autoload.cc @@ -497,6 +497,7 @@ LoadDLLfunc (CoCreateInstance, 20, ole32) LoadDLLfuncEx (CancelIo, 4, kernel32, 1) LoadDLLfuncEx (CreateHardLinkA, 12, kernel32, 1) LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1) +LoadDLLfuncEx2 (GetCompressedFileSizeA, 8, kernel32, 1, 0xffffffff) LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1) LoadDLLfuncEx2 (IsDebuggerPresent, 0, kernel32, 1, 1) LoadDLLfuncEx (Process32First, 8, kernel32, 1) diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 27e6217088..f0971e9d2c 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -260,7 +260,20 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc, } buf->st_blksize = S_BLKSIZE; - buf->st_blocks = (buf->st_size + S_BLKSIZE - 1) / S_BLKSIZE; + + /* GetCompressedFileSize() gets autoloaded. It returns INVALID_FILE_SIZE + if it doesn't exist. Since that's also a valid return value on 64bit + capable file systems, we must additionally check for the win32 error. */ + nFileSizeLow = GetCompressedFileSizeA (pc->get_win32 (), &nFileSizeHigh); + if (nFileSizeLow != INVALID_FILE_SIZE || GetLastError () == NO_ERROR) + /* On systems supporting compressed (and sparsed) files, + GetCompressedFileSize() returns the actual amount of + bytes allocated on disk. */ + buf->st_blocks = (((__off64_t)nFileSizeHigh << 32) + + nFileSizeLow + S_BLKSIZE - 1) / S_BLKSIZE; + else + /* Just compute no. of blocks from file size. */ + buf->st_blocks = (buf->st_size + S_BLKSIZE - 1) / S_BLKSIZE; buf->st_mode = 0; /* Using a side effect: get_file_attibutes checks for -- 2.11.0