diff options
author | Doug Zongker <dougz@android.com> | 2014-02-10 12:35:19 -0800 |
---|---|---|
committer | Doug Zongker <dougz@android.com> | 2014-02-13 08:30:41 -0800 |
commit | a9300301ce0bddb6f46e1e1a7499c13b615713c6 (patch) | |
tree | de91ee750f49aaf54aeb63751cb7cd9ba58804fa /minzip | |
parent | 707d321a8745accf4660bf77e33f6acb9ce6b779 (diff) | |
download | bootable_recovery-a9300301ce0bddb6f46e1e1a7499c13b615713c6.zip bootable_recovery-a9300301ce0bddb6f46e1e1a7499c13b615713c6.tar.gz bootable_recovery-a9300301ce0bddb6f46e1e1a7499c13b615713c6.tar.bz2 |
add mzGetStoredEntry function
mzGetStoredEntry gives you a pointer and address to the data of a zip
entry, assuming that entry is stored rather than deflated.
Change-Id: Ifb39777c98d1d50475ef7de419cf28935f5f9965
Diffstat (limited to 'minzip')
-rw-r--r-- | minzip/Zip.c | 21 | ||||
-rw-r--r-- | minzip/Zip.h | 11 |
2 files changed, 30 insertions, 2 deletions
diff --git a/minzip/Zip.c b/minzip/Zip.c index 6785d4e..abc9890 100644 --- a/minzip/Zip.c +++ b/minzip/Zip.c @@ -703,7 +703,7 @@ static bool writeProcessFunction(const unsigned char *data, int dataLen, while (true) { ssize_t n = write(fd, data+soFar, dataLen-soFar); if (n <= 0) { - LOGE("Error writing %ld bytes from zip file from %p: %s\n", + LOGE("Error writing %zd bytes from zip file from %p: %s\n", dataLen-soFar, data+soFar, strerror(errno)); if (errno != EINTR) { return false; @@ -712,7 +712,7 @@ static bool writeProcessFunction(const unsigned char *data, int dataLen, soFar += n; if (soFar == dataLen) return true; if (soFar > dataLen) { - LOGE("write overrun? (%ld bytes instead of %d)\n", + LOGE("write overrun? (%zd bytes instead of %d)\n", soFar, dataLen); return false; } @@ -735,6 +735,23 @@ bool mzExtractZipEntryToFile(const ZipArchive *pArchive, return true; } +/* + * Obtain a pointer to the in-memory representation of a stored entry. + */ +bool mzGetStoredEntry(const ZipArchive *pArchive, + const ZipEntry *pEntry, unsigned char **addr, size_t *length) +{ + if (pEntry->compression != STORED) { + LOGE("Can't getStoredEntry for '%s'; not stored\n", + pEntry->fileName); + return false; + } + + *addr = pArchive->addr + pEntry->offset; + *length = pEntry->uncompLen; + return true; +} + typedef struct { unsigned char* buffer; long len; diff --git a/minzip/Zip.h b/minzip/Zip.h index 05a2e60..2054b38 100644 --- a/minzip/Zip.h +++ b/minzip/Zip.h @@ -183,6 +183,17 @@ bool mzExtractZipEntryToBuffer(const ZipArchive *pArchive, const ZipEntry *pEntry, unsigned char* buffer); /* + * Return a pointer and length for a given entry. The returned region + * should be valid until pArchive is closed, and should be treated as + * read-only. + * + * Only makes sense for entries which are stored (ie, not compressed). + * No guarantees are made regarding alignment of the returned pointer. + */ +bool mzGetStoredEntry(const ZipArchive *pArchive, + const ZipEntry* pEntry, unsigned char **addr, size_t *length); + +/* * Inflate all entries under zipDir to the directory specified by * targetDir, which must exist and be a writable directory. * |