From 40b52b2c884e2a0abf9c4af8b785433286b7e84b Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Tue, 15 Jul 2014 19:33:00 -0700 Subject: Add close_file flag to OpenArchiveFd() * We should be able to keep fd alive after CloseArchive() Change-Id: I1aa2c039bb2a590ae72f256acc9ba5401c2c59b1 --- libziparchive/zip_archive.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'libziparchive/zip_archive.cc') 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); } -- cgit v1.1