diff options
Diffstat (limited to 'include/unarchive.h')
-rw-r--r-- | include/unarchive.h | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/include/unarchive.h b/include/unarchive.h index 8009de282..b55af6d9d 100644 --- a/include/unarchive.h +++ b/include/unarchive.h | |||
@@ -7,16 +7,23 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | |||
7 | enum { | 7 | enum { |
8 | #if BB_BIG_ENDIAN | 8 | #if BB_BIG_ENDIAN |
9 | COMPRESS_MAGIC = 0x1f9d, | 9 | COMPRESS_MAGIC = 0x1f9d, |
10 | GZIP_MAGIC = 0x1f8b, | 10 | GZIP_MAGIC = 0x1f8b, |
11 | BZIP2_MAGIC = ('B'<<8) + 'Z', | 11 | BZIP2_MAGIC = 'B' * 256 + 'Z', |
12 | XZ_MAGIC1 = (0xfd<<8) + '7', | 12 | /* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */ |
13 | XZ_MAGIC2 = ((((('z'<<8) + 'X')<<8) + 'Z')<<8) + 0, | 13 | /* More info at: http://tukaani.org/xz/xz-file-format.txt */ |
14 | XZ_MAGIC1 = 0xfd * 256 + '7', | ||
15 | XZ_MAGIC2 = (('z' * 256 + 'X') * 256 + 'Z') * 256 + 0, | ||
16 | /* Different form: 32 bits, then 16 bits: */ | ||
17 | XZ_MAGIC1a = ((0xfd * 256 + '7') * 256 + 'z') * 256 + 'X', | ||
18 | XZ_MAGIC2a = 'Z' * 256 + 0, | ||
14 | #else | 19 | #else |
15 | COMPRESS_MAGIC = 0x9d1f, | 20 | COMPRESS_MAGIC = 0x9d1f, |
16 | GZIP_MAGIC = 0x8b1f, | 21 | GZIP_MAGIC = 0x8b1f, |
17 | BZIP2_MAGIC = ('Z'<<8) + 'B', | 22 | BZIP2_MAGIC = 'Z' * 256 + 'B', |
18 | XZ_MAGIC1 = ('7'<<8) + 0xfd, | 23 | XZ_MAGIC1 = '7' * 256 + 0xfd, |
19 | XZ_MAGIC2 = (((((0<<8) + 'Z')<<8) + 'X')<<8) + 'z', | 24 | XZ_MAGIC2 = ((0 * 256 + 'Z') * 256 + 'X') * 256 + 'z', |
25 | XZ_MAGIC1a = (('X' * 256 + 'z') * 256 + '7') * 256 + 0xfd, | ||
26 | XZ_MAGIC2a = 0 * 256 + 'Z', | ||
20 | #endif | 27 | #endif |
21 | }; | 28 | }; |
22 | 29 | ||
@@ -75,6 +82,9 @@ typedef struct archive_handle_t { | |||
75 | char* tar__longname; | 82 | char* tar__longname; |
76 | char* tar__linkname; | 83 | char* tar__linkname; |
77 | # endif | 84 | # endif |
85 | #if ENABLE_FEATURE_TAR_TO_COMMAND | ||
86 | char* tar__to_command; | ||
87 | #endif | ||
78 | # if ENABLE_FEATURE_TAR_SELINUX | 88 | # if ENABLE_FEATURE_TAR_SELINUX |
79 | char* tar__global_sctx; | 89 | char* tar__global_sctx; |
80 | char* tar__next_file_sctx; | 90 | char* tar__next_file_sctx; |
@@ -110,6 +120,39 @@ typedef struct archive_handle_t { | |||
110 | #define ARCHIVE_O_TRUNC (1 << 8) | 120 | #define ARCHIVE_O_TRUNC (1 << 8) |
111 | 121 | ||
112 | 122 | ||
123 | /* POSIX tar Header Block, from POSIX 1003.1-1990 */ | ||
124 | #define TAR_BLOCK_SIZE 512 | ||
125 | #define NAME_SIZE 100 | ||
126 | #define NAME_SIZE_STR "100" | ||
127 | typedef struct tar_header_t { /* byte offset */ | ||
128 | char name[NAME_SIZE]; /* 0-99 */ | ||
129 | char mode[8]; /* 100-107 */ | ||
130 | char uid[8]; /* 108-115 */ | ||
131 | char gid[8]; /* 116-123 */ | ||
132 | char size[12]; /* 124-135 */ | ||
133 | char mtime[12]; /* 136-147 */ | ||
134 | char chksum[8]; /* 148-155 */ | ||
135 | char typeflag; /* 156-156 */ | ||
136 | char linkname[NAME_SIZE]; /* 157-256 */ | ||
137 | /* POSIX: "ustar" NUL "00" */ | ||
138 | /* GNU tar: "ustar " NUL */ | ||
139 | /* Normally it's defined as magic[6] followed by | ||
140 | * version[2], but we put them together to save code. | ||
141 | */ | ||
142 | char magic[8]; /* 257-264 */ | ||
143 | char uname[32]; /* 265-296 */ | ||
144 | char gname[32]; /* 297-328 */ | ||
145 | char devmajor[8]; /* 329-336 */ | ||
146 | char devminor[8]; /* 337-344 */ | ||
147 | char prefix[155]; /* 345-499 */ | ||
148 | char padding[12]; /* 500-512 (pad to exactly TAR_BLOCK_SIZE) */ | ||
149 | } tar_header_t; | ||
150 | struct BUG_tar_header { | ||
151 | char c[sizeof(tar_header_t) == TAR_BLOCK_SIZE ? 1 : -1]; | ||
152 | }; | ||
153 | |||
154 | |||
155 | |||
113 | /* Info struct unpackers can fill out to inform users of thing like | 156 | /* Info struct unpackers can fill out to inform users of thing like |
114 | * timestamps of unpacked files */ | 157 | * timestamps of unpacked files */ |
115 | typedef struct unpack_info_t { | 158 | typedef struct unpack_info_t { |
@@ -128,6 +171,7 @@ extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC; | |||
128 | extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; | 171 | extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; |
129 | extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; | 172 | extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; |
130 | extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; | 173 | extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; |
174 | extern void data_extract_to_command(archive_handle_t *archive_handle) FAST_FUNC; | ||
131 | 175 | ||
132 | extern void header_skip(const file_header_t *file_header) FAST_FUNC; | 176 | extern void header_skip(const file_header_t *file_header) FAST_FUNC; |
133 | extern void header_list(const file_header_t *file_header) FAST_FUNC; | 177 | extern void header_list(const file_header_t *file_header) FAST_FUNC; |
@@ -159,7 +203,7 @@ typedef struct inflate_unzip_result { | |||
159 | } inflate_unzip_result; | 203 | } inflate_unzip_result; |
160 | 204 | ||
161 | IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC; | 205 | IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC; |
162 | /* xz unpacker takes .xz stream from offset 0 */ | 206 | /* xz unpacker takes .xz stream from offset 6 */ |
163 | IF_DESKTOP(long long) int unpack_xz_stream(int src_fd, int dst_fd) FAST_FUNC; | 207 | IF_DESKTOP(long long) int unpack_xz_stream(int src_fd, int dst_fd) FAST_FUNC; |
164 | /* lzma unpacker takes .lzma stream from offset 0 */ | 208 | /* lzma unpacker takes .lzma stream from offset 0 */ |
165 | IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC; | 209 | IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC; |