summaryrefslogtreecommitdiffstats
path: root/libziparchive/zip_archive.cc
diff options
context:
space:
mode:
authorDmitriy Ivanov <dimitry@google.com>2014-07-15 19:33:00 -0700
committerDmitriy Ivanov <dimitry@google.com>2015-01-30 17:57:13 -0800
commit40b52b2c884e2a0abf9c4af8b785433286b7e84b (patch)
tree3fcbfee057ce1576507ea59fda4c06e8c9c3b647 /libziparchive/zip_archive.cc
parentd170bb035dc652b7e350ab7ccca0b1ffa332054e (diff)
downloadsystem_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.zip
system_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.tar.gz
system_core-40b52b2c884e2a0abf9c4af8b785433286b7e84b.tar.bz2
Add close_file flag to OpenArchiveFd()
* We should be able to keep fd alive after CloseArchive() Change-Id: I1aa2c039bb2a590ae72f256acc9ba5401c2c59b1
Diffstat (limited to 'libziparchive/zip_archive.cc')
-rw-r--r--libziparchive/zip_archive.cc13
1 files changed, 8 insertions, 5 deletions
diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc
index b6fd0d2..afc122d 100644
--- a/libziparchive/zip_archive.cc
+++ b/libziparchive/zip_archive.cc
@@ -289,6 +289,7 @@ static const char kTempMappingFileName[] = "zip: ExtractFileToFile";
struct ZipArchive {
/* open Zip archive */
const int fd;
+ const bool close_file;
/* mapped central directory area */
off64_t directory_offset;
@@ -306,8 +307,9 @@ struct ZipArchive {
uint32_t hash_table_size;
ZipEntryName* hash_table;
- ZipArchive(const int fd) :
+ ZipArchive(const int fd, bool assume_ownership) :
fd(fd),
+ close_file(assume_ownership),
directory_offset(0),
directory_map(NULL),
num_entries(0),
@@ -315,7 +317,7 @@ struct ZipArchive {
hash_table(NULL) {}
~ZipArchive() {
- if (fd >= 0) {
+ if (close_file && fd >= 0) {
close(fd);
}
@@ -690,21 +692,22 @@ static int32_t OpenArchiveInternal(ZipArchive* archive,
}
int32_t OpenArchiveFd(int fd, const char* debug_file_name,
- ZipArchiveHandle* handle) {
- ZipArchive* archive = new ZipArchive(fd);
+ ZipArchiveHandle* handle, bool assume_ownership) {
+ ZipArchive* archive = new ZipArchive(fd, assume_ownership);
*handle = archive;
return OpenArchiveInternal(archive, debug_file_name);
}
int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle) {
const int fd = open(fileName, O_RDONLY | O_BINARY, 0);
- ZipArchive* archive = new ZipArchive(fd);
+ ZipArchive* archive = new ZipArchive(fd, true);
*handle = archive;
if (fd < 0) {
ALOGW("Unable to open '%s': %s", fileName, strerror(errno));
return kIoError;
}
+
return OpenArchiveInternal(archive, fileName);
}