/*******************************************************************************1* Copyright (c) 1991, 2017 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#ifndef zip_api_h23#define zip_api_h2425/**26* @file zip_api.h27* @brief Public API for the ZIP module.28*29* This file contains public function prototypes and30* type definitions for the ZIP module.31*32*/3334#include "j9cfg.h"35#include "j9comp.h"36#include "pool_api.h"37#include "j9port.h"38#include "zipsup.h"39#include "omrhookable.h"4041#ifdef __cplusplus42extern "C" {43#endif4445/* Empty set of options */46#define J9ZIP_OPEN_NO_FLAGS 04748/* Read the central directory and cache the information. */49#define J9ZIP_OPEN_READ_CACHE_DATA 15051/* Accept the file as a zip file even if it does not start with a local header */52#define J9ZIP_OPEN_ALLOW_NONSTANDARD_ZIP 25354/* Empty set of options */55#define J9ZIP_GETENTRY_NO_FLAGS 05657/* Match a directory even if filename does not end in '/'. Supported (for the JCL) only when there is a cache. */58#define J9ZIP_GETENTRY_FIND_DIRECTORY 15960/* Do extra work to read the data pointer. If false the dataPointer will be 0. */61#define J9ZIP_GETENTRY_READ_DATA_POINTER 26263/* Look for the entry using the central directory without a cache. This handles non-standard ZIP files. */64#define J9ZIP_GETENTRY_USE_CENTRAL_DIRECTORY 46566typedef struct J9ZipFunctionTable {67void (*zip_freeZipComment)(J9PortLibrary * portLib, U_8 * commentString);68void (*zip_freeZipEntry)(J9PortLibrary * portLib, J9ZipEntry * entry);69I_32 (*zip_getNextZipEntry)(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* zipEntry, IDATA* nextEntryPointer, BOOLEAN readDataPointer);70I_32 (*zip_getZipComment)(J9PortLibrary* portLib, J9ZipFile *zipFile, U_8 ** commentString, UDATA * commentLength);71I_32 (*zip_getZipEntry)(J9PortLibrary *portLib, J9ZipFile *zipFile, J9ZipEntry *entry, const char *filename, IDATA fileNameLength, U_32 flags);72I_32 (*zip_getZipEntryComment)(J9PortLibrary * portLib, J9ZipFile * zipFile, J9ZipEntry * entry, U_8 * buffer, U_32 bufferSize);73I_32 (*zip_getZipEntryData)(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize);74I_32 (*zip_getZipEntryExtraField)(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize);75I_32 (*zip_getZipEntryFromOffset)(J9PortLibrary * portLib, J9ZipFile * zipFile, J9ZipEntry * entry, IDATA offset, BOOLEAN readDataPointer);76I_32 (*zip_getZipEntryRawData)(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize, U_32 offset);77void (*zip_initZipEntry)(J9PortLibrary* portLib, J9ZipEntry* entry);78I_32 (*zip_openZipFile)(J9PortLibrary *portLib, char *filename, J9ZipFile *zipFile, J9ZipCachePool *cachePool, U_32 flags);79I_32 (*zip_releaseZipFile)(J9PortLibrary* portLib, struct J9ZipFile* zipFile);80void (*zip_resetZipFile)(J9PortLibrary* portLib, J9ZipFile* zipFile, IDATA *nextEntryPointer);81} J9ZipFunctionTable;8283/* ---------------- zcpool.c ---------------- */8485/**86* @brief87* @param *zcp88* @param *zipCache89* @return BOOLEAN90*/91BOOLEAN zipCachePool_addCache(J9ZipCachePool *zcp, J9ZipCache *zipCache);929394/**95* @brief96* @param *zcp97* @param *zipCache98* @return BOOLEAN99*/100BOOLEAN zipCachePool_addRef(J9ZipCachePool *zcp, J9ZipCache *zipCache);101102103/**104* @brief105* @param *zcp106* @param *zipFileName107* @param zipFileNameLength108* @param zipFileSize109* @param zipTimeStamp110* @return J9ZipCache *111*/112J9ZipCache * zipCachePool_findCache(J9ZipCachePool *zcp, char const *zipFileName, IDATA zipFileNameLength, IDATA zipFileSize, I_64 zipTimeStamp);113114115/**116* @brief117* @param *zcp118* @return void119*/120void zipCachePool_kill(J9ZipCachePool *zcp);121122/**123* Get the list of core Zipfile functions. Initializes the zip library if necessary.124* @param portLib port library125* @param libDir directory containing the zlib126* @return table of functions or null if the zip library cannot be initialized.127*/128J9ZipFunctionTable *getZipFunctions(J9PortLibrary *portLib, void *libDir);129130/**131* @brief132* @param portLib133* @return J9ZipCachePool *134*/135J9ZipCachePool *zipCachePool_new(J9PortLibrary * portLib, void * userData);136137138/**139* @brief140* @param *zcp141* @param *zipCache142* @return BOOLEAN143*/144BOOLEAN zipCachePool_release(J9ZipCachePool *zcp, J9ZipCache *zipCache);145146/* ---------------- zipalloc.c ---------------- */147148#if (defined(J9VM_OPT_ZLIB_SUPPORT))149/**150* @brief151* @param opaque152* @param items153* @param size154* @return void*155*/156void* zalloc(void* opaque, U_32 items, U_32 size);157#endif /* J9VM_OPT_ZLIB_SUPPORT */158159160#if (defined(J9VM_OPT_ZLIB_SUPPORT))161/**162* @brief163* @param opaque164* @param address165* @return void166*/167void zfree(void* opaque, void* address);168#endif /* J9VM_OPT_ZLIB_SUPPORT */169170/* ---------------- zipcache.c ---------------- */171172/**173* @brief174* @param zipCache175* @param *elementName176* @param elementNameLength177* @param elementOffset178* @return BOOLEAN179*/180BOOLEAN181zipCache_addElement(J9ZipCache * zipCache, char *elementName, IDATA elementNameLength, UDATA elementOffset);182183184/**185* @brief186* @param *handle187* @param *nameBuf188* @param nameBufSize189* @param offset190* @return IDATA191*/192IDATA193zipCache_enumElement(void *handle, char *nameBuf, UDATA nameBufSize, UDATA * offset);194195196/**197* @brief198* @param *handle199* @param *nameBuf200* @param nameBufSize201* @return IDATA202*/203IDATA204zipCache_enumGetDirName(void *handle, char *nameBuf, UDATA nameBufSize);205206207/**208* @brief209* @param *handle210* @return void211*/212void213zipCache_enumKill(void *handle);214215216/**217* @brief218* @param zipCache219* @param *directoryName220* @param **handle221* @return IDATA222*/223IDATA224zipCache_enumNew(J9ZipCache * zipCache, char *directoryName, void **handle);225226227/**228* @brief229* @param zipCache230* @param *elementName231* @param elementNameLength232* @param searchDirList233* @return UDATA234*/235UDATA236zipCache_findElement(J9ZipCache * zipCache, const char *elementName, IDATA elementNameLength, BOOLEAN searchDirList);237238239/**240* @brief241* @param zipCache242* @return void243*/244void245zipCache_kill(J9ZipCache * zipCache);246247248/**249* @brief250* @param portLib251* @param zipName252* @param zipNameLength253* @param zipFileSize254* @param zipTimeStamp255* @return J9ZipCache *256*/257J9ZipCache *258zipCache_new(J9PortLibrary * portLib, char *zipName, IDATA zipNameLength, IDATA zipFileSize, I_64 zipTimeStamp);259260261/**262* @brief263* @param zipCache264* @param startCentralDir265*/266void zipCache_setStartCentralDir(J9ZipCache * zipCache, IDATA startCentralDir);267268269/**270* @brief271* @param zipCache272* @return BOOLEAN273*/274BOOLEAN275zipCache_hasData(J9ZipCache * zipCache);276277278#if defined(J9VM_OPT_SHARED_CLASSES)279/**280* @brief281* @param zipCache282* @return UDATA283*/284UDATA285zipCache_cacheSize(J9ZipCache * zipCache);286#endif287288289#if defined(J9VM_OPT_SHARED_CLASSES)290/**291* @brief292* @param zipCache293* @param cacheData294* @return BOOLEAN295*/296BOOLEAN297zipCache_copy(J9ZipCache * zipCache, void *cacheData, UDATA dataSize);298#endif299300301#if defined(J9VM_OPT_SHARED_CLASSES)302/**303* @brief304* @param zipCache305* @param cacheData306* @return void307*/308void309zipCache_useCopiedCache(J9ZipCache * zipCache, void *cacheData);310#endif311312313#if defined(J9VM_OPT_SHARED_CLASSES)314/**315* @brief316* @param zipCache317* @return BOOLEAN318*/319BOOLEAN320zipCache_isCopied(J9ZipCache * zipCache);321#endif322323324#if defined(J9VM_OPT_SHARED_CLASSES)325/**326* @brief327* @param zipCache328* @return const char *329*/330const char *331zipCache_uniqueId(J9ZipCache * zipCache);332#endif333334struct J9ZipFile;335/**336* @brief337* @param portLib338* @param zipFile339* @return I_32340*/341I_32342zip_releaseZipFile(J9PortLibrary* portLib, struct J9ZipFile* zipFile);343344345/**346* @brief347* @param portLib348* @param dir349* @return I_32350*/351I_32 initZipLibrary (J9PortLibrary* portLib, char *dir);352353/**354* @brief355* @param portLib356* @param filename357* @param cachePool358* @param cache359* @return I_32360*/361I_32362zip_searchCache(J9PortLibrary * portLib, char *filename, J9ZipCachePool *cachePool, J9ZipCache **cache);363364/**365* @brief366* @param portLib367* @param zipFile368* @param cache369* @param cachePool370* @return I_32371*/372I_32373zip_setupCache(J9PortLibrary * portLib, J9ZipFile *zipFile, J9ZipCache *cache, J9ZipCachePool *cachePool);374375376/**377* @brief378* @param portLib379* @param zipFile380* @return I_32381*/382I_32383zip_readCacheData(J9PortLibrary * portLib, J9ZipFile *zipFile);384385386/**387* @brief388* @param portLib389* @param entry390* @return void391*/392void393zip_freeZipEntry(J9PortLibrary * portLib, J9ZipEntry * entry);394395396/**397* @brief398* @param portLib399* @param zipFile400* @param zipEntry401* @param nextEntryPointer402* @param readDataPointer403* @return I_32404*/405I_32406zip_getNextZipEntry(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* zipEntry, IDATA* nextEntryPointer, BOOLEAN readDataPointer);407408409/**410* @brief411* @param portLib412* @param zipFile413* @param entry414* @param *filename415* @param filenameLength416* @param flags417* @return I_32418*/419I_32420zip_getZipEntry(J9PortLibrary *portLib, J9ZipFile *zipFile, J9ZipEntry *entry, const char *filename, IDATA filenameLength, U_32 flags);421422423/**424* @brief425* @param portLib426* @param zipFile427* @param entry428* @param buffer429* @param bufferSize430* @return I_32431*/432I_32433zip_getZipEntryComment(J9PortLibrary * portLib, J9ZipFile * zipFile, J9ZipEntry * entry, U_8 * buffer,434U_32 bufferSize);435436/* @brief437* @param[in] portLib438* @param[in] zipFile439* @param[in/out]pointer to commentString440* @param[out] pointer to commentLength441* @return I32442*/443I_32444zip_getZipComment(J9PortLibrary * portLib, J9ZipFile * zipFile, U_8 ** commentString, UDATA * commentLength);445446447/*448* @brief449* @param[in] portLib450* @param[in] commentString451*452*/453void454zip_freeZipComment(J9PortLibrary * portLib, U_8 * commentString);455456/**457* @brief458* @param portLib459* @param zipFile460* @param entry461* @param buffer462* @param bufferSize463* @return I_32464*/465I_32466zip_getZipEntryData(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize);467468469/**470* @brief471* @param portLib472* @param zipFile473* @param entry474* @param buffer475* @param bufferSize476* @param offset477* @return I_32478*/479I_32480zip_getZipEntryRawData(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize, U_32 offset);481482483/**484* @brief485* @param portLib486* @param zipFile487* @param entry488* @param buffer489* @param bufferSize490* @return I_32491*/492I_32493zip_getZipEntryExtraField(J9PortLibrary* portLib, J9ZipFile* zipFile, J9ZipEntry* entry, U_8* buffer, U_32 bufferSize);494495496/**497* @brief498* @param portLib499* @param zipFile500* @param entry501* @param offset502* @param readDataPointer503* @return I_32504*/505I_32506zip_getZipEntryFromOffset(J9PortLibrary * portLib, J9ZipFile * zipFile, J9ZipEntry * entry, IDATA offset, BOOLEAN readDataPointer);507508509/**510* @brief511* @param portLib512* @param entry513* @return void514*/515void516zip_initZipEntry(J9PortLibrary* portLib, J9ZipEntry* entry);517518519/**520* @brief521* @param portLib522* @param *cachePool523* @return UDATA524*/525J9HookInterface**526zip_getVMZipCachePoolHookInterface(J9ZipCachePool *cachePool);527528/**529* @brief530* @param javaVM531* @param *cachePool532* @return void533*/534IDATA535zip_initZipCachePoolHookInterface(J9PortLibrary* portLib, J9ZipCachePool *cachePool);536537/**538* @brief539* @param *cachePool540* @return void541*/542void543zip_shutdownZipCachePoolHookInterface(J9ZipCachePool *cachePool);544545/**546* @brief547* @param portLib548* @param filename549* @param zipFile550* @param cachePool551* @param flags552* @return I_32553*/554I_32555zip_openZipFile(J9PortLibrary *portLib, char *filename, J9ZipFile *zipFile, J9ZipCachePool *cachePool, U_32 flags);556557558/**559* @brief560* @param portLib561* @param zipFile562* @param *nextEntryPointer563* @return void564*/565void566zip_resetZipFile(J9PortLibrary* portLib, J9ZipFile* zipFile, IDATA *nextEntryPointer);567568569void570zip_triggerZipLoadHook (J9PortLibrary* portLib, const char* filename, UDATA newState, J9ZipCachePool *cachePool);571572#ifdef __cplusplus573}574#endif575576#endif /* zip_api_h */577578579