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;
+}
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 */