diff options
author | Doug Zongker <dougz@android.com> | 2010-02-01 14:40:12 -0800 |
---|---|---|
committer | Doug Zongker <dougz@android.com> | 2010-02-01 14:40:12 -0800 |
commit | 6aece33b3f3af6a161e326af36bc894427fcf5ad (patch) | |
tree | b164457ed1f664a0d195f30933b70386687a0887 /minzip/Zip.c | |
parent | aa062531aa3e740b6cf7d3690fd5310e7fdf03f2 (diff) | |
download | bootable_recovery-6aece33b3f3af6a161e326af36bc894427fcf5ad.zip bootable_recovery-6aece33b3f3af6a161e326af36bc894427fcf5ad.tar.gz bootable_recovery-6aece33b3f3af6a161e326af36bc894427fcf5ad.tar.bz2 |
add a one-argument version of package_extract_file
Add a version of package_extract_file that returns the file data as
its return value (to be consumed by some other edify function that
expects to receive a bunch of binary data as an argument). Lets us
avoid having two copies of a big file in memory (extracting it into
/tmp, which is a ramdisk, and then having something load it into
memory) when doing things like radio updates.
Change-Id: Ie26ece5fbae457eb0ddcd8a13d74d78a769fbc70
Diffstat (limited to 'minzip/Zip.c')
-rw-r--r-- | minzip/Zip.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/minzip/Zip.c b/minzip/Zip.c index 8cdb898..46d2f82 100644 --- a/minzip/Zip.c +++ b/minzip/Zip.c @@ -810,6 +810,43 @@ bool mzExtractZipEntryToFile(const ZipArchive *pArchive, return true; } +typedef struct { + unsigned char* buffer; + long len; +} BufferExtractCookie; + +static bool bufferProcessFunction(const unsigned char *data, int dataLen, + void *cookie) { + BufferExtractCookie *bec = (BufferExtractCookie*)cookie; + + memmove(bec->buffer, data, dataLen); + bec->buffer += dataLen; + bec->len -= dataLen; + + return true; +} + +/* + * Uncompress "pEntry" in "pArchive" to buffer, which must be large + * enough to hold mzGetZipEntryUncomplen(pEntry) bytes. + */ +bool mzExtractZipEntryToBuffer(const ZipArchive *pArchive, + const ZipEntry *pEntry, unsigned char *buffer) +{ + BufferExtractCookie bec; + bec.buffer = buffer; + bec.len = mzGetZipEntryUncompLen(pEntry); + + bool ret = mzProcessZipEntryContents(pArchive, pEntry, + bufferProcessFunction, (void*)&bec); + if (!ret || bec.len != 0) { + LOGE("Can't extract entry to memory buffer.\n"); + return false; + } + return true; +} + + /* Helper state to make path translation easier and less malloc-happy. */ typedef struct { |