1 /* 2 +----------------------------------------------------------------------+ 3 | phar php single-file executable PHP extension | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | https://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Gregory Beaver <cellog@php.net> | 16 | Marcus Boerger <helly@php.net> | 17 +----------------------------------------------------------------------+ 18 */ 19 20 typedef struct _phar_zip_file_header { 21 char signature[4]; /* local file header signature 4 bytes (0x04034b50) */ 22 char zipversion[2]; /* version needed to extract 2 bytes */ 23 char flags[2]; /* general purpose bit flag 2 bytes */ 24 char compressed[2]; /* compression method 2 bytes */ 25 char timestamp[2]; /* last mod file time 2 bytes */ 26 char datestamp[2]; /* last mod file date 2 bytes */ 27 char crc32[4]; /* crc-32 4 bytes */ 28 char compsize[4]; /* compressed size 4 bytes */ 29 char uncompsize[4]; /* uncompressed size 4 bytes */ 30 char filename_len[2]; /* file name length 2 bytes */ 31 char extra_len[2]; /* extra field length 2 bytes */ 32 /* file name (variable size) */ 33 /* extra field (variable size) */ 34 } phar_zip_file_header; 35 36 /* unused in this release */ 37 typedef struct _phar_zip_file_datadesc { 38 char signature[4]; /* signature (optional) 4 bytes */ 39 char crc32[4]; /* crc-32 4 bytes */ 40 char compsize[4]; /* compressed size 4 bytes */ 41 char uncompsize[4]; /* uncompressed size 4 bytes */ 42 } phar_zip_data_desc; 43 44 /* unused in this release */ 45 typedef struct _phar_zip_file_datadesc_zip64 { 46 char crc32[4]; /* crc-32 4 bytes */ 47 char compsize[4]; /* compressed size 8 bytes */ 48 char compsize2[4]; 49 char uncompsize[4]; /* uncompressed size 8 bytes */ 50 char uncompsize2[4]; 51 } phar_zip_data_desc_zip64; 52 53 typedef struct _phar_zip_archive_extra_data_record { 54 char signature[4]; /* archive extra data signature 4 bytes (0x08064b50) */ 55 char len[4]; /* extra field length 4 bytes */ 56 /* extra field data (variable size) */ 57 } phar_zip_archive_extra_data_record; 58 59 /* madeby/extractneeded value if bzip2 compression is used */ 60 #define PHAR_ZIP_BZIP2 "46" 61 /* madeby/extractneeded value for other cases */ 62 #define PHAR_ZIP_NORM "20" 63 64 #define PHAR_ZIP_FLAG_ENCRYPTED 0x0001 65 /* data descriptor present for this file */ 66 #define PHAR_ZIP_FLAG_DATADESC 0x0008 67 #define PHAR_ZIP_FLAG_UTF8 0x0400 68 69 /* 70 0 - The file is stored (no compression) 71 1 - The file is Shrunk 72 2 - The file is Reduced with compression factor 1 73 3 - The file is Reduced with compression factor 2 74 4 - The file is Reduced with compression factor 3 75 5 - The file is Reduced with compression factor 4 76 6 - The file is Imploded 77 7 - Reserved for Tokenizing compression algorithm 78 8 - The file is Deflated 79 9 - Enhanced Deflating using Deflate64(tm) 80 10 - PKWARE Data Compression Library Imploding (old IBM TERSE) 81 11 - Reserved by PKWARE 82 12 - File is compressed using BZIP2 algorithm 83 13 - Reserved by PKWARE 84 14 - LZMA (EFS) 85 15 - Reserved by PKWARE 86 16 - Reserved by PKWARE 87 17 - Reserved by PKWARE 88 18 - File is compressed using IBM TERSE (new) 89 19 - IBM LZ77 z Architecture (PFS) 90 97 - WavPack compressed data 91 98 - PPMd version I, Rev 1 92 */ 93 #define PHAR_ZIP_COMP_NONE 0 94 #define PHAR_ZIP_COMP_DEFLATE 8 95 #define PHAR_ZIP_COMP_BZIP2 12 96 97 /* 98 -ASi Unix Extra Field: 99 ==================== 100 101 The following is the layout of the ASi extra block for Unix. The 102 local-header and central-header versions are identical. 103 (Last Revision 19960916) 104 105 Value Size Description 106 ----- ---- ----------- 107 (Unix3) 0x756e Short tag for this extra block type ("nu") 108 TSize Short total data size for this block 109 CRC Long CRC-32 of the remaining data 110 Mode Short file permissions 111 SizDev Long symlink'd size OR major/minor dev num 112 UID Short user ID 113 GID Short group ID 114 (var.) variable symbolic link filename 115 116 Mode is the standard Unix st_mode field from struct stat, containing 117 user/group/other permissions, setuid/setgid and symlink info, etc. 118 119 If Mode indicates that this file is a symbolic link, SizDev is the 120 size of the file to which the link points. Otherwise, if the file 121 is a device, SizDev contains the standard Unix st_rdev field from 122 struct stat (includes the major and minor numbers of the device). 123 SizDev is undefined in other cases. 124 125 If Mode indicates that the file is a symbolic link, the final field 126 will be the name of the file to which the link points. The file- 127 name length can be inferred from TSize. 128 129 [Note that TSize may incorrectly refer to the data size not counting 130 the CRC; i.e., it may be four bytes too small.] 131 */ 132 133 typedef struct _phar_zip_extra_field_header { 134 char tag[2]; 135 char size[2]; 136 } phar_zip_extra_field_header; 137 138 typedef struct _phar_zip_unix3 { 139 char tag[2]; /* 0x756e Short tag for this extra block type ("nu") */ 140 char size[2]; /* TSize Short total data size for this block */ 141 char crc32[4]; /* CRC Long CRC-32 of the remaining data */ 142 char perms[2]; /* Mode Short file permissions */ 143 char symlinksize[4]; /* SizDev Long symlink'd size OR major/minor dev num */ 144 char uid[2]; /* UID Short user ID */ 145 char gid[2]; /* GID Short group ID */ 146 /* (var.) variable symbolic link filename */ 147 } phar_zip_unix3; 148 149 typedef struct _phar_zip_central_dir_file { 150 char signature[4]; /* central file header signature 4 bytes (0x02014b50) */ 151 char madeby[2]; /* version made by 2 bytes */ 152 char zipversion[2]; /* version needed to extract 2 bytes */ 153 char flags[2]; /* general purpose bit flag 2 bytes */ 154 char compressed[2]; /* compression method 2 bytes */ 155 char timestamp[2]; /* last mod file time 2 bytes */ 156 char datestamp[2]; /* last mod file date 2 bytes */ 157 char crc32[4]; /* crc-32 4 bytes */ 158 char compsize[4]; /* compressed size 4 bytes */ 159 char uncompsize[4]; /* uncompressed size 4 bytes */ 160 char filename_len[2]; /* file name length 2 bytes */ 161 char extra_len[2]; /* extra field length 2 bytes */ 162 char comment_len[2]; /* file comment length 2 bytes */ 163 char disknumber[2]; /* disk number start 2 bytes */ 164 char internal_atts[2]; /* internal file attributes 2 bytes */ 165 char external_atts[4]; /* external file attributes 4 bytes */ 166 char offset[4]; /* relative offset of local header 4 bytes */ 167 168 /* file name (variable size) */ 169 /* extra field (variable size) */ 170 /* file comment (variable size) */ 171 } phar_zip_central_dir_file; 172 173 typedef struct _phar_zip_dir_signature { 174 char signature[4]; /* header signature 4 bytes (0x05054b50) */ 175 char size[2]; /* size of data 2 bytes */ 176 } phar_zip_dir_signature; 177 178 /* unused in this release */ 179 typedef struct _phar_zip64_dir_end { 180 char signature[4]; /* zip64 end of central dir 181 signature 4 bytes (0x06064b50) */ 182 char size1[4]; /* size of zip64 end of central 183 directory record 8 bytes */ 184 char size2[4]; 185 char madeby[2]; /* version made by 2 bytes */ 186 char extractneeded[2]; /* version needed to extract 2 bytes */ 187 char disknum[4]; /* number of this disk 4 bytes */ 188 char cdir_num[4]; /* number of the disk with the 189 start of the central directory 4 bytes */ 190 char entries1[4]; /* total number of entries in the 191 central directory on this disk 8 bytes */ 192 char entries2[4]; 193 char entriestotal1[4]; /* total number of entries in the 194 central directory 8 bytes */ 195 char entriestotal2[4]; 196 char cdirsize1[4]; /* size of the central directory 8 bytes */ 197 char cdirsize2[4]; 198 char offset1[4]; /* offset of start of central 199 directory with respect to 200 the starting disk number 8 bytes */ 201 char offset2[4]; 202 /* zip64 extensible data sector (variable size) */ 203 } phar_zip64_dir_end; 204 205 /* unused in this release */ 206 typedef struct _phar_zip64_dir_locator { 207 char signature[4]; /* zip64 end of central dir locator 208 signature 4 bytes (0x07064b50) */ 209 char disknum[4]; /* number of the disk with the 210 start of the zip64 end of 211 central directory 4 bytes */ 212 char diroffset1[4]; /* relative offset of the zip64 213 end of central directory record 8 bytes */ 214 char diroffset2[4]; 215 char totaldisks[4]; /* total number of disks 4 bytes */ 216 } phar_zip64_dir_locator; 217 218 typedef struct _phar_zip_dir_end { 219 char signature[4]; /* end of central dir signature 4 bytes (0x06054b50) */ 220 char disknumber[2]; /* number of this disk 2 bytes */ 221 char centraldisk[2]; /* number of the disk with the 222 start of the central directory 2 bytes */ 223 char counthere[2]; /* total number of entries in the 224 central directory on this disk 2 bytes */ 225 char count[2]; /* total number of entries in 226 the central directory 2 bytes */ 227 char cdir_size[4]; /* size of the central directory 4 bytes */ 228 char cdir_offset[4]; /* offset of start of central 229 directory with respect to 230 the starting disk number 4 bytes */ 231 char comment_len[2]; /* .ZIP file comment length 2 bytes */ 232 /* .ZIP file comment (variable size) */ 233 } phar_zip_dir_end; 234