diff --git a/src/fpk.c b/src/fpk.c index 55ad015..683e74d 100644 --- a/src/fpk.c +++ b/src/fpk.c @@ -1,9 +1,21 @@ +#if !defined(_WIN32) +#define _FILE_OFFSET_BITS 64 +#define _POSIX_C_SOURCE 200809L +#endif + #include "fpk.h" #include #include #include +#if defined(_WIN32) +#define fpk_fseek64(f, off) _fseeki64((f), (off), SEEK_SET) +#else +#include +#define fpk_fseek64(f, off) fseeko((f), (off_t)(off), SEEK_SET) +#endif + #define FPK_HEADER_FIELD_ENTRY_COUNT 4 #define FPK_HEADER_FIELD_DIR_OFFSET 12 #define FPK_HEADER_FIELD_STRTAB_OFFSET 20 @@ -104,7 +116,7 @@ struct fpk *fpk_open(const char *path) fpk->strtab = malloc((size_t)strtab_size); if (fpk->strtab == NULL) goto fail; - if (fseek(fpk->file, (long)strtab_offset, SEEK_SET) != 0) + if (fpk_fseek64(fpk->file, strtab_offset) != 0) goto fail; if (fread(fpk->strtab, 1, (size_t)strtab_size, fpk->file) != strtab_size) @@ -113,7 +125,7 @@ struct fpk *fpk_open(const char *path) fpk->entries = malloc((size_t)fpk->entry_count * sizeof(fpk_entry_t)); if (fpk->entries == NULL) goto fail; - if (fseek(fpk->file, (long)dir_offset, SEEK_SET) != 0) + if (fpk_fseek64(fpk->file, dir_offset) != 0) goto fail; for (i = 0; i < fpk->entry_count; i++) { unsigned char rec[FPK_DIR_ENTRY_SIZE]; @@ -173,7 +185,7 @@ void *fpk_read(struct fpk *fpk, const fpk_entry_t *entry, size_t *out_size) if (buf == NULL) goto out; - if (fseek(fpk->file, (long)entry->data_offset, SEEK_SET) != 0 || + if (fpk_fseek64(fpk->file, entry->data_offset) != 0 || fread(buf, 1, (size_t)entry->data_size, fpk->file) != entry->data_size) { free(buf); @@ -289,7 +301,7 @@ int fpk_writer_finalize(struct fpk_writer *w) int ret = 0; strtab_offset = w->cursor; - if (fseek(w->file, (long)strtab_offset, SEEK_SET) != 0) { + if (fpk_fseek64(w->file, strtab_offset) != 0) { ret = -1; goto out; } @@ -330,7 +342,7 @@ int fpk_writer_finalize(struct fpk_writer *w) put_u64le(header + FPK_HEADER_FIELD_DIR_OFFSET, dir_offset); put_u64le(header + FPK_HEADER_FIELD_STRTAB_OFFSET, strtab_offset); - if (fseek(w->file, 0, SEEK_SET) != 0 || + if (fpk_fseek64(w->file, 0) != 0 || fwrite(header, 1, FPK_HEADER_SIZE, w->file) != FPK_HEADER_SIZE || fflush(w->file) != 0) ret = -1;