From 7ca04f328e22fcbee4659d73f9a72dfdf1dd6a23 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Wed, 25 Sep 2002 02:47:48 +0000 Subject: New common unarchive code. --- include/libbb.h | 21 +++++----- include/unarchive.h | 109 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 88 insertions(+), 42 deletions(-) (limited to 'include') diff --git a/include/libbb.h b/include/libbb.h index 6ab942bd8..bd0d1e942 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -48,10 +48,6 @@ # include "sha1.h" #endif -/* Compatability with ANSI C */ -#ifndef inline -# define inline -#endif #if (__GNU_LIBRARY__ < 5) && (!defined __dietlibc__) /* libc5 doesn't define socklen_t */ @@ -74,6 +70,9 @@ char *strtok_r(char *s, const char *delim, char **ptrptr); #define BUF_SIZE 8192 #define EXPAND_ALLOC 1024 +static inline int is_decimal(int ch) { return ((ch >= '0') && (ch <= '9')); } +static inline int is_octal(int ch) { return ((ch >= '0') && (ch <= '7')); } + /* Macros for min/max. */ #ifndef MIN #define MIN(a,b) (((a)<(b))?(a):(b)) @@ -83,8 +82,6 @@ char *strtok_r(char *s, const char *delim, char **ptrptr); #define MAX(a,b) (((a)>(b))?(a):(b)) #endif - - extern void show_usage(void) __attribute__ ((noreturn)); extern void error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); extern void error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); @@ -228,10 +225,7 @@ extern long arith (const char *startbuf, int *errcode); int read_package_field(const char *package_buffer, char **field_name, char **field_value); char *fgets_str(FILE *file, const char *terminating_string); -extern int inflate(FILE *in, FILE *out); -extern int unzip(FILE *l_in_file, FILE *l_out_file); -extern void gz_close(int gunzip_pid); -extern FILE *gz_open(FILE *compressed_file, int *pid); +extern int inflate(int in, int out); extern struct hostent *xgethostbyname(const char *name); extern struct hostent *xgethostbyname2(const char *name, int af); @@ -335,4 +329,11 @@ extern char *pw_encrypt(const char *clear, const char *salt); extern struct spwd *pwd_to_spwd(const struct passwd *pw); extern int obscure(const char *old, const char *newval, const struct passwd *pwdp); +//extern int xopen(const char *pathname, int flags, mode_t mode); +extern int xopen(const char *pathname, int flags); +extern ssize_t xread(int fd, void *buf, size_t count); +extern ssize_t xread_all_eof(int fd, void *buf, size_t count); +extern void xread_all(int fd, void *buf, size_t count); +extern unsigned char xread_char(int fd); + #endif /* __LIBCONFIG_H__ */ diff --git a/include/unarchive.h b/include/unarchive.h index ffddc89f4..e564e9572 100644 --- a/include/unarchive.h +++ b/include/unarchive.h @@ -1,21 +1,19 @@ -#include /* for FILE */ -#include /* for off_t */ - -enum extract_functions_e { - extract_verbose_list = 1, - extract_list = 2, - extract_one_to_buffer = 4, - extract_to_stdout = 8, - extract_all_to_fs = 16, - extract_preserve_date = 32, - extract_data_tar_gz = 64, - extract_control_tar_gz = 128, - extract_unzip_only = 256, - extract_unconditional = 512, - extract_create_leading_dirs = 1024, - extract_quiet = 2048, - extract_exclude_list = 4096 -}; +#ifndef __UNARCHIVE_H__ +#define __UNARCHIVE_H__ + +#define ARCHIVE_PRESERVE_DATE 1 +#define ARCHIVE_CREATE_LEADING_DIRS 2 +#define ARCHIVE_EXTRACT_UNCONDITIONAL 4 +#define ARCHIVE_EXTRACT_QUIET 8 + +#include + +typedef struct gunzip_s { + unsigned short buffer_count; + unsigned char *buffer; + unsigned int crc; + unsigned int count; +} gunzip_t; typedef struct file_headers_s { char *name; @@ -26,23 +24,70 @@ typedef struct file_headers_s { mode_t mode; time_t mtime; dev_t device; - int (*extract_func) (FILE *, FILE *); } file_header_t; -file_header_t *get_header_ar(FILE * in_file); -file_header_t *get_header_cpio(FILE * src_stream); -file_header_t *get_header_tar(FILE * tar_stream); -file_header_t *get_header_zip(FILE * zip_stream); +typedef struct llist_s { + const char *data; + const struct llist_s *link; +} llist_t; + +typedef struct archive_handle_s { + /* define if the header and data compenent should processed */ + char (*filter)(const llist_t *, const llist_t *, const char *); + const llist_t *accept; + const llist_t *reject; + + /* Contains the processed header entry */ + file_header_t *file_header; + + /* process the header component, e.g. tar -t */ + void (*action_header)(const file_header_t *); + + /* process the data componenet, e.g. extract to filesystem */ + void (*action_data)(struct archive_handle_s *); + char (*action_data_subarchive)(struct archive_handle_s *); + + /* Contains the handle to a sub archive */ + struct archive_handle_s *sub_archive; + + /* The raw stream as read from disk or stdin */ + int src_fd; + + /* Count the number of bytes processed */ + off_t offset; + + /* Misc. stuff */ + unsigned char flags; + +} archive_handle_t; + +extern archive_handle_t *init_handle(void); + +extern char filter_accept_all(const llist_t *accept_list, const llist_t *reject_list, const char *key); +extern char filter_accept_list(const llist_t *accept_list, const llist_t *reject_list, const char *key); +extern char filter_accept_reject_list(const llist_t *accept_list, const llist_t *reject_list, const char *key); + +extern void unpack_ar_archive(archive_handle_t *ar_archive); + +extern void data_gunzip(archive_handle_t *archive_handle); +extern void data_skip(archive_handle_t *archive_handle); +extern void data_extract_all(archive_handle_t *archive_handle); +extern void data_extract_to_stdout(archive_handle_t *archive_handle); + +extern void header_skip(const file_header_t *file_header); +extern void header_list(const file_header_t *file_header); +extern void header_verbose_list(const file_header_t *file_header); -void seek_sub_file(FILE * src_stream, const int count); +extern void check_header_gzip(int src_fd); +extern void check_trailer_gzip(int src_fd); -extern off_t archive_offset; +extern char get_header_ar(archive_handle_t *archive_handle); +extern char get_header_tar(archive_handle_t *archive_handle); +extern char get_header_tar_gz(archive_handle_t *archive_handle); -char *unarchive(FILE * src_stream, FILE * out_stream, - file_header_t * (*get_headers) (FILE *), - const int extract_function, const char *prefix, - char **include_name, char **exclude_name); +//extern void seek_sub_file(int src_fd, unsigned int amount); +extern const unsigned short data_align(const int src_fd, const unsigned int offset, const unsigned short align_to); +extern const llist_t *add_to_list(const llist_t *old_head, const char *new_item); +extern int copy_file_chunk_fd(int src_fd, int dst_fd, unsigned long long chunksize); -char *deb_extract(const char *package_filename, FILE * out_stream, - const int extract_function, const char *prefix, - const char *filename); +#endif -- cgit v1.2.3