static int _archive_read_close(struct archive *);
static int _archive_read_data_block(struct archive *,
const void **, size_t *, int64_t *);
+static int _archive_read_next_header(struct archive *,
+ struct archive_entry **);
static int _archive_read_next_header2(struct archive *,
struct archive_entry *);
static const char *trivial_lookup_gname(void *, int64_t gid);
av.archive_free = _archive_read_free;
av.archive_close = _archive_read_close;
av.archive_read_data_block = _archive_read_data_block;
+ av.archive_read_next_header = _archive_read_next_header;
av.archive_read_next_header2 = _archive_read_next_header2;
inited = 1;
}
a->archive.magic = ARCHIVE_READ_DISK_MAGIC;
a->archive.state = ARCHIVE_STATE_NEW;
a->archive.vtable = archive_read_disk_vtable();
+ a->entry = archive_entry_new2(&a->archive);
a->lookup_uname = trivial_lookup_uname;
a->lookup_gname = trivial_lookup_gname;
a->enable_copyfile = 1;
if (a->cleanup_uname != NULL && a->lookup_uname_data != NULL)
(a->cleanup_uname)(a->lookup_uname_data);
archive_string_free(&a->archive.error_string);
+ archive_entry_free(a->entry);
a->archive.magic = 0;
__archive_clean(&a->archive);
free(a);
return (r);
}
+static int
+_archive_read_next_header(struct archive *_a, struct archive_entry **entryp)
+{
+ int ret;
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+ *entryp = NULL;
+ ret = _archive_read_next_header2(_a, a->entry);
+ *entryp = a->entry;
+ return ret;
+}
+
static int
_archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
{
struct archive_read_disk {
struct archive archive;
+ /* Reused by archive_read_next_header() */
+ struct archive_entry *entry;
+
/*
* Symlink mode is one of 'L'ogical, 'P'hysical, or 'H'ybrid,
* following an old BSD convention. 'L' follows all symlinks,
static int _archive_read_close(struct archive *);
static int _archive_read_data_block(struct archive *,
const void **, size_t *, int64_t *);
+static int _archive_read_next_header(struct archive *,
+ struct archive_entry **);
static int _archive_read_next_header2(struct archive *,
struct archive_entry *);
static const char *trivial_lookup_gname(void *, int64_t gid);
av.archive_free = _archive_read_free;
av.archive_close = _archive_read_close;
av.archive_read_data_block = _archive_read_data_block;
+ av.archive_read_next_header = _archive_read_next_header;
av.archive_read_next_header2 = _archive_read_next_header2;
inited = 1;
}
a->archive.magic = ARCHIVE_READ_DISK_MAGIC;
a->archive.state = ARCHIVE_STATE_NEW;
a->archive.vtable = archive_read_disk_vtable();
+ a->entry = archive_entry_new2(&a->archive);
a->lookup_uname = trivial_lookup_uname;
a->lookup_gname = trivial_lookup_gname;
a->enable_copyfile = 1;
if (a->cleanup_uname != NULL && a->lookup_uname_data != NULL)
(a->cleanup_uname)(a->lookup_uname_data);
archive_string_free(&a->archive.error_string);
+ archive_entry_free(a->entry);
a->archive.magic = 0;
free(a);
return (r);
return (r);
}
+static int
+_archive_read_next_header(struct archive *_a, struct archive_entry **entryp)
+{
+ int ret;
+ struct archive_read_disk *a = (struct archive_read_disk *)_a;
+ *entryp = NULL;
+ ret = _archive_read_next_header2(_a, a->entry);
+ *entryp = a->entry;
+ return ret;
+}
+
static int
_archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
{
assertMakeSymlink("linkY", "d1/fileY");
assertChdir("..");
- assert((ae = archive_entry_new()) != NULL);
+ /* Note: this test uses archive_read_next_header()
+ instead of archive_read_next_header2() */
assert((a = archive_read_disk_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK,
archive_read_disk_set_symlink_logical(a));
file_count = 5;
while (file_count--) {
- assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
if (strcmp(archive_entry_pathname(ae), "l/ld1") == 0) {
assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
} else if (strcmp(archive_entry_pathname(ae),
}
}
/* There is no entry. */
- assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
/* Close the disk object. */
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
file_count = 13;
while (file_count--) {
- assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
if (strcmp(archive_entry_pathname(ae), "l") == 0) {
assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
} else if (strcmp(archive_entry_pathname(ae), "l/d1") == 0) {
}
}
/* There is no entry. */
- assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
/* Close the disk object. */
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
/* Destroy the disk object. */
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
- archive_entry_free(ae);
}
static void