diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-02-20 11:12:44 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-02-20 11:12:44 +0000 |
commit | 3a88cf1b10619c7be2d1b4539f76f761db4a1202 (patch) | |
tree | ca2f45cdcf5b8029c53f01dd012a00a182817fe8 /winsup/cygwin/fhandler_disk_file.cc | |
parent | 7920792369b18fd7d796a61aa7f3dda98c1957c8 (diff) | |
download | cygnal-3a88cf1b10619c7be2d1b4539f76f761db4a1202.tar.gz cygnal-3a88cf1b10619c7be2d1b4539f76f761db4a1202.tar.bz2 cygnal-3a88cf1b10619c7be2d1b4539f76f761db4a1202.zip |
* autoload.cc (GetCompressedFileSize): Add.
* fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Compute
st_blocks value from GetCompressedFileSize() if available.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 27e621708..f0971e9d2 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 |