summaryrefslogtreecommitdiff
path: root/examples/minitar/minitar.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/minitar/minitar.c')
-rw-r--r--examples/minitar/minitar.c75
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);