Implementation of GetCompressedFileSize[AW]
Pavel Roskin
proski at gnu.org
Wed Oct 1 22:24:35 CDT 2003
On Wed, 1 Oct 2003, Pavel Roskin wrote:
> FIXME about GetCompressedFileSizeA was too annoying when running Cygwin
> programs, so I implemented it. The code uses st_blocks when possible to
> account for sparse files and falls back to st_size if st_blocks is missing
> in struct stat. The code uses shift operations so that both systems with
> 32-bit and 64-bit off_t will do their best to provide accurate results.
Sorry, the previous patch contained unrelated parts. Corrected patch is
attached.
--
Regards,
Pavel Roskin
-------------- next part --------------
--- configure.ac
+++ configure.ac
@@ -1327,6 +1327,9 @@
#include <getopt.h>
#endif])
+dnl Check for stat.st_blocks
+AC_STRUCT_ST_BLOCKS
+
dnl *** check for the need to define platform-specific symbols
case $host_cpu in
--- win32/newfns.c
+++ win32/newfns.c
@@ -33,6 +33,9 @@ at a later date. */
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
@@ -41,22 +44,22 @@ at a later date. */
#include "winnls.h"
#include "winerror.h"
#include "wine/debug.h"
+#include "file.h"
WINE_DEFAULT_DEBUG_CHANNEL(win32);
/******************************************************************************
* GetCompressedFileSizeA [KERNEL32.@]
- *
- * NOTES
- * This should call the W function below
*/
DWORD WINAPI GetCompressedFileSizeA(
LPCSTR lpFileName,
LPDWORD lpFileSizeHigh)
{
- FIXME("(...): stub\n");
- return 0xffffffff;
+ WCHAR fileW[MAX_PATHNAME_LEN];
+
+ MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, fileW, MAX_PATHNAME_LEN);
+ return GetCompressedFileSizeW( fileW, lpFileSizeHigh );
}
@@ -71,8 +74,27 @@ DWORD WINAPI GetCompressedFileSizeW(
LPCWSTR lpFileName, /* [in] Pointer to name of file */
LPDWORD lpFileSizeHigh) /* [out] Receives high-order doubleword of size */
{
- FIXME("(%s,%p): stub\n",debugstr_w(lpFileName),lpFileSizeHigh);
- return 0xffffffff;
+ DOS_FULL_NAME full_name;
+ struct stat st;
+ DWORD low;
+
+ TRACE("(%s,%p)\n",debugstr_w(lpFileName),lpFileSizeHigh);
+ if ((lpFileName == NULL) ||
+ (!DOSFS_GetFullName( lpFileName, TRUE, &full_name )) ||
+ (stat(full_name.long_name, &st) != 0))
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0xffffffff;
+ }
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+ /* blocks are 512 bytes long */
+ *lpFileSizeHigh = (st.st_blocks >> 23);
+ low = ((st.st_blocks << 9) & 0xffffffff);
+#else
+ *lpFileSizeHigh = (st.st_size >> 32);
+ low = (st.st_size & 0xffffffff);
+#endif
+ return low;
}
More information about the wine-patches
mailing list