diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-09-25 02:47:48 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-09-25 02:47:48 +0000 |
commit | 7ca04f328e22fcbee4659d73f9a72dfdf1dd6a23 (patch) | |
tree | f38c7ef4317eea28c6abdb0adbbb286fe041711e /include | |
parent | ecfa290cfd4953598e6d91989bd66ac16e135f84 (diff) | |
download | busybox-7ca04f328e22fcbee4659d73f9a72dfdf1dd6a23.tar.gz |
New common unarchive code.
Diffstat (limited to 'include')
-rw-r--r-- | include/libbb.h | 21 | ||||
-rw-r--r-- | include/unarchive.h | 109 |
2 files changed, 88 insertions, 42 deletions
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 <stdio.h> /* for FILE */ -#include <unistd.h> /* 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 <sys/types.h> + +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 |