From: Michael Tremer Date: Sun, 7 Mar 2021 18:11:01 +0000 (+0000) Subject: packager: Add filelist X-Git-Tag: 0.9.28~1285^2~612 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ba1869e2b9239eeb48866849ad3495cf3861c65;p=pakfire.git packager: Add filelist Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/packager.c b/src/libpakfire/packager.c index 6804ae807..aca9678cd 100644 --- a/src/libpakfire/packager.c +++ b/src/libpakfire/packager.c @@ -31,6 +31,8 @@ #include #include +#include +#include #include #include #include @@ -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);