]> git.ipfire.org Git - pakfire.git/commitdiff
archive writer: Add function to add a larger file from disk
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Feb 2025 14:06:44 +0000 (14:06 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Feb 2025 14:06:44 +0000 (14:06 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/archive_writer.c
src/pakfire/archive_writer.h

index accc704567f29809d0ea6ce577a80517dc754ecb..ccb2244c329cbc649cc71eaccabbbce58f1815fe 100644 (file)
@@ -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;
+}
index 3a356e3c59be59605b3103e692ada2033f878bc6..cce26bad0cb4b49b96bf4a7dfd380738caa1d4f6 100644 (file)
@@ -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 */