From 9b5b13bdfa957ff2b670caeceb6e96aee424a454 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 8 Feb 2025 14:06:21 +0000 Subject: [PATCH] archive writer: Split off creating a new file entry Signed-off-by: Michael Tremer --- src/pakfire/archive_writer.c | 63 ++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/pakfire/archive_writer.c b/src/pakfire/archive_writer.c index a097826f..accc7045 100644 --- a/src/pakfire/archive_writer.c +++ b/src/pakfire/archive_writer.c @@ -564,42 +564,63 @@ ERROR: return r; } -/* - * Creates a new file and writes it to the archive. - */ -int pakfire_archive_writer_create_file(struct pakfire_archive_writer* self, - const char* filename, mode_t mode, const char* payload, const size_t length) { - struct archive_entry* entry = NULL; +static int pakfire_archive_writer_create_entry(struct pakfire_archive_writer* self, + struct archive_entry** entry, const char* path, const mode_t mode, const size_t length) { + struct archive_entry* e = NULL; int r; // Create a new file entry - entry = archive_entry_new(); - if (!entry) { + e = archive_entry_new(); + if (!e) { r = -errno; goto ERROR; } - // Set filename - archive_entry_set_pathname(entry, filename); + // Set path + archive_entry_set_pathname(e, path); // This is a regular file - archive_entry_set_filetype(entry, AE_IFREG); - archive_entry_set_perm(entry, mode); + archive_entry_set_filetype(e, AE_IFREG); + archive_entry_set_perm(e, mode); // Set length - archive_entry_set_size(entry, length); + archive_entry_set_size(e, length); // Set ownership - archive_entry_set_uname(entry, "root"); - archive_entry_set_uid(entry, 0); - archive_entry_set_gname(entry, "root"); - archive_entry_set_gid(entry, 0); + archive_entry_set_uname(e, "root"); + archive_entry_set_uid(e, 0); + archive_entry_set_gname(e, "root"); + archive_entry_set_gid(e, 0); // Set times - archive_entry_set_birthtime(entry, self->time_created, 0); - archive_entry_set_ctime(entry, self->time_created, 0); - archive_entry_set_mtime(entry, self->time_created, 0); - archive_entry_set_atime(entry, self->time_created, 0); + archive_entry_set_birthtime(e, self->time_created, 0); + archive_entry_set_ctime(e, self->time_created, 0); + archive_entry_set_mtime(e, self->time_created, 0); + archive_entry_set_atime(e, self->time_created, 0); + + // Return the pointer + *entry = e; + return 0; + +ERROR: + if (e) + archive_entry_free(e); + + return r; +} + +/* + * Creates a new file and writes it to the archive. + */ +int pakfire_archive_writer_create_file(struct pakfire_archive_writer* self, + const char* path, mode_t mode, const char* payload, const size_t length) { + struct archive_entry* entry = NULL; + int r; + + // Create a new file entry + r = pakfire_archive_writer_create_entry(self, &entry, path, mode, length); + if (r < 0) + goto ERROR; // Write the header r = archive_write_header(self->archive, entry); -- 2.39.5