From: Michael Tremer Date: Sun, 11 Jul 2021 17:04:04 +0000 (+0000) Subject: archive: Add function that finds the end of an archive to append files X-Git-Tag: 0.9.28~1051 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=74f822bccdb430c57c945b828d02bfce7a5af0e7;p=pakfire.git archive: Add function that finds the end of an archive to append files Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 1aaad99ad..9ab071567 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -124,6 +124,57 @@ ERROR: return r; } +static int pakfire_archive_walk_entries(struct pakfire_archive* archive, struct archive* a, + int (*callback)(struct pakfire_archive* archive, struct archive* a, struct archive_entry* e, void* data), + void* data, off_t* offset) { + struct archive_entry* e = NULL; + + // Walk through the archive + while (1) { + int r = archive_read_next_header(a, &e); + + // Return OK when we reached the end of the archive + if (r == ARCHIVE_EOF) { + if (offset) + *offset = archive_read_header_position(a); + + return ARCHIVE_OK; + } + + // Raise any other errors + else if (r) + return r; + + // Run callback + if (callback) { + r = callback(archive, a, e, data); + if (r) + return r; + } + } + + return 0; +} + +static int pakfire_archive_walk(struct pakfire_archive* archive, + int (*callback)(struct pakfire_archive* archive, struct archive* a, struct archive_entry* e, void* data), + void* data, off_t* offset) { + struct archive* a; + + // Open the archive file + int r = open_archive(archive, &a); + if (r) + return r; + + // Walk through the archive + r = pakfire_archive_walk_entries(archive, a, callback, data, offset); + + // Close the archive + close_archive(archive, a); + + return r; +} + static int find_archive_entry(struct archive_entry** entry, struct archive* a, const char* filename) { int r; @@ -176,6 +227,13 @@ static int open_archive_and_read(struct pakfire_archive* archive, const char* fi return r; } +/* + This function finds the end of the archive so that we can append more files +*/ +static off_t pakfire_archive_find_end(struct pakfire_archive* archive, off_t* offset) { + return pakfire_archive_walk(archive, NULL, NULL, offset); +} + static la_ssize_t pakfire_archive_read_callback(struct archive* a, void* client_data, const void** buffer) { struct archive* archive = (struct archive*)client_data; @@ -557,51 +615,6 @@ ERROR: return r; } -static int pakfire_archive_walk_entries(struct pakfire_archive* archive, struct archive* a, - int (*callback)(struct pakfire_archive* archive, struct archive* a, struct archive_entry* e, void* data), - void* data) { - struct archive_entry* e = NULL; - - // Walk through the archive - while (1) { - int r = archive_read_next_header(a, &e); - - // Return OK when we reached the end of the archive - if (r == ARCHIVE_EOF) - return ARCHIVE_OK; - - // Raise any other errors - else if (r) - return r; - - // Run callback - r = callback(archive, a, e, data); - if (r) - return r; - } - - return 0; -} - -static int pakfire_archive_walk(struct pakfire_archive* archive, - int (*callback)(struct pakfire_archive* archive, struct archive* a, struct archive_entry* e, void* data), - void* data) { - struct archive* a; - - // Open the archive file - int r = open_archive(archive, &a); - if (r) - return r; - - // Walk through the archive - r = pakfire_archive_walk_entries(archive, a, callback, data); - - // Close the archive - close_archive(archive, a); - - return r; -} - static int pakfire_archive_read_metadata_entry(struct pakfire_archive* archive, struct archive* a, struct archive_entry* e, void* data) { int ret; @@ -625,7 +638,7 @@ static int pakfire_archive_read_metadata_entry(struct pakfire_archive* archive, } static int pakfire_archive_read_metadata(struct pakfire_archive* archive, struct archive* a) { - return pakfire_archive_walk(archive, pakfire_archive_read_metadata_entry, NULL); + return pakfire_archive_walk(archive, pakfire_archive_read_metadata_entry, NULL, NULL); } /* @@ -949,7 +962,7 @@ PAKFIRE_EXPORT int pakfire_archive_extract(struct pakfire_archive* archive, cons // Extract everything r = pakfire_archive_walk_entries(archive, payload, - pakfire_archive_extract_entry, &extractor); + pakfire_archive_extract_entry, &extractor, NULL); ERROR: // Finish progressbar @@ -1322,7 +1335,7 @@ static int pakfire_archive_verify_signatures(struct pakfire_archive* archive) { archive->verify = PAKFIRE_ARCHIVE_VERIFY_NOT_SIGNED; // Verify all signatures - r = pakfire_archive_walk(archive, pakfire_archive_verify_signature, &checksums); + r = pakfire_archive_walk(archive, pakfire_archive_verify_signature, &checksums, NULL); ERROR: gpgme_data_release(checksums);