]> git.ipfire.org Git - pakfire.git/commitdiff
packager: Add filelist
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Mar 2021 18:11:01 +0000 (18:11 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 7 Mar 2021 18:11:01 +0000 (18:11 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/packager.c

index 6804ae807989d89d3b08f77c1aa500338d383e5b..aca9678cd4258f68b71104d4cd65d4115b1f854e 100644 (file)
@@ -31,6 +31,8 @@
 
 #include <pakfire/archive.h>
 #include <pakfire/constants.h>
+#include <pakfire/file.h>
+#include <pakfire/filelist.h>
 #include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/packager.h>
@@ -45,6 +47,7 @@ struct pakfire_packager {
        int nrefs;
 
        PakfirePackage pkg;
+       PakfireFilelist filelist;
 
        struct archive* payload;
        FILE* fpayload;
@@ -119,6 +122,7 @@ static void pakfire_packager_free(struct pakfire_packager* packager) {
        if (packager->fpayload)
                fclose(packager->fpayload);
 
+       pakfire_filelist_unref(packager->filelist);
        pakfire_package_unref(packager->pkg);
        pakfire_unref(packager->pakfire);
 }
@@ -138,16 +142,24 @@ PAKFIRE_EXPORT int pakfire_packager_create(struct pakfire_packager** packager,
        // Store a reference to the package
        p->pkg = pakfire_package_ref(pkg);
 
+       // Create a new filelist
+       int r = pakfire_filelist_create(&p->filelist);
+       if (r)
+               goto ERROR;
+
        // Start payload
-       int r = pakfire_packager_create_payload(p, 1);
-       if (r) {
-               pakfire_packager_free(p);
-               return r;
-       }
+       r = pakfire_packager_create_payload(p, 1);
+       if (r)
+               goto ERROR;
 
        *packager = p;
 
        return 0;
+
+ERROR:
+       pakfire_packager_free(p);
+
+       return r;
 }
 
 PAKFIRE_EXPORT struct pakfire_packager* pakfire_packager_ref(
@@ -233,6 +245,83 @@ static int pakfire_packager_write_format(struct pakfire_packager* packager,
        return 0;
 }
 
+static int pakfire_packager_write_filelist(struct pakfire_packager* packager,
+               struct archive* a) {
+       char* buffer = NULL;
+       int r = 1;
+
+       for (unsigned int i = 0; i < pakfire_filelist_size(packager->filelist); i++) {
+               PakfireFile file = pakfire_filelist_get(packager->filelist, i);
+
+               char type = '-';
+
+               if (pakfire_file_is_dir(file))
+                       type = 'd';
+
+               if (pakfire_file_is_symlink(file))
+                       type = 'l';
+
+               if (pakfire_file_is_char(file))
+                       type = 'c';
+
+               const char* chksum = pakfire_file_get_chksum(file);
+
+               asprintf(&buffer,
+                       "%s%c %-10zu %-10s %-10s %-6d %-12ld %s %s %s\n",
+                       (buffer) ? buffer : "",
+                       type,
+                       pakfire_file_get_size(file),
+                       pakfire_file_get_user(file),
+                       pakfire_file_get_group(file),
+                       pakfire_file_get_mode(file),
+                       pakfire_file_get_time(file),
+                       (chksum) ? chksum : "-",
+                       "-", // XXX capabilities
+                       pakfire_file_get_name(file)
+               );
+
+               pakfire_file_unref(file);
+       }
+
+       // Create a new file entry
+       struct archive_entry* entry = archive_entry_new();
+       if (!entry)
+               goto ERROR;
+
+       // Set filename
+       archive_entry_set_pathname(entry, PAKFIRE_ARCHIVE_FN_FILELIST);
+
+       // 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
+       r = archive_write_header(a, entry);
+       if (r) {
+               ERROR(packager->pakfire, "Error writing header: %s\n", archive_error_string(a));
+               goto ERROR;
+       }
+
+       // 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));
+               goto ERROR;
+       }
+
+       // Success
+       r = 0;
+
+ERROR:
+       if (buffer)
+               free(buffer);
+
+       return r;
+}
+
 static int pakfire_packager_write_payload(struct pakfire_packager* packager,
                struct archive* a) {
        struct stat st;
@@ -327,6 +416,11 @@ PAKFIRE_EXPORT char* pakfire_packager_finish(struct pakfire_packager* packager,
        if (r)
                goto ERROR;
 
+       // Write the filelist
+       r = pakfire_packager_write_filelist(packager, a);
+       if (r)
+               goto ERROR;
+
        // Write the payload
        r = pakfire_packager_write_payload(packager, a);
        if (r)
@@ -361,6 +455,12 @@ PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,
                return r;
        }
 
+       // Create a file
+       PakfireFile file;
+       r = pakfire_file_create(&file);
+       if (r)
+               return r;
+
        // Create a new file entry
        struct archive_entry* entry = archive_entry_new();
        if (!entry)
@@ -368,9 +468,11 @@ PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,
 
        // Set path in archive
        archive_entry_set_pathname(entry, path);
+       pakfire_file_set_name(file, path);
 
        // Copy all attributes from stat()
        archive_entry_copy_stat(entry, &st);
+       pakfire_file_copy_stat(file, &st);
 
        // Write the header
        r = archive_write_header(packager->payload, entry);
@@ -394,10 +496,15 @@ PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,
                        goto ERROR;
        }
 
+       // Append the file to the filelist
+       pakfire_filelist_append(packager->filelist, file);
+
        // Successful
        r = 0;
 
 ERROR:
+       pakfire_file_unref(file);
+
        if (entry)
                archive_entry_free(entry);