libunarchive: stop using static data in archivers - archive_handle_t
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 28 Jun 2008 05:04:09 +0000 (05:04 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 28 Jun 2008 05:04:09 +0000 (05:04 -0000)
 can trivially provide space for that.
rpm: code shrink
tar: simplify autodetection of bz2/.gz

function                                             old     new   delta
static.not_first                                       1       -      -1
static.end                                             1       -      -1
bb_makedev                                            51      49      -2
static.saved_hardlinks_created                         4       -      -4
static.saved_hardlinks                                 4       -      -4
longname                                               4       -      -4
linkname                                               4       -      -4
hash_file                                            251     247      -4
get_header_tar                                      1528    1521      -7
rpm_main                                            1711    1697     -14
get_header_cpio                                      965     944     -21
------------------------------------------------------------------------------
(add/remove: 0/6 grow/shrink: 0/5 up/down: 0/-66)             Total: -66 bytes
   text    data     bss     dec     hex filename
 804926     611    6868  812405   c6575 busybox_old
 804878     611    6852  812341   c6535 busybox_unstripped

archival/ar.c
archival/cpio.c
archival/dpkg.c
archival/libunarchive/data_extract_all.c
archival/libunarchive/get_header_ar.c
archival/libunarchive/get_header_cpio.c
archival/libunarchive/get_header_tar.c
archival/libunarchive/get_header_tar_lzma.c
archival/rpm.c
archival/tar.c
include/unarchive.h

index ddc12095cf90708fc094c2d9666853d37f0b2914..d49329ce91c75bfd17f53f3951be945f1b45a022 100644 (file)
@@ -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;
index 0147d0e965e069600ad27f2f849d905d40799ec4..a10bfa85f0a26b4bf2d7b336647d95aef0ce77be 100644 (file)
@@ -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) {
index 34e5f80e4f4def790e3f49fe10436fad695f7f31..22e26f56647a28b9e8b0688cbc26944914b588b1 100644 (file)
@@ -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 */
index 1b48767994f495dfc7d4da5f66ff7e3445b2c350..a67587d72e6ef37c96c0c09ed3d366192df5f703 100644 (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);
index 05222992d3d088b056b09a0d07e95242f7df2c33..59fd34c732965a03af23e040602bc5ee80db0f00 100644 (file)
@@ -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);
                }
index 4ed18c68f3eac7009e16fa192afd9518530d062a..96be4b5ac82685e5294824dcfd1c39cad4b3aef1 100644 (file)
@@ -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);
 
index a0a53c908182493bc289169b106bcb633ab85218..69362f1cc6ccadcc6507d37c7d17ed65371aa069 100644 (file)
 #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 {
index 4ae125f4ae72b4644a2ae013ae406b5af766c2a1..730c1b1bbe8f06200baaa5e8eb4b5e2d7f873264 100644 (file)
@@ -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;
index 3d03dbcceddb3ade05c075b5d46e72505a82b001..c4bcd605dd942426a6f075f095bade64a5439c21 100644 (file)
@@ -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
index 2a140184c8f497bd8a598020299b10c5af756ef9..526edb69d59eed7cb80b8cd9094fb99e67f3d3f1 100644 (file)
@@ -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;
index 721f879a4b72633a187188e2674d478bd5e5f461..1fab570c3efaaa95fed28c0c266b7846857dfc5d 100644 (file)
@@ -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;