summaryrefslogtreecommitdiffstats
path: root/src/file_doc.c
diff options
context:
space:
mode:
authorChristophe Grenier <[email protected]>2014-10-04 18:09:48 +0200
committerChristophe Grenier <[email protected]>2014-10-04 18:09:48 +0200
commitc28950032981dafb83ec5c568a16e030c4467226 (patch)
tree05156e7f64df839808af64cd455c8b864a1eda18 /src/file_doc.c
parent4c5fcd4164b7fd06eafa54fa44ecfb9fb2d02d00 (diff)
Use fseeko() instead of fseek().
Fix 2GB per file limit on Windows for some file types.
Diffstat (limited to 'src/file_doc.c')
-rw-r--r--src/file_doc.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/file_doc.c b/src/file_doc.c
index 395b3305..ad71f106 100644
--- a/src/file_doc.c
+++ b/src/file_doc.c
@@ -84,7 +84,12 @@ static void file_check_doc(file_recovery_t *file_recovery)
const uint64_t doc_file_size_org=file_recovery->file_size;
file_recovery->file_size=0;
/*reads first sector including OLE header */
- if(fseek(file_recovery->handle, 0, SEEK_SET) < 0 ||
+ if(
+#ifdef HAVE_FSEEKO
+ fseeko(file_recovery->handle, 0, SEEK_SET) < 0 ||
+#else
+ fseek(file_recovery->handle, 0, SEEK_SET) < 0 ||
+#endif
fread(&buffer_header, sizeof(buffer_header), 1, file_recovery->handle) != 1)
return ;
#ifdef DEBUG_OLE
@@ -149,7 +154,11 @@ static void file_check_doc(file_recovery_t *file_recovery)
free(fat);
return ;
}
+#ifdef HAVE_FSEEKO
+ if(fseeko(file_recovery->handle, (1+block)<<le16(header->uSectorShift), SEEK_SET)<0)
+#else
if(fseek(file_recovery->handle, (1+block)<<le16(header->uSectorShift), SEEK_SET)<0)
+#endif
{
#ifdef DEBUG_OLE
log_info("fseek failed\n");
@@ -497,7 +506,11 @@ static uint32_t *OLE_load_FAT(FILE *IN, const struct OLE_HDR *header)
i<le32(header->num_extra_FAT_blocks) && block!=0xFFFFFFFF && block!=0xFFFFFFFE;
i++, block=le32(dif[109+i*(((1<<le16(header->uSectorShift))/4)-1)]))
{
+#ifdef HAVE_FSEEKO
+ if(fseeko(IN, (1+block)<<le16(header->uSectorShift), SEEK_SET) < 0)
+#else
if(fseek(IN, (1+block)<<le16(header->uSectorShift), SEEK_SET) < 0)
+#endif
{
free(dif);
return NULL;
@@ -518,7 +531,11 @@ static uint32_t *OLE_load_FAT(FILE *IN, const struct OLE_HDR *header)
j<le32(header->num_FAT_blocks);
j++, data+=(1<<le16(header->uSectorShift)))
{
+#ifdef HAVE_FSEEKO
+ if(fseeko(IN, (1+le32(dif[j]))<<le16(header->uSectorShift), SEEK_SET)<0)
+#else
if(fseek(IN, (1+le32(dif[j]))<<le16(header->uSectorShift), SEEK_SET)<0)
+#endif
{
free(dif);
free(fat);
@@ -553,7 +570,11 @@ static void *OLE_read_stream(FILE *IN,
free(dataPt);
return NULL;
}
+#ifdef HAVE_FSEEKO
+ if(fseeko(IN, (1+block)<<uSectorShift, SEEK_SET)<0)
+#else
if(fseek(IN, (1+block)<<uSectorShift, SEEK_SET)<0)
+#endif
{
free(dataPt);
return NULL;
@@ -580,7 +601,11 @@ static uint32_t *OLE_load_MiniFAT(FILE *IN, const struct OLE_HDR *header, const
block=le32(header->MiniFat_block);
for(i=0; i < le32(header->csectMiniFat) && block < fat_entries; i++)
{
+#ifdef HAVE_FSEEKO
+ if(fseeko(IN, ((uint64_t)1+block) << le16(header->uSectorShift), SEEK_SET) < 0)
+#else
if(fseek(IN, ((uint64_t)1+block) << le16(header->uSectorShift), SEEK_SET) < 0)
+#endif
{
free(minifat);
return NULL;
@@ -840,7 +865,12 @@ static void file_rename_doc(const char *old_filename)
log_info("file_rename_doc(%s)\n", old_filename);
#endif
/*reads first sector including OLE header */
- if(fseek(file, 0, SEEK_SET) < 0 ||
+ if(
+#ifdef HAVE_FSEEKO
+ fseeko(file, 0, SEEK_SET) < 0 ||
+#else
+ fseek(file, 0, SEEK_SET) < 0 ||
+#endif
fread(&buffer_header, sizeof(buffer_header), 1, file) != 1)
{
fclose(file);
@@ -877,7 +907,11 @@ static void file_rename_doc(const char *old_filename)
block=le32(fat[block]), i++)
{
struct OLE_DIR *dir_entries;
+#ifdef HAVE_FSEEKO
+ if(fseeko(file, (1+block)<<le16(header->uSectorShift), SEEK_SET)<0)
+#else
if(fseek(file, (1+block)<<le16(header->uSectorShift), SEEK_SET)<0)
+#endif
{
free(fat);
fclose(file);