unarchive.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /* vi: set sw=4 ts=4: */
  2. #ifndef UNARCHIVE_H
  3. #define UNARCHIVE_H 1
  4. PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
  5. typedef struct file_header_t {
  6. char *name;
  7. char *link_target;
  8. #if ENABLE_FEATURE_TAR_UNAME_GNAME
  9. char *tar__uname;
  10. char *tar__gname;
  11. #endif
  12. off_t size;
  13. uid_t uid;
  14. gid_t gid;
  15. mode_t mode;
  16. time_t mtime;
  17. dev_t device;
  18. } file_header_t;
  19. struct hardlinks_t;
  20. typedef struct archive_handle_t {
  21. /* Flags. 1st since it is most used member */
  22. unsigned ah_flags;
  23. /* The raw stream as read from disk or stdin */
  24. int src_fd;
  25. /* Define if the header and data component should be processed */
  26. char FAST_FUNC (*filter)(struct archive_handle_t *);
  27. /* List of files that have been accepted */
  28. llist_t *accept;
  29. /* List of files that have been rejected */
  30. llist_t *reject;
  31. /* List of files that have successfully been worked on */
  32. llist_t *passed;
  33. /* Currently processed file's header */
  34. file_header_t *file_header;
  35. /* Process the header component, e.g. tar -t */
  36. void FAST_FUNC (*action_header)(const file_header_t *);
  37. /* Process the data component, e.g. extract to filesystem */
  38. void FAST_FUNC (*action_data)(struct archive_handle_t *);
  39. /* Function that skips data */
  40. void FAST_FUNC (*seek)(int fd, off_t amount);
  41. /* Count processed bytes */
  42. off_t offset;
  43. /* Archiver specific. Can make it a union if it ever gets big */
  44. #if ENABLE_TAR || ENABLE_DPKG || ENABLE_DPKG_DEB
  45. smallint tar__end;
  46. # if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
  47. char* tar__longname;
  48. char* tar__linkname;
  49. # endif
  50. # if ENABLE_FEATURE_TAR_SELINUX
  51. char* tar__global_sctx;
  52. char* tar__next_file_sctx;
  53. # endif
  54. #endif
  55. #if ENABLE_CPIO || ENABLE_RPM2CPIO || ENABLE_RPM
  56. uoff_t cpio__blocks;
  57. struct hardlinks_t *cpio__hardlinks_to_create;
  58. struct hardlinks_t *cpio__created_hardlinks;
  59. #endif
  60. #if ENABLE_DPKG || ENABLE_DPKG_DEB
  61. /* Temporary storage */
  62. char *dpkg__buffer;
  63. /* How to process any sub archive, e.g. get_header_tar_gz */
  64. char FAST_FUNC (*dpkg__action_data_subarchive)(struct archive_handle_t *);
  65. /* Contains the handle to a sub archive */
  66. struct archive_handle_t *dpkg__sub_archive;
  67. #endif
  68. #if ENABLE_FEATURE_AR_CREATE
  69. const char *ar__name;
  70. struct archive_handle_t *ar__out;
  71. #endif
  72. } archive_handle_t;
  73. /* bits in ah_flags */
  74. #define ARCHIVE_RESTORE_DATE (1 << 0)
  75. #define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
  76. #define ARCHIVE_UNLINK_OLD (1 << 2)
  77. #define ARCHIVE_EXTRACT_QUIET (1 << 3)
  78. #define ARCHIVE_EXTRACT_NEWER (1 << 4)
  79. #define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
  80. #define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
  81. #define ARCHIVE_NUMERIC_OWNER (1 << 7)
  82. #define ARCHIVE_O_TRUNC (1 << 8)
  83. /* Info struct unpackers can fill out to inform users of thing like
  84. * timestamps of unpacked files */
  85. typedef struct unpack_info_t {
  86. time_t mtime;
  87. } unpack_info_t;
  88. extern archive_handle_t *init_handle(void) FAST_FUNC;
  89. extern char filter_accept_all(archive_handle_t *archive_handle) FAST_FUNC;
  90. extern char filter_accept_list(archive_handle_t *archive_handle) FAST_FUNC;
  91. extern char filter_accept_list_reassign(archive_handle_t *archive_handle) FAST_FUNC;
  92. extern char filter_accept_reject_list(archive_handle_t *archive_handle) FAST_FUNC;
  93. extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
  94. extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
  95. extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
  96. extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
  97. extern void header_skip(const file_header_t *file_header) FAST_FUNC;
  98. extern void header_list(const file_header_t *file_header) FAST_FUNC;
  99. extern void header_verbose_list(const file_header_t *file_header) FAST_FUNC;
  100. extern char get_header_ar(archive_handle_t *archive_handle) FAST_FUNC;
  101. extern char get_header_cpio(archive_handle_t *archive_handle) FAST_FUNC;
  102. extern char get_header_tar(archive_handle_t *archive_handle) FAST_FUNC;
  103. extern char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC;
  104. extern char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC;
  105. extern char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC;
  106. extern void seek_by_jump(int fd, off_t amount) FAST_FUNC;
  107. extern void seek_by_read(int fd, off_t amount) FAST_FUNC;
  108. extern void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC;
  109. extern const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC;
  110. extern const llist_t *find_list_entry2(const llist_t *list, const char *filename) FAST_FUNC;
  111. /* A bit of bunzip2 internals are exposed for compressed help support: */
  112. typedef struct bunzip_data bunzip_data;
  113. int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len) FAST_FUNC;
  114. int read_bunzip(bunzip_data *bd, char *outbuf, int len) FAST_FUNC;
  115. void dealloc_bunzip(bunzip_data *bd) FAST_FUNC;
  116. typedef struct inflate_unzip_result {
  117. off_t bytes_out;
  118. uint32_t crc;
  119. } inflate_unzip_result;
  120. IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC;
  121. /* lzma unpacker takes .lzma stream from offset 0 */
  122. IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC;
  123. /* the rest wants 2 first bytes already skipped by the caller */
  124. IF_DESKTOP(long long) int unpack_bz2_stream(int src_fd, int dst_fd) FAST_FUNC;
  125. IF_DESKTOP(long long) int unpack_gz_stream(int src_fd, int dst_fd) FAST_FUNC;
  126. IF_DESKTOP(long long) int unpack_gz_stream_with_info(int src_fd, int dst_fd, unpack_info_t *info) FAST_FUNC;
  127. IF_DESKTOP(long long) int unpack_Z_stream(int fd_in, int fd_out) FAST_FUNC;
  128. /* wrapper which checks first two bytes to be "BZ" */
  129. IF_DESKTOP(long long) int unpack_bz2_stream_prime(int src_fd, int dst_fd) FAST_FUNC;
  130. int bbunpack(char **argv,
  131. char* (*make_new_name)(char *filename),
  132. IF_DESKTOP(long long) int (*unpacker)(unpack_info_t *info)) FAST_FUNC;
  133. #if BB_MMU
  134. void open_transformer(int fd,
  135. IF_DESKTOP(long long) int FAST_FUNC (*transformer)(int src_fd, int dst_fd)) FAST_FUNC;
  136. #define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transformer)
  137. #else
  138. void open_transformer(int src_fd, const char *transform_prog) FAST_FUNC;
  139. #define open_transformer(fd, transformer, transform_prog) open_transformer(fd, transform_prog)
  140. #endif
  141. POP_SAVED_FUNCTION_VISIBILITY
  142. #endif