URI: 
       tHave unpack() rely on archive_read_extract() - pm - barely a pack manager
  HTML git clone git://z3bra.org/pm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 505bcbe3ef7f29ac3f26f7d0b0f678a7efe53d55
   DIR parent 93c90c6b9d04d01fc6d7b5eefcb0ca488512beb7
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Thu,  7 Jan 2016 14:20:13 +0100
       
       Have unpack() rely on archive_read_extract()
       
       Diffstat:
         M pm.c                                |      27 ++++++---------------------
       
       1 file changed, 6 insertions(+), 21 deletions(-)
       ---
   DIR diff --git a/pm.c b/pm.c
       t@@ -300,11 +300,7 @@ int
        unpack(char *root, char *in)
        {
                struct archive *a;
       -        struct archive *w; /* write */
                struct archive_entry *e;
       -        const void *buf;
       -        size_t len;
       -        off_t off;
                int r;
                int mask = ARCHIVE_EXTRACT_PERM
                          |ARCHIVE_EXTRACT_NO_OVERWRITE
       t@@ -314,10 +310,6 @@ unpack(char *root, char *in)
                archive_read_support_filter_bzip2(a);
                archive_read_support_format_tar(a);
        
       -        w = archive_write_disk_new();
       -        archive_write_disk_set_options(w, mask);
       -        archive_write_disk_set_standard_lookup(w);
       -
                r = archive_read_open_filename(a, in, 0);
                if (r != ARCHIVE_OK)
                        return r;
       t@@ -329,28 +321,18 @@ unpack(char *root, char *in)
                }
        
                while (archive_read_next_header(a, &e) != ARCHIVE_EOF) {
       -
       -                r = archive_write_header(w, e);
                        if (r < ARCHIVE_OK) {
       -                        fprintf(stderr, "%s\n", archive_error_string(w));
       +                        fprintf(stderr, "%s\n", archive_error_string(a));
                                return r;
                        }
        
                        if (archive_entry_size(e) > 0)
       -                do {
       -                        r = archive_read_data_block(a, &buf, &len, &off);
       -                        if (r != ARCHIVE_OK)
       -                                return r;
       -                        /* returns the number of bytes written */
       -                        r = archive_write_data_block(w, buf, len, off);
       -                } while (r > 0);
       +                r = archive_read_extract(a, e, mask);
                        if (r < 0)
                                return r;
                }
                archive_read_close(a);
                archive_read_free(a);
       -        archive_write_close(w);
       -        archive_write_free(w);
        
                return 0;
        }
       t@@ -542,7 +524,10 @@ main (int argc, char **argv)
                        while (*argv) {
                                if ((p = pack_load(*(argv++)))) {
                                        metadata(PACKAGE_DATA, p);
       -                                unpack(PACKAGE_ROOT, p->path);
       +                                if (unpack(PACKAGE_ROOT, p->path) > 0) {
       +                                        fprintf(stderr, "error unpacking %s\n", p->name);
       +                                        delete(PACKAGE_DATA, PACKAGE_ROOT, p->name);
       +                                }
                                        pack_unload(p);
                                }
                        }