]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Add function that finds the end of an archive to append files
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Jul 2021 17:04:04 +0000 (17:04 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Jul 2021 17:04:04 +0000 (17:04 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index 1aaad99ad0563003c0d4806c96d08d290951bd24..9ab071567f3c55078d5f9a4bc98b0d08779ab595 100644 (file)
@@ -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);