2020-06-15 14:18:57 +00:00
|
|
|
#ifndef COSMOPOLITAN_LIBC_ZIP_H_
|
|
|
|
#define COSMOPOLITAN_LIBC_ZIP_H_
|
2022-08-11 19:13:18 +00:00
|
|
|
#include "libc/intrin/bits.h"
|
2021-08-14 13:17:56 +00:00
|
|
|
#include "libc/calls/struct/timespec.h"
|
2021-03-01 07:42:35 +00:00
|
|
|
#include "libc/macros.internal.h"
|
2020-06-15 14:18:57 +00:00
|
|
|
#include "libc/str/str.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @fileoverview PKZIP Data Structures.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define kZipAlign 2
|
|
|
|
|
2021-04-18 18:34:59 +00:00
|
|
|
#define kZipCosmopolitanVersion kZipEra2001
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
#define kZipOsDos 0
|
|
|
|
#define kZipOsAmiga 1
|
|
|
|
#define kZipOsOpenvms 2
|
|
|
|
#define kZipOsUnix 3
|
|
|
|
#define kZipOsVmcms 4
|
|
|
|
#define kZipOsAtarist 5
|
|
|
|
#define kZipOsOs2hpfs 6
|
|
|
|
#define kZipOsMacintosh 7
|
|
|
|
#define kZipOsZsystem 8
|
|
|
|
#define kZipOsCpm 9
|
|
|
|
#define kZipOsWindowsntfs 10
|
|
|
|
#define kZipOsMvsos390zos 11
|
|
|
|
#define kZipOsVse 12
|
|
|
|
#define kZipOsAcornrisc 13
|
|
|
|
#define kZipOsVfat 14
|
|
|
|
#define kZipOsAltmvs 15
|
|
|
|
#define kZipOsBeos 16
|
|
|
|
#define kZipOsTandem 17
|
|
|
|
#define kZipOsOs400 18
|
|
|
|
#define kZipOsOsxdarwin 19
|
|
|
|
|
|
|
|
#define kZipEra1989 10 /* PKZIP 1.0 */
|
|
|
|
#define kZipEra1993 20 /* PKZIP 2.0: deflate/subdir/etc. support */
|
|
|
|
#define kZipEra2001 45 /* PKZIP 4.5: kZipExtraZip64 support */
|
|
|
|
|
2021-04-18 18:34:59 +00:00
|
|
|
#define kZipIattrBinary 0 /* first bit not set */
|
|
|
|
#define kZipIattrText 1 /* first bit set */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
#define kZipCompressionNone 0
|
|
|
|
#define kZipCompressionDeflate 8
|
|
|
|
|
2022-04-24 16:59:22 +00:00
|
|
|
#define kZipCdirHdrMagic 0x06054b50 /* PK♣♠ "PK\5\6" */
|
|
|
|
#define kZipCdirHdrMinSize 22
|
|
|
|
#define kZipCdirAlign kZipAlign
|
|
|
|
#define kZipCdirHdrLinkableSize 294
|
2020-06-15 14:18:57 +00:00
|
|
|
|
2021-05-14 12:36:58 +00:00
|
|
|
#define kZipCdir64HdrMagic 0x06064b50 /* PK♣♠ "PK\6\6" */
|
|
|
|
#define kZipCdir64HdrMinSize 56
|
|
|
|
#define kZipCdir64LocatorMagic 0x07064b50 /* PK♠• "PK\6\7" */
|
|
|
|
#define kZipCdir64LocatorSize 20
|
2021-04-18 18:34:59 +00:00
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
#define kZipCfileHdrMagic 0x02014b50 /* PK☺☻ "PK\1\2" */
|
|
|
|
#define kZipCfileHdrMinSize 46
|
|
|
|
#define kZipCfileOffsetGeneralflag 8
|
|
|
|
#define kZipCfileOffsetCompressionmethod 10
|
|
|
|
#define kZipCfileOffsetLastmodifiedtime 12
|
|
|
|
#define kZipCfileOffsetLastmodifieddate 14
|
|
|
|
#define kZipCfileOffsetCrc32 16
|
|
|
|
#define kZipCfileOffsetCompressedsize 20
|
2020-10-06 06:11:49 +00:00
|
|
|
#define kZipCfileOffsetUncompressedsize 24
|
2020-06-15 14:18:57 +00:00
|
|
|
#define kZipCfileOffsetExternalattributes 38
|
|
|
|
#define kZipCfileOffsetOffset 42
|
|
|
|
|
|
|
|
#define kZipLfileHdrMagic 0x04034b50 /* PK♥♦ "PK\3\4" */
|
|
|
|
#define kZipLfileHdrMinSize 30
|
|
|
|
#define kZipLfileOffsetGeneralflag 6
|
|
|
|
#define kZipLfileOffsetCompressionmethod 8
|
|
|
|
#define kZipLfileOffsetLastmodifiedtime 10
|
|
|
|
#define kZipLfileOffsetLastmodifieddate 12
|
|
|
|
#define kZipLfileOffsetCrc32 14
|
|
|
|
#define kZipLfileOffsetCompressedsize 18
|
2021-03-25 09:21:13 +00:00
|
|
|
#define kZipLfileOffsetUncompressedsize 22
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
#define kZipGflagUtf8 0x800
|
|
|
|
|
2021-04-18 18:34:59 +00:00
|
|
|
#define kZipExtraHdrSize 4
|
|
|
|
#define kZipExtraZip64 0x0001
|
|
|
|
#define kZipExtraNtfs 0x000a
|
|
|
|
#define kZipExtraUnix 0x000d
|
|
|
|
#define kZipExtraExtendedTimestamp 0x5455
|
|
|
|
#define kZipExtraInfoZipNewUnixExtra 0x7875
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
#define kZipCfileMagic "PK\001\002"
|
|
|
|
|
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
|
|
|
|
|
|
/* end of central directory record */
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_CDIR_MAGIC(P) READ32LE(P)
|
|
|
|
#define ZIP_CDIR_DISK(P) READ16LE((P) + 4)
|
|
|
|
#define ZIP_CDIR_STARTINGDISK(P) READ16LE((P) + 6)
|
|
|
|
#define ZIP_CDIR_RECORDSONDISK(P) READ16LE((P) + 8)
|
|
|
|
#define ZIP_CDIR_RECORDS(P) READ16LE((P) + 10)
|
|
|
|
#define ZIP_CDIR_SIZE(P) READ32LE((P) + 12)
|
|
|
|
#define ZIP_CDIR_OFFSET(P) READ32LE((P) + 16)
|
|
|
|
#define ZIP_CDIR_COMMENTSIZE(P) READ16LE((P) + 20)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_CDIR_COMMENT(P) ((P) + 22) /* recommend stopping at nul */
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CDIR_HDRSIZE(P) (ZIP_CDIR_COMMENTSIZE(P) + kZipCdirHdrMinSize)
|
|
|
|
|
2021-04-18 18:34:59 +00:00
|
|
|
/* zip64 end of central directory record */
|
|
|
|
#define ZIP_CDIR64_MAGIC(P) READ32LE(P)
|
|
|
|
#define ZIP_CDIR64_HDRSIZE(P) (READ64LE((P) + 4) + 12)
|
|
|
|
#define ZIP_CDIR64_VERSIONMADE(P) READ16LE((P) + 12)
|
|
|
|
#define ZIP_CDIR64_VERSIONNEED(P) READ16LE((P) + 14)
|
|
|
|
#define ZIP_CDIR64_DISK(P) READ32LE((P) + 16)
|
|
|
|
#define ZIP_CDIR64_STARTINGDISK(P) READ32LE((P) + 20)
|
|
|
|
#define ZIP_CDIR64_RECORDSONDISK(P) READ64LE((P) + 24)
|
|
|
|
#define ZIP_CDIR64_RECORDS(P) READ64LE((P) + 32)
|
|
|
|
#define ZIP_CDIR64_SIZE(P) READ64LE((P) + 40)
|
|
|
|
#define ZIP_CDIR64_OFFSET(P) READ64LE((P) + 48)
|
|
|
|
#define ZIP_CDIR64_COMMENTSIZE(P) \
|
|
|
|
(ZIP_CDIR64_HDRSIZE(P) >= 56 ? ZIP_CDIR64_HDRSIZE(P) - 56 : 0)
|
2021-05-14 12:36:58 +00:00
|
|
|
#define ZIP_CDIR64_COMMENT(P) ((P) + 56) /* recommend stopping at nul */
|
|
|
|
#define ZIP_LOCATE64_MAGIC(P) READ32LE(P)
|
|
|
|
#define ZIP_LOCATE64_STARTINGDISK(P) READ32LE((P) + 4)
|
|
|
|
#define ZIP_LOCATE64_OFFSET(P) READ64LE((P) + 8)
|
|
|
|
#define ZIP_LOCATE64_TOTALDISKS(P) READ32LE((P) + 12)
|
2021-04-18 18:34:59 +00:00
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
/* central directory file header */
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_CFILE_MAGIC(P) READ32LE(P)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_CFILE_VERSIONMADE(P) (255 & (P)[4])
|
|
|
|
#define ZIP_CFILE_FILEATTRCOMPAT(P) (255 & (P)[5])
|
|
|
|
#define ZIP_CFILE_VERSIONNEED(P) (255 & (P)[6])
|
|
|
|
#define ZIP_CFILE_OSNEED(P) (255 & (P)[7])
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_CFILE_GENERALFLAG(P) READ16LE((P) + kZipCfileOffsetGeneralflag)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CFILE_COMPRESSIONMETHOD(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipCfileOffsetCompressionmethod)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CFILE_LASTMODIFIEDTIME(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipCfileOffsetLastmodifiedtime) /* @see DOS_TIME() */
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CFILE_LASTMODIFIEDDATE(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipCfileOffsetLastmodifieddate) /* @see DOS_DATE() */
|
2020-10-06 06:11:49 +00:00
|
|
|
#define ZIP_CFILE_CRC32(P) READ32LE((P) + kZipCfileOffsetCrc32)
|
|
|
|
#define ZIP_CFILE_COMPRESSEDSIZE(P) READ32LE(P + kZipCfileOffsetCompressedsize)
|
|
|
|
#define ZIP_CFILE_UNCOMPRESSEDSIZE(P) \
|
|
|
|
READ32LE((P) + kZipCfileOffsetUncompressedsize)
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_CFILE_NAMESIZE(P) READ16LE((P) + 28)
|
|
|
|
#define ZIP_CFILE_EXTRASIZE(P) READ16LE((P) + 30)
|
|
|
|
#define ZIP_CFILE_COMMENTSIZE(P) READ16LE((P) + 32)
|
|
|
|
#define ZIP_CFILE_DISK(P) READ16LE((P) + 34)
|
|
|
|
#define ZIP_CFILE_INTERNALATTRIBUTES(P) READ16LE((P) + 36)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CFILE_EXTERNALATTRIBUTES(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ32LE((P) + kZipCfileOffsetExternalattributes)
|
|
|
|
#define ZIP_CFILE_OFFSET(P) READ32LE((P) + kZipCfileOffsetOffset)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_CFILE_NAME(P) ((const char *)((P) + 46)) /* not nul-terminated */
|
|
|
|
#define ZIP_CFILE_EXTRA(P) ((P) + 46 + ZIP_CFILE_NAMESIZE(P))
|
|
|
|
#define ZIP_CFILE_COMMENT(P) \
|
|
|
|
((const char *)((P) + 46 + ZIP_CFILE_NAMESIZE(P) + \
|
|
|
|
ZIP_CFILE_EXTRASIZE(P))) /* recommend stopping at nul */
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_CFILE_HDRSIZE(P) \
|
|
|
|
(ZIP_CFILE_NAMESIZE(P) + ZIP_CFILE_EXTRASIZE(P) + ZIP_CFILE_COMMENTSIZE(P) + \
|
|
|
|
kZipCfileHdrMinSize)
|
|
|
|
|
2020-10-06 06:11:49 +00:00
|
|
|
/* local file header */
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_LFILE_MAGIC(P) READ32LE(P)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_LFILE_VERSIONNEED(P) (255 & (P)[4])
|
|
|
|
#define ZIP_LFILE_OSNEED(P) (255 & (P)[5])
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_LFILE_GENERALFLAG(P) READ16LE((P) + kZipLfileOffsetGeneralflag)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_LFILE_COMPRESSIONMETHOD(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipLfileOffsetCompressionmethod)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_LFILE_LASTMODIFIEDTIME(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipLfileOffsetLastmodifiedtime) /* @see DOS_TIME() */
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_LFILE_LASTMODIFIEDDATE(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ16LE((P) + kZipLfileOffsetLastmodifieddate) /* @see DOS_DATE() */
|
|
|
|
#define ZIP_LFILE_CRC32(P) READ32LE((P) + kZipLfileOffsetCrc32)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_LFILE_COMPRESSEDSIZE(P) \
|
2020-09-28 08:13:56 +00:00
|
|
|
READ32LE((P) + kZipLfileOffsetCompressedsize)
|
2021-03-25 09:21:13 +00:00
|
|
|
#define ZIP_LFILE_UNCOMPRESSEDSIZE(P) \
|
|
|
|
READ32LE((P) + kZipLfileOffsetUncompressedsize)
|
|
|
|
#define ZIP_LFILE_NAMESIZE(P) READ16LE((P) + 26)
|
|
|
|
#define ZIP_LFILE_EXTRASIZE(P) READ16LE((P) + 28)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_LFILE_NAME(P) ((const char *)((P) + 30))
|
|
|
|
#define ZIP_LFILE_EXTRA(P) ((P) + 30 + ZIP_LFILE_NAMESIZE(P))
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_LFILE_HDRSIZE(P) \
|
|
|
|
(ZIP_LFILE_NAMESIZE(P) + ZIP_LFILE_EXTRASIZE(P) + kZipLfileHdrMinSize)
|
|
|
|
#define ZIP_LFILE_CONTENT(P) ((P) + ZIP_LFILE_HDRSIZE(P))
|
|
|
|
#define ZIP_LFILE_SIZE(P) (ZIP_LFILE_HDRSIZE(P) + ZIP_LFILE_COMPRESSEDSIZE(P))
|
|
|
|
|
2020-09-28 08:13:56 +00:00
|
|
|
#define ZIP_EXTRA_HEADERID(P) READ16LE(P)
|
|
|
|
#define ZIP_EXTRA_CONTENTSIZE(P) READ16LE((P) + 2)
|
2021-04-18 18:34:59 +00:00
|
|
|
#define ZIP_EXTRA_CONTENT(P) ((P) + 4)
|
2020-06-15 14:18:57 +00:00
|
|
|
#define ZIP_EXTRA_SIZE(P) (ZIP_EXTRA_CONTENTSIZE(P) + kZipExtraHdrSize)
|
|
|
|
|
2021-05-14 12:36:58 +00:00
|
|
|
void *GetZipCdir(const uint8_t *, size_t);
|
2021-10-15 02:36:49 +00:00
|
|
|
uint8_t *FindEmbeddedApe(const uint8_t *, size_t);
|
2021-04-18 18:34:59 +00:00
|
|
|
bool IsZipCdir32(const uint8_t *, size_t, size_t);
|
|
|
|
bool IsZipCdir64(const uint8_t *, size_t, size_t);
|
|
|
|
int GetZipCfileMode(const uint8_t *);
|
|
|
|
uint64_t GetZipCdirOffset(const uint8_t *);
|
|
|
|
uint64_t GetZipCdirRecords(const uint8_t *);
|
2021-04-25 02:49:49 +00:00
|
|
|
void *GetZipCdirComment(const uint8_t *);
|
2021-05-03 19:09:35 +00:00
|
|
|
uint64_t GetZipCdirSize(const uint8_t *);
|
2021-04-25 02:49:49 +00:00
|
|
|
uint64_t GetZipCdirCommentSize(const uint8_t *);
|
2021-04-18 18:34:59 +00:00
|
|
|
uint64_t GetZipCfileUncompressedSize(const uint8_t *);
|
|
|
|
uint64_t GetZipCfileCompressedSize(const uint8_t *);
|
|
|
|
uint64_t GetZipCfileOffset(const uint8_t *);
|
|
|
|
uint64_t GetZipLfileUncompressedSize(const uint8_t *);
|
|
|
|
uint64_t GetZipLfileCompressedSize(const uint8_t *);
|
2021-08-14 13:17:56 +00:00
|
|
|
void GetZipCfileTimestamps(const uint8_t *, struct timespec *,
|
|
|
|
struct timespec *, struct timespec *, int);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
|
|
#endif /* COSMOPOLITAN_LIBC_ZIP_H_ */
|