]> git.ipfire.org Git - pakfire.git/commitdiff
packager: Add function that starts putting the whole archive together
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Mar 2021 16:02:25 +0000 (16:02 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Mar 2021 16:02:25 +0000 (16:02 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/constants.h
src/libpakfire/include/pakfire/packager.h
src/libpakfire/libpakfire.sym
src/libpakfire/packager.c
tests/libpakfire/packager.c
tests/testsuite.c
tests/testsuite.h

index a6bef7260fae64d054072cd6493c4b89ee7489d4..24d79a6c1774617cbe1e0361d7e780abf994240c 100644 (file)
@@ -21,6 +21,9 @@
 #ifndef PAKFIRE_CONSTANTS_H
 #define PAKFIRE_CONSTANTS_H
 
+#define _TO_STRING(x) #x
+#define TO_STRING(x) _TO_STRING(x)
+
 #define STRING_SIZE 1024
 
 #define PAKFIRE_REPO_SYSTEM_NAME "@system"
 #define PAKFIRE_MACROS_DIR                             "/usr/lib/pakfire/macros"
 #define PAKFIRE_MACROS_GLOB_PATTERN            PAKFIRE_MACROS_DIR "/*.macro"
 
+#ifdef PAKFIRE_PRIVATE
+
+// The file format that this version generates
+#define PACKAGE_FORMAT 5
+
+#endif /* PAKFIRE_PRIVATE */
+
 #endif /* PAKFIRE_CONSTANTS_H */
index 9abccac7039777bb642a6ece5236639f80ab7ec5..3b9aff264cf29cc0d836f6bdb5eb7991f32ab01c 100644 (file)
@@ -30,6 +30,8 @@ int pakfire_packager_create(struct pakfire_packager** packager, PakfirePackage p
 struct pakfire_packager* pakfire_packager_ref(struct pakfire_packager* packager);
 struct pakfire_packager* pakfire_packager_unref(struct pakfire_packager* packager);
 
+char* pakfire_packager_finish(struct pakfire_packager* packager, FILE* f);
+
 int pakfire_packager_add(struct pakfire_packager* packager, const char* path);
 
 #endif /* PAKFIRE_PACKAGER_H */
index 215ff18e3149cb1efb6bf7a33a3a4d2ff273c934..76640a60f25d9f3307cfb4476b48c2dc82a7853e 100644 (file)
@@ -251,6 +251,7 @@ global:
 
        pakfire_packager_add;
        pakfire_packager_create;
+       pakfire_packager_finish;
        pakfire_packager_ref;
        pakfire_packager_unref;
 
index 211470b2efa7eae13ee1a90c5a69eaface669825..f7a29ffe89bb8a8c4f74f6a43531c5e5a36ae531 100644 (file)
@@ -29,6 +29,7 @@
 #include <archive.h>
 #include <archive_entry.h>
 
+#include <pakfire/constants.h>
 #include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/packager.h>
@@ -150,6 +151,91 @@ PAKFIRE_EXPORT struct pakfire_packager* pakfire_packager_unref(
        return NULL;
 }
 
+static int pakfire_packager_write_format(struct pakfire_packager* packager,
+               struct archive* a) {
+       const char buffer[] = TO_STRING(PACKAGE_FORMAT) "\n";
+
+       // Create a new file entry
+       struct archive_entry* entry = archive_entry_new();
+       if (!entry)
+               return 1;
+
+       // Set filename
+       archive_entry_set_pathname(entry, "pakfire-format");
+
+       // This is a regular file
+    archive_entry_set_filetype(entry, AE_IFREG);
+    archive_entry_set_perm(entry, 0644);
+
+       // Set length
+    archive_entry_set_size(entry, strlen(buffer));
+
+       // This is the end of the header
+       int r = archive_write_header(a, entry);
+       if (r) {
+               ERROR(packager->pakfire, "Error writing header: %s\n", archive_error_string(a));
+               archive_entry_free(entry);
+               return r;
+       }
+
+       // Write content
+       r = archive_write_data(a, buffer, strlen(buffer));
+       if (r < 0) {
+               ERROR(packager->pakfire, "Error writing data: %s\n", archive_error_string(a));
+               archive_entry_free(entry);
+               return r;
+       }
+
+       archive_entry_free(entry);
+
+       return 0;
+}
+
+/*
+       This function is being called at the end when all data has been added to the package.
+
+       It will create a new archive and write the package to the given file descriptor.
+*/
+PAKFIRE_EXPORT char* pakfire_packager_finish(struct pakfire_packager* packager, FILE* f) {
+       char* filename = NULL;
+
+       // Open a new archive
+       struct archive* a = archive_write_new();
+       if (!a) {
+               ERROR(packager->pakfire, "archive_write_new() failed\n");
+               goto ERROR;
+       }
+
+       // Use the PAX format
+       int r = archive_write_set_format_pax(a);
+       if (r) {
+               ERROR(packager->pakfire, "Could not set format to PAX: %s\n",
+                       archive_error_string(a));
+               goto ERROR;
+       }
+
+       // Write archive to f
+       r = archive_write_open_FILE(a, f);
+       if (r) {
+               ERROR(packager->pakfire, "archive_write_open_FILE() failed: %s\n",
+                       archive_error_string(a));
+               goto ERROR;
+       }
+
+       // Start with the format file
+       r = pakfire_packager_write_format(packager, a);
+       if (r)
+               goto ERROR;
+
+       // XXX set filename
+
+ERROR:
+       if (a)
+               archive_free(a);
+
+       return filename;
+}
+
 PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,
                const char* path) {
        FILE* f = NULL;
index 7838cf0e80431c5f6b55feeb18c7171e7bd76959..624708428cc89ed5fc6c93f361ec60023d17ea52 100644 (file)
@@ -46,6 +46,11 @@ static int test_create(const struct test* t) {
        r = pakfire_packager_add(packager, path);
        ASSERT(r == 0);
 
+       // Write archive
+       FILE* f = test_mktemp();
+       r = pakfire_packager_finish(packager, f);
+       ASSERT(r == 0);
+
        // Cleanup
        pakfire_packager_unref(packager);
        pakfire_package_unref(pkg);
index ee02da21c67f7f16527df76255f5dba685f6fff3..fc01ed45e54d0c76705d7952688505982d9c1f63 100644 (file)
@@ -100,3 +100,13 @@ int testsuite_run() {
 
        return EXIT_SUCCESS;
 }
+
+FILE* test_mktemp() {
+       char path[] = "/tmp/.pakfire-test.XXXXXX";
+
+       int fd = mkstemp(path);
+       if (fd < 0)
+               return NULL;
+
+       return fdopen(fd, "w");
+}
index 4b180c0749ea2c0328cde29901f7fa15787c09f3..02d3c0ea0c6909d81bb065627fb0595c6929c604 100644 (file)
@@ -85,4 +85,7 @@ int testsuite_run();
                } \
        } while (0)
 
+// Helper functions
+FILE* test_mktemp();
+
 #endif /* PAKFIRE_TESTSUITE_H */