busybox/include/unarchive.h
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2#ifndef __UNARCHIVE_H__
   3#define __UNARCHIVE_H__
   4
   5#if __GNUC_PREREQ(4,1)
   6# pragma GCC visibility push(hidden)
   7#endif
   8
   9#define ARCHIVE_PRESERVE_DATE           1
  10#define ARCHIVE_CREATE_LEADING_DIRS     2
  11#define ARCHIVE_EXTRACT_UNCONDITIONAL   4
  12#define ARCHIVE_EXTRACT_QUIET           8
  13#define ARCHIVE_EXTRACT_NEWER           16
  14#define ARCHIVE_NOPRESERVE_OWN          32
  15#define ARCHIVE_NOPRESERVE_PERM         64
  16
  17typedef struct file_header_t {
  18        char *name;
  19        char *link_target;
  20#if ENABLE_FEATURE_TAR_UNAME_GNAME
  21        char *uname;
  22        char *gname;
  23#endif
  24        off_t size;
  25        uid_t uid;
  26        gid_t gid;
  27        mode_t mode;
  28        time_t mtime;
  29        dev_t device;
  30} file_header_t;
  31
  32typedef struct archive_handle_t {
  33        /* Define if the header and data component should be processed */
  34        char FAST_FUNC (*filter)(struct archive_handle_t *);
  35        llist_t *accept;
  36        /* List of files that have been rejected */
  37        llist_t *reject;
  38        /* List of files that have successfully been worked on */
  39        llist_t *passed;
  40
  41        /* Contains the processed header entry */
  42        file_header_t *file_header;
  43
  44        /* Process the header component, e.g. tar -t */
  45        void FAST_FUNC (*action_header)(const file_header_t *);
  46
  47        /* Process the data component, e.g. extract to filesystem */
  48        void FAST_FUNC (*action_data)(struct archive_handle_t *);
  49
  50#if ENABLE_DPKG || ENABLE_DPKG_DEB
  51        /* "subarchive" is used only by dpkg[-deb] applets */
  52        /* How to process any sub archive, e.g. get_header_tar_gz */
  53        char FAST_FUNC (*action_data_subarchive)(struct archive_handle_t *);
  54        /* Contains the handle to a sub archive */
  55        struct archive_handle_t *sub_archive;
  56#endif
  57
  58        /* The raw stream as read from disk or stdin */
  59        int src_fd;
  60
  61        /* Count the number of bytes processed */
  62        off_t offset;
  63
  64        /* Function that skips data: read_by_char or read_by_skip */
  65        void FAST_FUNC (*seek)(const struct archive_handle_t *archive_handle, const unsigned amount);
  66
  67        /* Temporary storage */
  68        char *buffer;
  69
  70        /* Flags and misc. stuff */
  71        unsigned char ah_flags;
  72
  73        /* "Private" storage for archivers */
  74//      unsigned char ah_priv_inited;
  75        void *ah_priv[8];
  76
  77} archive_handle_t;
  78
  79
  80/* Info struct unpackers can fill out to inform users of thing like
  81 * timestamps of unpacked files */
  82typedef struct unpack_info_t {
  83        time_t mtime;
  84} unpack_info_t;
  85
  86extern archive_handle_t *init_handle(void) FAST_FUNC;
  87
  88extern char filter_accept_all(archive_handle_t *archive_handle) FAST_FUNC;
  89extern char filter_accept_list(archive_handle_t *archive_handle) FAST_FUNC;
  90extern char filter_accept_list_reassign(archive_handle_t *archive_handle) FAST_FUNC;
  91extern char filter_accept_reject_list(archive_handle_t *archive_handle) FAST_FUNC;
  92
  93extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
  94
  95extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
  96extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
  97extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
  98extern void data_extract_to_buffer(archive_handle_t *archive_handle) FAST_FUNC;
  99
 100extern void header_skip(const file_header_t *file_header) FAST_FUNC;
 101extern void header_list(const file_header_t *file_header) FAST_FUNC;
 102extern void header_verbose_list(const file_header_t *file_header) FAST_FUNC;
 103
 104extern char get_header_ar(archive_handle_t *archive_handle) FAST_FUNC;
 105extern char get_header_cpio(archive_handle_t *archive_handle) FAST_FUNC;
 106extern char get_header_tar(archive_handle_t *archive_handle) FAST_FUNC;
 107extern char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC;
 108extern char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC;
 109extern char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC;
 110
 111extern void seek_by_jump(const archive_handle_t *archive_handle, unsigned amount) FAST_FUNC;
 112extern void seek_by_read(const archive_handle_t *archive_handle, unsigned amount) FAST_FUNC;
 113
 114extern void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC;
 115extern const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC;
 116extern const llist_t *find_list_entry2(const llist_t *list, const char *filename) FAST_FUNC;
 117
 118/* A bit of bunzip2 internals are exposed for compressed help support: */
 119typedef struct bunzip_data bunzip_data;
 120int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len) FAST_FUNC;
 121int read_bunzip(bunzip_data *bd, char *outbuf, int len) FAST_FUNC;
 122void dealloc_bunzip(bunzip_data *bd) FAST_FUNC;
 123
 124typedef struct inflate_unzip_result {
 125        off_t bytes_out;
 126        uint32_t crc;
 127} inflate_unzip_result;
 128
 129USE_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC;
 130/* lzma unpacker takes .lzma stream from offset 0 */
 131USE_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC;
 132/* the rest wants 2 first bytes already skipped by the caller */
 133USE_DESKTOP(long long) int unpack_bz2_stream(int src_fd, int dst_fd) FAST_FUNC;
 134USE_DESKTOP(long long) int unpack_gz_stream(int src_fd, int dst_fd) FAST_FUNC;
 135USE_DESKTOP(long long) int unpack_gz_stream_with_info(int src_fd, int dst_fd, unpack_info_t *info) FAST_FUNC;
 136USE_DESKTOP(long long) int unpack_Z_stream(int fd_in, int fd_out) FAST_FUNC;
 137/* wrapper which checks first two bytes to be "BZ" */
 138USE_DESKTOP(long long) int unpack_bz2_stream_prime(int src_fd, int dst_fd) FAST_FUNC;
 139
 140int bbunpack(char **argv,
 141             char* (*make_new_name)(char *filename),
 142             USE_DESKTOP(long long) int (*unpacker)(unpack_info_t *info)) FAST_FUNC;
 143
 144#if BB_MMU
 145void open_transformer(int fd,
 146        USE_DESKTOP(long long) int FAST_FUNC (*transformer)(int src_fd, int dst_fd)) FAST_FUNC;
 147#define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transformer)
 148#else
 149void open_transformer(int src_fd, const char *transform_prog) FAST_FUNC;
 150#define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transform_prog)
 151#endif
 152
 153#if __GNUC_PREREQ(4,1)
 154# pragma GCC visibility pop
 155#endif
 156
 157#endif
 158