diff options
Diffstat (limited to 'examples/minitar/minitar.c')
-rw-r--r-- | examples/minitar/minitar.c | 75 |
1 files changed, 56 insertions, 19 deletions
diff --git a/examples/minitar/minitar.c b/examples/minitar/minitar.c index 3e466ae9..b1575c9b 100644 --- a/examples/minitar/minitar.c +++ b/examples/minitar/minitar.c @@ -40,8 +40,6 @@ */ #include <sys/types.h> -__FBSDID("$FreeBSD$"); - #include <sys/stat.h> #include <archive.h> @@ -52,10 +50,6 @@ __FBSDID("$FreeBSD$"); #include <string.h> #include <unistd.h> -#ifndef NO_CREATE -#include "tree.h" -#endif - /* * NO_CREATE implies NO_BZIP2_CREATE and NO_GZIP_CREATE and NO_COMPRESS_CREATE. */ @@ -264,28 +258,71 @@ create(const char *filename, int compress, const char **argv) archive_read_disk_set_standard_lookup(disk); #endif while (*argv != NULL) { - struct tree *t = tree_open(*argv); - while (tree_next(t)) { + struct archive *disk = archive_read_disk_new(); + int r; + + r = archive_read_disk_open(disk, *argv); + if (r != ARCHIVE_OK) { + errmsg(archive_error_string(disk)); + errmsg("\n"); + exit(1); + } + + for (;;) { + int needcr = 0; + entry = archive_entry_new(); - archive_entry_set_pathname(entry, tree_current_path(t)); - archive_read_disk_entry_from_file(disk, entry, -1, - tree_current_stat(t)); + r = archive_read_next_header2(disk, entry); + if (r == ARCHIVE_EOF) + break; + if (r != ARCHIVE_OK) { + errmsg(archive_error_string(disk)); + errmsg("\n"); + exit(1); + } + archive_read_disk_descend(disk); if (verbose) { msg("a "); - msg(tree_current_path(t)); + msg(archive_entry_pathname(entry)); + needcr = 1; + } + r = archive_write_header(a, entry); + if (r < ARCHIVE_OK) { + errmsg(": "); + errmsg(archive_error_string(a)); + needcr = 1; } - archive_write_header(a, entry); - fd = open(tree_current_access_path(t), O_RDONLY); - len = read(fd, buff, sizeof(buff)); - while (len > 0) { - archive_write_data(a, buff, len); + if (r == ARCHIVE_FATAL) + exit(1); + if (r > ARCHIVE_FAILED) { +#if 0 + /* Ideally, we would be able to use + * the same code to copy a body from + * an archive_read_disk to an + * archive_write that we use for + * copying data from an archive_read + * to an archive_write_disk. + * Unfortunately, this doesn't quite + * work yet. */ + copy_data(disk, a); +#else + /* For now, we use a simpler loop to copy data + * into the target archive. */ + fd = open(archive_entry_sourcepath(entry), O_RDONLY); len = read(fd, buff, sizeof(buff)); + while (len > 0) { + archive_write_data(a, buff, len); + len = read(fd, buff, sizeof(buff)); + } + close(fd); +#endif } - close(fd); archive_entry_free(entry); - if (verbose) + if (needcr) msg("\n"); } + archive_read_close(disk); + archive_read_free(disk); argv++; } archive_write_close(a); |