return ARCHIVE_FATAL;
}
-static int pakfire_archive_compute_digests(struct pakfire_archive* archive) {
- int r;
-
- // Start reading at the beginning
- rewind(archive->f);
-
- // Calculate digest
- r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests,
- PAKFIRE_ARCHIVE_CHECKSUM, archive->f);
- if (r)
- CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path);
-
- return r;
-}
-
/*
A helper function that opens the archive for reading
*/
-static struct archive* open_archive(struct pakfire_archive* archive) {
+static int pakfire_archive_open_archive(struct pakfire_archive* archive,
+ struct archive** __archive) {
+ struct archive* a = NULL;
+ int r;
+
// Create a new archive object
- struct archive* a = archive_read_new();
+ a = archive_read_new();
if (!a)
- return NULL;
+ return -errno;
// Archives must be uncompressed tarballs
archive_read_support_format_tar(a);
archive_read_support_filter_zstd(a);
// Try opening the archive file
- int r = archive_read_file_open(a, archive->f);
- if (r)
+ r = archive_read_file_open(a, archive->f);
+ if (r) {
+ CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n",
+ archive->path, archive_error_string(a));
goto ERROR;
+ }
+
+ // Return pointer
+ *__archive = a;
// Success
- return a;
+ return 0;
ERROR:
- CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n",
- archive->path, archive_error_string(a));
-
if (a)
archive_read_free(a);
- return NULL;
+ return r;
+}
+
+static int pakfire_archive_compute_digests(struct pakfire_archive* archive) {
+ int r;
+
+ // Start reading at the beginning
+ rewind(archive->f);
+
+ // Calculate digest
+ r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests,
+ PAKFIRE_ARCHIVE_CHECKSUM, archive->f);
+ if (r)
+ CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path);
+
+ return r;
}
/*
int r;
// Open the archive
- a = open_archive(archive);
- if (!a)
- return -errno;
+ r = pakfire_archive_open_archive(archive, &a);
+ if (r < 0)
+ goto ERROR;
// Walk...
r = pakfire_archive_walk(archive, a, walk_callback, filter_callback, data);
CTX_DEBUG(archive->ctx, "Reading archive metadata...\n");
// Open the archive
- a = open_archive(archive);
- if (!a) {
- r = -errno;
+ r = pakfire_archive_open_archive(archive, &a);
+ if (r < 0)
goto ERROR;
- }
// Check if the archive file actually has any contect
if (!archive->stat.st_size) {
archive_read_free(cookie->a);
// Open the archive
- cookie->a = open_archive(archive);
- if (!cookie->a)
+ r = pakfire_archive_open_archive(archive, &cookie->a);
+ if (r < 0)
goto ERROR;
// Walk through the archive
}
// Open the archive
- a = open_archive(archive);
- if (!a) {
- r = -errno;
+ r = pakfire_archive_open_archive(archive, &a);
+ if (r < 0)
goto ERROR;
- }
// Setup the writer if we are not running in dry mode
if (!(flags & PAKFIRE_EXTRACT_DRY_RUN)) {
int pakfire_archive_apply_systemd_sysusers(struct pakfire_archive* archive) {
struct archive* a = NULL;
+ int r;
// Open the archive
- a = open_archive(archive);
- if (!a)
- return -errno;
+ r = pakfire_archive_open_archive(archive, &a);
+ if (r < 0)
+ goto ERROR;
pakfire_archive_walk(archive, a, pakfire_archive_handle_systemd_sysusers,
pakfire_archive_filter_systemd_sysusers, NULL);
+ERROR:
if (a)
archive_read_free(a);