From b9c5e038f28e8ea40b8c1e944852eabd5c54c356 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 8 Feb 2025 14:06:44 +0000 Subject: [PATCH] archive writer: Add function to add a larger file from disk Signed-off-by: Michael Tremer --- src/pakfire/archive_writer.c | 51 ++++++++++++++++++++++++++++++++++++ src/pakfire/archive_writer.h | 4 ++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/pakfire/archive_writer.c b/src/pakfire/archive_writer.c index accc7045..ccb2244c 100644 --- a/src/pakfire/archive_writer.c +++ b/src/pakfire/archive_writer.c @@ -655,3 +655,54 @@ ERROR: return r; } + +int pakfire_archive_writer_create_file_from_file( + struct pakfire_archive_writer* self, const char* path, mode_t mode, FILE* f) { + struct archive_entry* entry = NULL; + struct stat st = {}; + int r; + + // Fetch the file descriptor + const int fd = fileno(f); + if (fd < 0) + return -ENOTSUP; + + // Stat the file + r = fstat(fd, &st); + if (r < 0) + return -errno; + + // Create a new file entry + r = pakfire_archive_writer_create_entry(self, &entry, path, mode, st.st_size); + if (r < 0) + goto ERROR; + + // Write the header + r = archive_write_header(self->archive, entry); + if (r) { + ERROR(self->ctx, "Error writing header: %s\n", + archive_error_string(self->archive)); + r = -EINVAL; + goto ERROR; + } + + // Write payload + r = pakfire_archive_writer_write_payload(self, f); + if (r < 0) + goto ERROR; + + // Write trailer + r = archive_write_finish_entry(self->archive); + if (r) { + ERROR(self->ctx, "Failed to write the trailer: %s\n", + archive_error_string(self->archive)); + r = -EINVAL; + goto ERROR; + } + +ERROR: + if (entry) + archive_entry_free(entry); + + return r; +} diff --git a/src/pakfire/archive_writer.h b/src/pakfire/archive_writer.h index 3a356e3c..cce26bad 100644 --- a/src/pakfire/archive_writer.h +++ b/src/pakfire/archive_writer.h @@ -49,6 +49,8 @@ int pakfire_archive_writer_write_everything( struct pakfire_archive_writer* self, const char* root); int pakfire_archive_writer_create_file(struct pakfire_archive_writer* self, - const char* filename, mode_t mode, const char* payload, const size_t length); + const char* path, mode_t mode, const char* payload, const size_t length); +int pakfire_archive_writer_create_file_from_file( + struct pakfire_archive_writer* self, const char* path, mode_t mode, FILE* f); #endif /* PAKFIRE_ARCHIVE_WRITER_H */ -- 2.39.5