summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-09-07 23:45:09 +0300
committernotaz2011-09-08 00:48:33 +0300
commita88b04319e4e8a00fb955ee085929039f0c34a49 (patch)
tree655ffd74cc456293b36a3fb4aba44c74f80a7f89
parent2f1c528a6c37558760b28638d271f5ff9ba45e4f (diff)
downloadpicogpsp-a88b04319e4e8a00fb955ee085929039f0c34a49.tar.gz
picogpsp-a88b04319e4e8a00fb955ee085929039f0c34a49.tar.bz2
picogpsp-a88b04319e4e8a00fb955ee085929039f0c34a49.zip
support multi-file zips, skipping irrelevant files
-rw-r--r--common.h4
-rw-r--r--zip.c44
2 files changed, 26 insertions, 22 deletions
diff --git a/common.h b/common.h
index da22d2e..9d4f605 100644
--- a/common.h
+++ b/common.h
@@ -148,10 +148,10 @@
#endif
#define file_read(filename_tag, buffer, size) \
- fread(buffer, size, 1, filename_tag) \
+ fread(buffer, 1, size, filename_tag) \
#define file_write(filename_tag, buffer, size) \
- fwrite(buffer, size, 1, filename_tag) \
+ fwrite(buffer, 1, size, filename_tag) \
#define file_seek(filename_tag, offset, type) \
fseek(filename_tag, offset, type) \
diff --git a/zip.c b/zip.c
index 32d8611..6e52d49 100644
--- a/zip.c
+++ b/zip.c
@@ -51,28 +51,30 @@ u32 load_file_zip(char *filename)
u8 *buffer = NULL;
u8 *cbuffer;
char *ext;
+ int ret;
file_open(fd, filename, read);
if(!file_check_valid(fd))
return -1;
-#if 0 // EDIT: Why this while(1) is used is unknown and can cause a crash.
- while(1)
-#endif
+ while (1)
{
- file_read(fd, &data, sizeof(struct SZIPFileHeader));
-
- // EDIT: Check if this is a zip file without worrying about endian
- // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..)
- // Used to be: if(data.Sig != 0x04034b50) break;
- if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B ||
- data.Sig[2] != 0x03 || data.Sig[3] != 0x04 )
- {
- goto outcode;
- }
-
- file_read(fd, tmp, data.FilenameLength);
+ ret = file_read(fd, &data, sizeof(data));
+ if (ret != sizeof(data))
+ break;
+
+ // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..)
+ if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B ||
+ data.Sig[2] != 0x03 || data.Sig[3] != 0x04 )
+ {
+ break;
+ }
+
+ ret = file_read(fd, tmp, data.FilenameLength);
+ if (ret != data.FilenameLength)
+ break;
+
tmp[data.FilenameLength] = 0; // end string
if(data.ExtraFieldLength)
@@ -88,7 +90,7 @@ u32 load_file_zip(char *filename)
// file is too big
if(data.DataDescriptor.UncompressedSize > gamepak_ram_buffer_size)
- goto outcode;
+ goto skip;
if(!strcasecmp(ext, "bin") || !strcasecmp(ext, "gba"))
{
@@ -100,7 +102,6 @@ u32 load_file_zip(char *filename)
case 0:
retval = data.DataDescriptor.UncompressedSize;
file_read(fd, buffer, retval);
-
goto outcode;
case 8:
@@ -115,9 +116,9 @@ u32 load_file_zip(char *filename)
stream.next_out = (Bytef*)buffer;
- // EDIT: Now uses proper conversion of data types for retval.
- retval = (u32)data.DataDescriptor.UncompressedSize;
- stream.avail_out = data.DataDescriptor.UncompressedSize;
+ // EDIT: Now uses proper conversion of data types for retval.
+ retval = (u32)data.DataDescriptor.UncompressedSize;
+ stream.avail_out = data.DataDescriptor.UncompressedSize;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
@@ -146,6 +147,9 @@ u32 load_file_zip(char *filename)
}
}
}
+
+skip:
+ file_seek(fd, data.DataDescriptor.CompressedSize, SEEK_CUR);
}
outcode: