1 /*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /*
18 * Read-only access to Zip archives, with minimal heap allocation.
19 */
20 #ifndef LIBDEX_ZIPARCHIVE_H_
21 #define LIBDEX_ZIPARCHIVE_H_
22
23 #include <ziparchive/zip_archive.h>
24
25 #include "SysUtil.h"
26 #include "DexFile.h" // need DEX_INLINE
27
28 /*
29 * Open a Zip archive.
30 *
31 * On success, returns 0 and populates "pArchive". Returns nonzero errno
32 * value on failure.
33 */
dexZipOpenArchive(const char * fileName,ZipArchiveHandle * pArchive)34 DEX_INLINE int dexZipOpenArchive(const char* fileName, ZipArchiveHandle* pArchive) {
35 return OpenArchive(fileName, pArchive);
36 }
37
38 /*
39 * Like dexZipOpenArchive, but takes a file descriptor open for reading
40 * at the start of the file. The descriptor must be mappable (this does
41 * not allow access to a stream).
42 *
43 * "debugFileName" will appear in error messages, but is not otherwise used.
44 */
dexZipOpenArchiveFd(int fd,const char * debugFileName,ZipArchiveHandle * pArchive)45 DEX_INLINE int dexZipOpenArchiveFd(int fd, const char* debugFileName,
46 ZipArchiveHandle* pArchive) {
47 return OpenArchiveFd(fd, debugFileName, pArchive);
48 }
49
50 /*
51 * Close archive, releasing resources associated with it.
52 *
53 * Depending on the implementation this could unmap pages used by classes
54 * stored in a Jar. This should only be done after unloading classes.
55 */
dexZipCloseArchive(ZipArchiveHandle archive)56 DEX_INLINE void dexZipCloseArchive(ZipArchiveHandle archive) {
57 CloseArchive(archive);
58 }
59
60 /*
61 * Return the archive's file descriptor.
62 */
dexZipGetArchiveFd(const ZipArchiveHandle pArchive)63 DEX_INLINE int dexZipGetArchiveFd(const ZipArchiveHandle pArchive) {
64 return GetFileDescriptor(pArchive);
65 }
66
67 /*
68 * Find an entry in the Zip archive, by name. Returns NULL if the entry
69 * was not found.
70 */
dexZipFindEntry(const ZipArchiveHandle pArchive,const char * entryName,ZipEntry * data)71 DEX_INLINE int dexZipFindEntry(const ZipArchiveHandle pArchive,
72 const char* entryName, ZipEntry* data) {
73 return FindEntry(pArchive, ZipString(entryName), data);
74 }
75
76 /*
77 * Uncompress and write an entry to a file descriptor.
78 *
79 * Returns 0 on success.
80 */
dexZipExtractEntryToFile(ZipArchiveHandle handle,ZipEntry * entry,int fd)81 DEX_INLINE int dexZipExtractEntryToFile(ZipArchiveHandle handle,
82 ZipEntry* entry, int fd) {
83 return ExtractEntryToFile(handle, entry, fd);
84 }
85
86 #endif // LIBDEX_ZIPARCHIVE_H_
87