source: MondoRescue/branches/3.3/mindi-busybox/include/bb_archive.h@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 9.6 KB
Line 
1/* vi: set sw=4 ts=4: */
2#ifndef UNARCHIVE_H
3#define UNARCHIVE_H 1
4
5PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
6
7enum {
8#if BB_BIG_ENDIAN
9 COMPRESS_MAGIC = 0x1f9d,
10 GZIP_MAGIC = 0x1f8b,
11 BZIP2_MAGIC = 256 * 'B' + 'Z',
12 /* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */
13 /* More info at: http://tukaani.org/xz/xz-file-format.txt */
14 XZ_MAGIC1 = 256 * 0xfd + '7',
15 XZ_MAGIC2 = 256 * (unsigned)(256 * (256 * 'z' + 'X') + 'Z') + 0,
16 /* Different form: 32 bits, then 16 bits: */
17 /* (unsigned) cast suppresses "integer overflow in expression" warning */
18 XZ_MAGIC1a = 256 * (unsigned)(256 * (256 * 0xfd + '7') + 'z') + 'X',
19 XZ_MAGIC2a = 256 * 'Z' + 0,
20#else
21 COMPRESS_MAGIC = 0x9d1f,
22 GZIP_MAGIC = 0x8b1f,
23 BZIP2_MAGIC = 'B' + 'Z' * 256,
24 XZ_MAGIC1 = 0xfd + '7' * 256,
25 XZ_MAGIC2 = 'z' + ('X' + ('Z' + 0 * 256) * 256) * 256,
26 XZ_MAGIC1a = 0xfd + ('7' + ('z' + 'X' * 256) * 256) * 256,
27 XZ_MAGIC2a = 'Z' + 0 * 256,
28#endif
29};
30
31typedef struct file_header_t {
32 char *name;
33 char *link_target;
34#if ENABLE_FEATURE_TAR_UNAME_GNAME
35 char *tar__uname;
36 char *tar__gname;
37#endif
38 off_t size;
39 uid_t uid;
40 gid_t gid;
41 mode_t mode;
42 time_t mtime;
43 dev_t device;
44} file_header_t;
45
46struct hardlinks_t;
47
48typedef struct archive_handle_t {
49 /* Flags. 1st since it is most used member */
50 unsigned ah_flags;
51
52 /* The raw stream as read from disk or stdin */
53 int src_fd;
54
55 /* Define if the header and data component should be processed */
56 char FAST_FUNC (*filter)(struct archive_handle_t *);
57 /* List of files that have been accepted */
58 llist_t *accept;
59 /* List of files that have been rejected */
60 llist_t *reject;
61 /* List of files that have successfully been worked on */
62 llist_t *passed;
63
64 /* Currently processed file's header */
65 file_header_t *file_header;
66
67 /* Process the header component, e.g. tar -t */
68 void FAST_FUNC (*action_header)(const file_header_t *);
69
70 /* Process the data component, e.g. extract to filesystem */
71 void FAST_FUNC (*action_data)(struct archive_handle_t *);
72
73 /* Function that skips data */
74 void FAST_FUNC (*seek)(int fd, off_t amount);
75
76 /* Count processed bytes */
77 off_t offset;
78
79 /* Archiver specific. Can make it a union if it ever gets big */
80#if ENABLE_FEATURE_TAR_LONG_OPTIONS
81 unsigned tar__strip_components;
82#endif
83#define PAX_NEXT_FILE 0
84#define PAX_GLOBAL 1
85#if ENABLE_TAR || ENABLE_DPKG || ENABLE_DPKG_DEB
86 smallint tar__end;
87# if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
88 char* tar__longname;
89 char* tar__linkname;
90# endif
91# if ENABLE_FEATURE_TAR_TO_COMMAND
92 char* tar__to_command;
93 const char* tar__to_command_shell;
94# endif
95# if ENABLE_FEATURE_TAR_SELINUX
96 char* tar__sctx[2];
97# endif
98#endif
99#if ENABLE_CPIO || ENABLE_RPM2CPIO || ENABLE_RPM
100 uoff_t cpio__blocks;
101 struct bb_uidgid_t cpio__owner;
102 struct hardlinks_t *cpio__hardlinks_to_create;
103 struct hardlinks_t *cpio__created_hardlinks;
104#endif
105#if ENABLE_DPKG || ENABLE_DPKG_DEB
106 /* Temporary storage */
107 char *dpkg__buffer;
108 /* How to process any sub archive, e.g. get_header_tar_gz */
109 char FAST_FUNC (*dpkg__action_data_subarchive)(struct archive_handle_t *);
110 /* Contains the handle to a sub archive */
111 struct archive_handle_t *dpkg__sub_archive;
112#endif
113#if ENABLE_FEATURE_AR_CREATE
114 const char *ar__name;
115 struct archive_handle_t *ar__out;
116#endif
117} archive_handle_t;
118/* bits in ah_flags */
119#define ARCHIVE_RESTORE_DATE (1 << 0)
120#define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
121#define ARCHIVE_UNLINK_OLD (1 << 2)
122#define ARCHIVE_EXTRACT_QUIET (1 << 3)
123#define ARCHIVE_EXTRACT_NEWER (1 << 4)
124#define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
125#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
126#define ARCHIVE_NUMERIC_OWNER (1 << 7)
127#define ARCHIVE_O_TRUNC (1 << 8)
128#define ARCHIVE_REMEMBER_NAMES (1 << 9)
129#if ENABLE_RPM
130#define ARCHIVE_REPLACE_VIA_RENAME (1 << 10)
131#endif
132
133
134/* POSIX tar Header Block, from POSIX 1003.1-1990 */
135#define TAR_BLOCK_SIZE 512
136#define NAME_SIZE 100
137#define NAME_SIZE_STR "100"
138typedef struct tar_header_t { /* byte offset */
139 char name[NAME_SIZE]; /* 0-99 */
140 char mode[8]; /* 100-107 */
141 char uid[8]; /* 108-115 */
142 char gid[8]; /* 116-123 */
143 char size[12]; /* 124-135 */
144 char mtime[12]; /* 136-147 */
145 char chksum[8]; /* 148-155 */
146 char typeflag; /* 156-156 */
147 char linkname[NAME_SIZE]; /* 157-256 */
148 /* POSIX: "ustar" NUL "00" */
149 /* GNU tar: "ustar " NUL */
150 /* Normally it's defined as magic[6] followed by
151 * version[2], but we put them together to save code.
152 */
153 char magic[8]; /* 257-264 */
154 char uname[32]; /* 265-296 */
155 char gname[32]; /* 297-328 */
156 char devmajor[8]; /* 329-336 */
157 char devminor[8]; /* 337-344 */
158 char prefix[155]; /* 345-499 */
159 char padding[12]; /* 500-512 (pad to exactly TAR_BLOCK_SIZE) */
160} tar_header_t;
161struct BUG_tar_header {
162 char c[sizeof(tar_header_t) == TAR_BLOCK_SIZE ? 1 : -1];
163};
164
165
166extern const char cpio_TRAILER[];
167
168
169archive_handle_t *init_handle(void) FAST_FUNC;
170
171char filter_accept_all(archive_handle_t *archive_handle) FAST_FUNC;
172char filter_accept_list(archive_handle_t *archive_handle) FAST_FUNC;
173char filter_accept_list_reassign(archive_handle_t *archive_handle) FAST_FUNC;
174char filter_accept_reject_list(archive_handle_t *archive_handle) FAST_FUNC;
175
176void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
177
178void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
179void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
180void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
181void data_extract_to_command(archive_handle_t *archive_handle) FAST_FUNC;
182
183void header_skip(const file_header_t *file_header) FAST_FUNC;
184void header_list(const file_header_t *file_header) FAST_FUNC;
185void header_verbose_list(const file_header_t *file_header) FAST_FUNC;
186
187char get_header_ar(archive_handle_t *archive_handle) FAST_FUNC;
188char get_header_cpio(archive_handle_t *archive_handle) FAST_FUNC;
189char get_header_tar(archive_handle_t *archive_handle) FAST_FUNC;
190char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC;
191char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC;
192char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC;
193char get_header_tar_xz(archive_handle_t *archive_handle) FAST_FUNC;
194
195void seek_by_jump(int fd, off_t amount) FAST_FUNC;
196void seek_by_read(int fd, off_t amount) FAST_FUNC;
197
198const char *strip_unsafe_prefix(const char *str) FAST_FUNC;
199
200void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC;
201const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC;
202const llist_t *find_list_entry2(const llist_t *list, const char *filename) FAST_FUNC;
203
204/* A bit of bunzip2 internals are exposed for compressed help support: */
205typedef struct bunzip_data bunzip_data;
206int start_bunzip(bunzip_data **bdp, int in_fd, const void *inbuf, int len) FAST_FUNC;
207/* NB: read_bunzip returns < 0 on error, or the number of *unfilled* bytes
208 * in outbuf. IOW: on EOF returns len ("all bytes are not filled"), not 0: */
209int read_bunzip(bunzip_data *bd, char *outbuf, int len) FAST_FUNC;
210void dealloc_bunzip(bunzip_data *bd) FAST_FUNC;
211
212/* Meaning and direction (input/output) of the fields are transformer-specific */
213typedef struct transformer_state_t {
214 smallint signature_skipped; /* most often referenced member */
215
216 IF_DESKTOP(long long) int FAST_FUNC (*xformer)(struct transformer_state_t *xstate);
217 USE_FOR_NOMMU(const char *xformer_prog;)
218
219 /* Source */
220 int src_fd;
221 /* Output */
222 int dst_fd;
223 size_t mem_output_size_max; /* if non-zero, decompress to RAM instead of fd */
224 size_t mem_output_size;
225 char *mem_output_buf;
226
227 off_t bytes_out;
228 off_t bytes_in; /* used in unzip code only: needs to know packed size */
229 uint32_t crc32;
230 time_t mtime; /* gunzip code may set this on exit */
231} transformer_state_t;
232
233void init_transformer_state(transformer_state_t *xstate) FAST_FUNC;
234ssize_t transformer_write(transformer_state_t *xstate, const void *buf, size_t bufsize) FAST_FUNC;
235ssize_t xtransformer_write(transformer_state_t *xstate, const void *buf, size_t bufsize) FAST_FUNC;
236int check_signature16(transformer_state_t *xstate, unsigned magic16) FAST_FUNC;
237
238IF_DESKTOP(long long) int inflate_unzip(transformer_state_t *xstate) FAST_FUNC;
239IF_DESKTOP(long long) int unpack_Z_stream(transformer_state_t *xstate) FAST_FUNC;
240IF_DESKTOP(long long) int unpack_gz_stream(transformer_state_t *xstate) FAST_FUNC;
241IF_DESKTOP(long long) int unpack_bz2_stream(transformer_state_t *xstate) FAST_FUNC;
242IF_DESKTOP(long long) int unpack_lzma_stream(transformer_state_t *xstate) FAST_FUNC;
243IF_DESKTOP(long long) int unpack_xz_stream(transformer_state_t *xstate) FAST_FUNC;
244
245char* append_ext(char *filename, const char *expected_ext) FAST_FUNC;
246int bbunpack(char **argv,
247 IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(transformer_state_t *xstate),
248 char* FAST_FUNC (*make_new_name)(char *filename, const char *expected_ext),
249 const char *expected_ext
250) FAST_FUNC;
251
252void check_errors_in_children(int signo);
253#if BB_MMU
254void fork_transformer(int fd,
255 int signature_skipped,
256 IF_DESKTOP(long long) int FAST_FUNC (*transformer)(transformer_state_t *xstate)
257) FAST_FUNC;
258#define fork_transformer_with_sig(fd, transformer, transform_prog) fork_transformer((fd), 0, (transformer))
259#define fork_transformer_with_no_sig(fd, transformer) fork_transformer((fd), 1, (transformer))
260#else
261void fork_transformer(int fd, const char *transform_prog) FAST_FUNC;
262#define fork_transformer_with_sig(fd, transformer, transform_prog) fork_transformer((fd), (transform_prog))
263/* fork_transformer_with_no_sig() does not exist on NOMMU */
264#endif
265
266
267POP_SAVED_FUNCTION_VISIBILITY
268
269#endif
Note: See TracBrowser for help on using the repository browser.