libunarchive: stop using static data in archivers - archive_handle_t can trivially provide space for that. rpm: code shrink tar: simplify autodetection of bz2/.gz
No binary (build failed)
—
(log yok)
| @@ -63,7 +63,7 @@ int ar_main(int argc, char **argv) | |
| archive_handle->action_data = data_extract_all; | |
| } | |
| if (opt & AR_OPT_PRESERVE_DATE) { | |
| - | archive_handle->flags |= ARCHIVE_PRESERVE_DATE; |
| + | archive_handle->ah_flags |= ARCHIVE_PRESERVE_DATE; |
| } | |
| if (opt & AR_OPT_VERBOSE) { | |
| archive_handle->action_header = header_verbose_list_ar; | |
| @@ -204,7 +204,7 @@ int cpio_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| archive_handle = init_handle(); | |
| archive_handle->src_fd = STDIN_FILENO; | |
| archive_handle->seek = seek_by_read; | |
| - | archive_handle->flags = ARCHIVE_EXTRACT_NEWER; |
| + | archive_handle->ah_flags = ARCHIVE_EXTRACT_NEWER; |
| #if ENABLE_FEATURE_CPIO_O | |
| opt = getopt32(argv, "ituvF:dmoH:", &cpio_filename, &cpio_fmt); | |
| @@ -241,8 +241,8 @@ int cpio_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| archive_handle->action_data = data_extract_all; | |
| } | |
| if (opt & CPIO_OPT_UNCONDITIONAL) { | |
| - | archive_handle->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| - | archive_handle->flags &= ~ARCHIVE_EXTRACT_NEWER; |
| + | archive_handle->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| + | archive_handle->ah_flags &= ~ARCHIVE_EXTRACT_NEWER; |
| } | |
| if (opt & CPIO_OPT_VERBOSE) { | |
| if (archive_handle->action_header == header_list) { | |
| @@ -256,10 +256,10 @@ int cpio_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| archive_handle->seek = seek_by_jump; | |
| } | |
| if (opt & CPIO_OPT_CREATE_LEADING_DIR) { | |
| - | archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS; |
| + | archive_handle->ah_flags |= ARCHIVE_CREATE_LEADING_DIRS; |
| } | |
| if (opt & CPIO_OPT_PRESERVE_MTIME) { | |
| - | archive_handle->flags |= ARCHIVE_PRESERVE_DATE; |
| + | archive_handle->ah_flags |= ARCHIVE_PRESERVE_DATE; |
| } | |
| while (*argv) { | |
| @@ -1532,7 +1532,7 @@ static void unpack_package(deb_file_t *deb_file) | |
| archive_handle->sub_archive->filter = filter_accept_list; | |
| archive_handle->sub_archive->action_data = data_extract_all_prefix; | |
| archive_handle->sub_archive->buffer = info_prefix; | |
| - | archive_handle->sub_archive->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| + | archive_handle->sub_archive->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| unpack_ar_archive(archive_handle); | |
| /* Run the preinst prior to extracting */ | |
| @@ -1543,7 +1543,7 @@ static void unpack_package(deb_file_t *deb_file) | |
| init_archive_deb_data(archive_handle); | |
| archive_handle->sub_archive->action_data = data_extract_all_prefix; | |
| archive_handle->sub_archive->buffer = (char*)"/"; /* huh? */ | |
| - | archive_handle->sub_archive->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| + | archive_handle->sub_archive->ah_flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
| unpack_ar_archive(archive_handle); | |
| /* Create the list file */ | |
| @@ -12,14 +12,14 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| int dst_fd; | |
| int res; | |
| - | if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) { |
| + | if (archive_handle->ah_flags & ARCHIVE_CREATE_LEADING_DIRS) { |
| char *name = xstrdup(file_header->name); | |
| bb_make_directory(dirname(name), -1, FILEUTILS_RECUR); | |
| free(name); | |
| } | |
| /* Check if the file already exists */ | |
| - | if (archive_handle->flags & ARCHIVE_EXTRACT_UNCONDITIONAL) { |
| + | if (archive_handle->ah_flags & ARCHIVE_EXTRACT_UNCONDITIONAL) { |
| /* Remove the entry if it exists */ | |
| if (((file_header->mode & S_IFMT) != S_IFDIR) | |
| && (unlink(file_header->name) == -1) | |
| @@ -29,7 +29,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| file_header->name); | |
| } | |
| } | |
| - | else if (archive_handle->flags & ARCHIVE_EXTRACT_NEWER) { |
| + | else if (archive_handle->ah_flags & ARCHIVE_EXTRACT_NEWER) { |
| /* Remove the existing entry if its older than the extracted entry */ | |
| struct stat statbuf; | |
| if (lstat(file_header->name, &statbuf) == -1) { | |
| @@ -38,7 +38,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| } | |
| } | |
| else if (statbuf.st_mtime <= file_header->mtime) { | |
| - | if (!(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { |
| + | if (!(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) { |
| bb_error_msg("%s not created: newer or " | |
| "same age file exists", file_header->name); | |
| } | |
| @@ -58,7 +58,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| ) { | |
| /* hard link */ | |
| res = link(file_header->link_target, file_header->name); | |
| - | if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) { |
| + | if ((res == -1) && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) { |
| bb_perror_msg("cannot create %slink " | |
| "from %s to %s", "hard", | |
| file_header->name, | |
| @@ -78,7 +78,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| case S_IFDIR: | |
| res = mkdir(file_header->name, file_header->mode); | |
| if ((res == -1) && (errno != EISDIR) | |
| - | && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) |
| + | && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET) |
| ) { | |
| bb_perror_msg("cannot make dir %s", file_header->name); | |
| } | |
| @@ -87,7 +87,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| /* Symlink */ | |
| res = symlink(file_header->link_target, file_header->name); | |
| if ((res == -1) | |
| - | && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) |
| + | && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET) |
| ) { | |
| bb_perror_msg("cannot create %slink " | |
| "from %s to %s", "sym", | |
| @@ -101,7 +101,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| case S_IFIFO: | |
| res = mknod(file_header->name, file_header->mode, file_header->device); | |
| if ((res == -1) | |
| - | && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET) |
| + | && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET) |
| ) { | |
| bb_perror_msg("cannot create node %s", file_header->name); | |
| } | |
| @@ -111,7 +111,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| } | |
| } | |
| - | if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_OWN)) { |
| + | if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_OWN)) { |
| #if ENABLE_FEATURE_TAR_UNAME_GNAME | |
| uid_t uid = file_header->uid; | |
| gid_t gid = file_header->gid; | |
| @@ -133,11 +133,11 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |
| /* uclibc has no lchmod, glibc is even stranger - | |
| * it has lchmod which seems to do nothing! | |
| * so we use chmod... */ | |
| - | if (!(archive_handle->flags & ARCHIVE_NOPRESERVE_PERM)) { |
| + | if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_PERM)) { |
| chmod(file_header->name, file_header->mode); | |
| } | |
| /* same for utime */ | |
| - | if (archive_handle->flags & ARCHIVE_PRESERVE_DATE) { |
| + | if (archive_handle->ah_flags & ARCHIVE_PRESERVE_DATE) { |
| struct utimbuf t; | |
| t.actime = t.modtime = file_header->mtime; | |
| utime(file_header->name, &t); | |
| @@ -110,7 +110,7 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle) | |
| archive_handle->action_header(typed); | |
| if (archive_handle->sub_archive) { | |
| while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS) | |
| - | /* repeat */; |
| + | continue; |
| } else { | |
| archive_handle->action_data(archive_handle); | |
| } | |
| @@ -19,9 +19,6 @@ typedef struct hardlinks_s { | |
| char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle) | |
| { | |
| - | static hardlinks_t *saved_hardlinks = NULL; |
| - | static hardlinks_t *saved_hardlinks_created = NULL; |
| - | |
| file_header_t *file_header = archive_handle->file_header; | |
| char cpio_header[110]; | |
| char dummy[16]; | |
| @@ -29,6 +26,14 @@ char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle) | |
| int major, minor, nlink, mode, inode; | |
| unsigned size, uid, gid, mtime; | |
| + | #define saved_hardlinks (*(hardlinks_t **)(&archive_handle->ah_priv[0])) |
| + | #define saved_hardlinks_created (*(hardlinks_t **)(&archive_handle->ah_priv[1])) |
| + | // if (!archive_handle->ah_priv_inited) { |
| + | // archive_handle->ah_priv_inited = 1; |
| + | // saved_hardlinks = NULL; |
| + | // saved_hardlinks_created = NULL; |
| + | // } |
| + | |
| /* There can be padding before archive header */ | |
| data_align(archive_handle, 4); | |
| @@ -14,26 +14,13 @@ | |
| #include "libbb.h" | |
| #include "unarchive.h" | |
| - | #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS |
| - | static char *longname; |
| - | static char *linkname; |
| - | #else |
| - | enum { |
| - | longname = 0, |
| - | linkname = 0, |
| - | }; |
| - | #endif |
| - | |
| /* NB: _DESTROYS_ str[len] character! */ | |
| static unsigned long long getOctal(char *str, int len) | |
| { | |
| unsigned long long v; | |
| - | /* Actually, tar header allows leading spaces also. |
| - | * Oh well, we will be liberal and skip this... |
| - | * The only downside probably is that we allow "-123" too :) |
| - | if (*str < '0' || *str > '7') |
| - | bb_error_msg_and_die("corrupted octal value in tar header"); |
| - | */ |
| + | /* NB: leading spaces are allowed. Using strtoull to handle that. |
| + | * The downside is that we accept e.g. "-123" too :) |
| + | */ |
| str[len] = '\0'; | |
| v = strtoull(str, &str, 8); | |
| if (*str && (!ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY || *str != ' ')) | |
| @@ -45,11 +32,6 @@ static unsigned long long getOctal(char *str, int len) | |
| void BUG_tar_header_size(void); | |
| char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| { | |
| - | static smallint end; |
| - | #if ENABLE_FEATURE_TAR_AUTODETECT |
| - | static smallint not_first; |
| - | #endif |
| - | |
| file_header_t *file_header = archive_handle->file_header; | |
| struct { | |
| /* ustar header, Posix 1003.1 */ | |
| @@ -65,7 +47,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| /* POSIX: "ustar" NUL "00" */ | |
| /* GNU tar: "ustar " NUL */ | |
| /* Normally it's defined as magic[6] followed by | |
| - | * version[2], but we put them together to save code. |
| + | * version[2], but we put them together to simplify code |
| */ | |
| char magic[8]; /* 257-264 */ | |
| char uname[32]; /* 265-296 */ | |
| @@ -82,6 +64,22 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| #endif | |
| int parse_names; | |
| + | /* Our "private data" */ |
| + | #define p_end (*(smallint *)(&archive_handle->ah_priv[0])) |
| + | #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS |
| + | #define p_longname (*(char* *)(&archive_handle->ah_priv[1])) |
| + | #define p_linkname (*(char* *)(&archive_handle->ah_priv[2])) |
| + | #else |
| + | #define p_longname 0 |
| + | #define p_linkname 0 |
| + | #endif |
| + | // if (!archive_handle->ah_priv_inited) { |
| + | // archive_handle->ah_priv_inited = 1; |
| + | // p_end = 0; |
| + | // USE_FEATURE_TAR_GNU_EXTENSIONS(p_longname = NULL;) |
| + | // USE_FEATURE_TAR_GNU_EXTENSIONS(p_linkname = NULL;) |
| + | // } |
| + | |
| if (sizeof(tar) != 512) | |
| BUG_tar_header_size(); | |
| @@ -95,7 +93,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| #if ENABLE_DESKTOP | |
| i = full_read(archive_handle->src_fd, &tar, 512); | |
| - | /* if GNU tar sees EOF in above read, it says: |
| + | /* If GNU tar sees EOF in above read, it says: |
| * "tar: A lone zero block at N", where N = kilobyte | |
| * where EOF was met (not EOF block, actual EOF!), | |
| * and tar will exit with error code 0. | |
| @@ -113,18 +111,18 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| /* If there is no filename its an empty header */ | |
| if (tar.name[0] == 0 && tar.prefix[0] == 0) { | |
| - | if (end) { |
| - | /* This is the second consecutive empty header! End of archive! |
| + | if (p_end) { |
| + | /* Second consecutive empty header - end of archive. |
| * Read until the end to empty the pipe from gz or bz2 | |
| */ | |
| while (full_read(archive_handle->src_fd, &tar, 512) == 512) | |
| continue; | |
| return EXIT_FAILURE; | |
| } | |
| - | end = 1; |
| + | p_end = 1; |
| return EXIT_SUCCESS; | |
| } | |
| - | end = 0; |
| + | p_end = 0; |
| /* Check header has valid magic, "ustar" is for the proper tar, | |
| * five NULs are for the old tar format */ | |
| @@ -136,12 +134,10 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| char FAST_FUNC (*get_header_ptr)(archive_handle_t *); | |
| /* tar gz/bz autodetect: check for gz/bz2 magic. | |
| - | * If it is the very first block, and we see the magic, |
| + | * If we see the magic, and it is the very first block, |
| * we can switch to get_header_tar_gz/bz2/lzma(). | |
| * Needs seekable fd. I wish recv(MSG_PEEK) works | |
| * on any fd... */ | |
| - | if (not_first) |
| - | goto err; |
| #if ENABLE_FEATURE_TAR_GZIP | |
| if (tar.name[0] == 0x1f && tar.name[1] == (char)0x8b) { /* gzip */ | |
| get_header_ptr = get_header_tar_gz; | |
| @@ -155,6 +151,9 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| } else | |
| #endif | |
| goto err; | |
| + | /* Two different causes for lseek() != 0: |
| + | * unseekable fd (would like to support that too, but...), |
| + | * or not first block (false positive, it's not .gz/.bz2!) */ |
| if (lseek(archive_handle->src_fd, -512, SEEK_CUR) != 0) | |
| goto err; | |
| while (get_header_ptr(archive_handle) == EXIT_SUCCESS) | |
| @@ -165,10 +164,6 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| bb_error_msg_and_die("invalid tar magic"); | |
| } | |
| - | #if ENABLE_FEATURE_TAR_AUTODETECT |
| - | not_first = 1; |
| - | #endif |
| - | |
| /* Do checksum on headers. | |
| * POSIX says that checksum is done on unsigned bytes, but | |
| * Sun and HP-UX gets it wrong... more details in | |
| @@ -219,7 +214,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| tar.prefix[0] = t; | |
| } | |
| file_header->link_target = NULL; | |
| - | if (!linkname && parse_names && tar.linkname[0]) { |
| + | if (!p_linkname && parse_names && tar.linkname[0]) { |
| file_header->link_target = xstrndup(tar.linkname, sizeof(tar.linkname)); | |
| /* FIXME: what if we have non-link object with link_target? */ | |
| /* Will link_target be free()ed? */ | |
| @@ -236,7 +231,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| file_header->mode = 07777 & GET_OCTAL(tar.mode); | |
| file_header->name = NULL; | |
| - | if (!longname && parse_names) { |
| + | if (!p_longname && parse_names) { |
| /* we trash mode[0] here, it's ok */ | |
| //tar.name[sizeof(tar.name)] = '\0'; - gcc 4.3.0 would complain | |
| tar.mode[0] = '\0'; | |
| @@ -284,20 +279,20 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS | |
| case 'L': | |
| /* free: paranoia: tar with several consecutive longnames */ | |
| - | free(longname); |
| + | free(p_longname); |
| /* For paranoia reasons we allocate extra NUL char */ | |
| - | longname = xzalloc(file_header->size + 1); |
| + | p_longname = xzalloc(file_header->size + 1); |
| /* We read ASCIZ string, including NUL */ | |
| - | xread(archive_handle->src_fd, longname, file_header->size); |
| + | xread(archive_handle->src_fd, p_longname, file_header->size); |
| archive_handle->offset += file_header->size; | |
| /* return get_header_tar(archive_handle); */ | |
| /* gcc 4.1.1 didn't optimize it into jump */ | |
| /* so we will do it ourself, this also saves stack */ | |
| goto again; | |
| case 'K': | |
| - | free(linkname); |
| - | linkname = xzalloc(file_header->size + 1); |
| - | xread(archive_handle->src_fd, linkname, file_header->size); |
| + | free(p_linkname); |
| + | p_linkname = xzalloc(file_header->size + 1); |
| + | xread(archive_handle->src_fd, p_linkname, file_header->size); |
| archive_handle->offset += file_header->size; | |
| /* return get_header_tar(archive_handle); */ | |
| goto again; | |
| @@ -324,13 +319,13 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| } | |
| #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS | |
| - | if (longname) { |
| - | file_header->name = longname; |
| - | longname = NULL; |
| + | if (p_longname) { |
| + | file_header->name = p_longname; |
| + | p_longname = NULL; |
| } | |
| - | if (linkname) { |
| - | file_header->link_target = linkname; |
| - | linkname = NULL; |
| + | if (p_linkname) { |
| + | file_header->link_target = p_linkname; |
| + | p_linkname = NULL; |
| } | |
| #endif | |
| if (!strncmp(file_header->name, "/../"+1, 3) | |
| @@ -349,7 +344,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle) | |
| /* Note that we kill the '/' only after action_header() */ | |
| /* (like GNU tar 1.15.1: verbose mode outputs "dir/dir/") */ | |
| if (cp) *cp = '\0'; | |
| - | archive_handle->flags |= ARCHIVE_EXTRACT_QUIET; |
| + | archive_handle->ah_flags |= ARCHIVE_EXTRACT_QUIET; |
| archive_handle->action_data(archive_handle); | |
| llist_add_to(&(archive_handle->passed), file_header->name); | |
| } else { | |
| @@ -9,7 +9,7 @@ | |
| #include "libbb.h" | |
| #include "unarchive.h" | |
| - | char FAST_FUNC get_header_tar_lzma(archive_handle_t * archive_handle) |
| + | char FAST_FUNC get_header_tar_lzma(archive_handle_t *archive_handle) |
| { | |
| /* Can't lseek over pipes */ | |
| archive_handle->seek = seek_by_read; | |
| @@ -202,10 +202,9 @@ static void extract_cpio_gz(int fd) | |
| archive_handle->seek = seek_by_read; | |
| //archive_handle->action_header = header_list; | |
| archive_handle->action_data = data_extract_all; | |
| - | archive_handle->flags |= ARCHIVE_PRESERVE_DATE; |
| - | archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS; |
| + | archive_handle->ah_flags = ARCHIVE_PRESERVE_DATE | ARCHIVE_CREATE_LEADING_DIRS; |
| archive_handle->src_fd = fd; | |
| - | archive_handle->offset = 0; |
| + | /*archive_handle->offset = 0; - init_handle() did it */ |
| xread(archive_handle->src_fd, &magic, 2); | |
| #if BB_MMU | |
| @@ -814,9 +814,9 @@ int tar_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| /* Initialise default values */ | |
| tar_handle = init_handle(); | |
| - | tar_handle->flags = ARCHIVE_CREATE_LEADING_DIRS |
| - | | ARCHIVE_PRESERVE_DATE |
| - | | ARCHIVE_EXTRACT_UNCONDITIONAL; |
| + | tar_handle->ah_flags = ARCHIVE_CREATE_LEADING_DIRS |
| + | | ARCHIVE_PRESERVE_DATE |
| + | | ARCHIVE_EXTRACT_UNCONDITIONAL; |
| /* Prepend '-' to the first argument if required */ | |
| opt_complementary = "--:" // first arg is options | |
| @@ -862,13 +862,13 @@ int tar_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| tar_handle->action_data = data_extract_to_stdout; | |
| if (opt & OPT_KEEP_OLD) | |
| - | tar_handle->flags &= ~ARCHIVE_EXTRACT_UNCONDITIONAL; |
| + | tar_handle->ah_flags &= ~ARCHIVE_EXTRACT_UNCONDITIONAL; |
| if (opt & OPT_NOPRESERVE_OWN) | |
| - | tar_handle->flags |= ARCHIVE_NOPRESERVE_OWN; |
| + | tar_handle->ah_flags |= ARCHIVE_NOPRESERVE_OWN; |
| if (opt & OPT_NOPRESERVE_PERM) | |
| - | tar_handle->flags |= ARCHIVE_NOPRESERVE_PERM; |
| + | tar_handle->ah_flags |= ARCHIVE_NOPRESERVE_PERM; |
| if (opt & OPT_GZIP) | |
| get_header_ptr = get_header_tar_gz; | |
| @@ -30,7 +30,7 @@ typedef struct file_header_t { | |
| } file_header_t; | |
| typedef struct archive_handle_t { | |
| - | /* define if the header and data component should be processed */ |
| + | /* Define if the header and data component should be processed */ |
| char FAST_FUNC (*filter)(struct archive_handle_t *); | |
| llist_t *accept; | |
| /* List of files that have been rejected */ | |
| @@ -41,10 +41,10 @@ typedef struct archive_handle_t { | |
| /* Contains the processed header entry */ | |
| file_header_t *file_header; | |
| - | /* process the header component, e.g. tar -t */ |
| + | /* Process the header component, e.g. tar -t */ |
| void FAST_FUNC (*action_header)(const file_header_t *); | |
| - | /* process the data component, e.g. extract to filesystem */ |
| + | /* Process the data component, e.g. extract to filesystem */ |
| void FAST_FUNC (*action_data)(struct archive_handle_t *); | |
| /* How to process any sub archive, e.g. get_header_tar_gz */ | |
| @@ -66,7 +66,11 @@ typedef struct archive_handle_t { | |
| char *buffer; | |
| /* Flags and misc. stuff */ | |
| - | unsigned char flags; |
| + | unsigned char ah_flags; |
| + | |
| + | /* "Private" storage for archivers */ |
| + | // unsigned char ah_priv_inited; |
| + | void *ah_priv[8]; |
| } archive_handle_t; | |