summaryrefslogtreecommitdiffstats
path: root/minzip
diff options
context:
space:
mode:
authorDoug Zongker <dougz@android.com>2014-02-10 12:35:19 -0800
committerDoug Zongker <dougz@android.com>2014-02-13 08:30:41 -0800
commita9300301ce0bddb6f46e1e1a7499c13b615713c6 (patch)
treede91ee750f49aaf54aeb63751cb7cd9ba58804fa /minzip
parent707d321a8745accf4660bf77e33f6acb9ce6b779 (diff)
downloadbootable_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.c21
-rw-r--r--minzip/Zip.h11
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.
*