aboutsummaryrefslogtreecommitdiff
path: root/include/unarchive.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/unarchive.h')
-rw-r--r--include/unarchive.h62
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
7enum { 7enum {
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"
127typedef 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;
150struct 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 */
115typedef struct unpack_info_t { 158typedef struct unpack_info_t {
@@ -128,6 +171,7 @@ extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
128extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; 171extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
129extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; 172extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
130extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; 173extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
174extern void data_extract_to_command(archive_handle_t *archive_handle) FAST_FUNC;
131 175
132extern void header_skip(const file_header_t *file_header) FAST_FUNC; 176extern void header_skip(const file_header_t *file_header) FAST_FUNC;
133extern void header_list(const file_header_t *file_header) FAST_FUNC; 177extern 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
161IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC; 205IF_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 */
163IF_DESKTOP(long long) int unpack_xz_stream(int src_fd, int dst_fd) FAST_FUNC; 207IF_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 */
165IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC; 209IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC;