1
2#ifndef UNARCHIVE_H
3#define UNARCHIVE_H 1
4
5PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
6
7#define ARCHIVE_PRESERVE_DATE 1
8#define ARCHIVE_CREATE_LEADING_DIRS 2
9#define ARCHIVE_EXTRACT_UNCONDITIONAL 4
10#define ARCHIVE_EXTRACT_QUIET 8
11#define ARCHIVE_EXTRACT_NEWER 16
12#define ARCHIVE_NOPRESERVE_OWN 32
13#define ARCHIVE_NOPRESERVE_PERM 64
14#define ARCHIVE_NUMERIC_OWNER 128
15
16typedef struct file_header_t {
17 char *name;
18 char *link_target;
19#if ENABLE_FEATURE_TAR_UNAME_GNAME
20 char *uname;
21 char *gname;
22#endif
23 off_t size;
24 uid_t uid;
25 gid_t gid;
26 mode_t mode;
27 time_t mtime;
28 dev_t device;
29} file_header_t;
30
31typedef struct archive_handle_t {
32
33 char FAST_FUNC (*filter)(struct archive_handle_t *);
34 llist_t *accept;
35
36 llist_t *reject;
37
38 llist_t *passed;
39
40
41 file_header_t *file_header;
42
43
44 void FAST_FUNC (*action_header)(const file_header_t *);
45
46
47 void FAST_FUNC (*action_data)(struct archive_handle_t *);
48
49#if ENABLE_DPKG || ENABLE_DPKG_DEB
50
51
52 char FAST_FUNC (*action_data_subarchive)(struct archive_handle_t *);
53
54 struct archive_handle_t *sub_archive;
55#endif
56
57
58 int src_fd;
59
60
61 off_t offset;
62
63
64 void FAST_FUNC (*seek)(const struct archive_handle_t *archive_handle, const unsigned amount);
65
66
67 char *buffer;
68
69
70 unsigned char ah_flags;
71
72
73
74 void *ah_priv[8];
75
76} archive_handle_t;
77
78
79
80
81typedef struct unpack_info_t {
82 time_t mtime;
83} unpack_info_t;
84
85extern archive_handle_t *init_handle(void) FAST_FUNC;
86
87extern char filter_accept_all(archive_handle_t *archive_handle) FAST_FUNC;
88extern char filter_accept_list(archive_handle_t *archive_handle) FAST_FUNC;
89extern char filter_accept_list_reassign(archive_handle_t *archive_handle) FAST_FUNC;
90extern char filter_accept_reject_list(archive_handle_t *archive_handle) FAST_FUNC;
91
92extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
93
94extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
95extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
96extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
97extern void data_extract_to_buffer(archive_handle_t *archive_handle) FAST_FUNC;
98
99extern void header_skip(const file_header_t *file_header) FAST_FUNC;
100extern void header_list(const file_header_t *file_header) FAST_FUNC;
101extern void header_verbose_list(const file_header_t *file_header) FAST_FUNC;
102
103extern char get_header_ar(archive_handle_t *archive_handle) FAST_FUNC;
104extern char get_header_cpio(archive_handle_t *archive_handle) FAST_FUNC;
105extern char get_header_tar(archive_handle_t *archive_handle) FAST_FUNC;
106extern char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC;
107extern char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC;
108extern char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC;
109
110extern void seek_by_jump(const archive_handle_t *archive_handle, unsigned amount) FAST_FUNC;
111extern void seek_by_read(const archive_handle_t *archive_handle, unsigned amount) FAST_FUNC;
112
113extern void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC;
114extern const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC;
115extern const llist_t *find_list_entry2(const llist_t *list, const char *filename) FAST_FUNC;
116
117
118typedef struct bunzip_data bunzip_data;
119int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len) FAST_FUNC;
120int read_bunzip(bunzip_data *bd, char *outbuf, int len) FAST_FUNC;
121void dealloc_bunzip(bunzip_data *bd) FAST_FUNC;
122
123typedef struct inflate_unzip_result {
124 off_t bytes_out;
125 uint32_t crc;
126} inflate_unzip_result;
127
128IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC;
129
130IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC;
131
132IF_DESKTOP(long long) int unpack_bz2_stream(int src_fd, int dst_fd) FAST_FUNC;
133IF_DESKTOP(long long) int unpack_gz_stream(int src_fd, int dst_fd) FAST_FUNC;
134IF_DESKTOP(long long) int unpack_gz_stream_with_info(int src_fd, int dst_fd, unpack_info_t *info) FAST_FUNC;
135IF_DESKTOP(long long) int unpack_Z_stream(int fd_in, int fd_out) FAST_FUNC;
136
137IF_DESKTOP(long long) int unpack_bz2_stream_prime(int src_fd, int dst_fd) FAST_FUNC;
138
139int bbunpack(char **argv,
140 char* (*make_new_name)(char *filename),
141 IF_DESKTOP(long long) int (*unpacker)(unpack_info_t *info)) FAST_FUNC;
142
143#if BB_MMU
144void open_transformer(int fd,
145 IF_DESKTOP(long long) int FAST_FUNC (*transformer)(int src_fd, int dst_fd)) FAST_FUNC;
146#define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transformer)
147#else
148void open_transformer(int src_fd, const char *transform_prog) FAST_FUNC;
149#define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transform_prog)
150#endif
151
152POP_SAVED_FUNCTION_VISIBILITY
153
154#endif
155