free(packager->scriptlets);
}
- if (packager->reader)
- archive_read_free(packager->reader);
-
if (packager->filelist)
pakfire_filelist_unref(packager->filelist);
pakfire_package_unref(packager->pkg);
pakfire_package_set_num(pkg, PAKFIRE_PKG_BUILD_TIME, p->time_created);
// Create reader
- p->reader = pakfire_make_archive_disk_reader(p->pakfire, 1);
+ p->reader = pakfire_get_disk_reader(p->pakfire);
if (!p->reader)
goto ERROR;
unsigned int in_free:1;
// Disk Reader/Writer
+ struct archive* reader;
struct archive* writer;
};
if (pakfire->pool)
pool_free(pakfire->pool);
+ if (pakfire->reader)
+ archive_read_free(pakfire->reader);
if (pakfire->writer)
archive_write_free(pakfire->writer);
if (pakfire->config)
return entry->gr_name;
}
-struct archive* pakfire_make_archive_disk_reader(struct pakfire* pakfire, int internal) {
- struct archive* archive = archive_read_disk_new();
- if (!archive)
- return NULL;
+struct archive* pakfire_get_disk_reader(struct pakfire* pakfire) {
+ int r;
- // Do not read fflags
- int r = archive_read_disk_set_behavior(archive, ARCHIVE_READDISK_NO_FFLAGS);
- if (r) {
- CTX_ERROR(pakfire->ctx, "Could not change behavior of reader: %s\n",
- archive_error_string(archive));
- archive_read_free(archive);
- return NULL;
+ if (!pakfire->reader) {
+ // Create a new reader
+ pakfire->reader = archive_read_disk_new();
+ if (!pakfire->reader) {
+ CTX_ERROR(pakfire->ctx, "Could not set up reader: %m\n");
+ return NULL;
+ }
+
+ // Do not read fflags
+ r = archive_read_disk_set_behavior(pakfire->reader, ARCHIVE_READDISK_NO_FFLAGS);
+ if (r) {
+ CTX_ERROR(pakfire->ctx, "Could not change behavior of reader: %s\n",
+ archive_error_string(pakfire->reader));
+ goto ERROR;
+ }
+
+ // Install user/group lookups
+ archive_read_disk_set_uname_lookup(pakfire->reader, pakfire, pakfire_user_lookup, NULL);
+ archive_read_disk_set_gname_lookup(pakfire->reader, pakfire, pakfire_group_lookup, NULL);
}
- // Install user/group lookups
- if (internal) {
- archive_read_disk_set_uname_lookup(archive, pakfire, pakfire_user_lookup, NULL);
- archive_read_disk_set_gname_lookup(archive, pakfire, pakfire_group_lookup, NULL);
- } else {
- archive_read_disk_set_standard_lookup(archive);
+ return pakfire->reader;
+
+ERROR:
+ if (pakfire->reader) {
+ archive_read_free(pakfire->reader);
+ pakfire->reader = NULL;
}
- return archive;
+ return NULL;
}
static la_int64_t pakfire_uid_lookup(void* data, const char* name, la_int64_t uid) {