// Container
enum pakfire_archive_writer_container {
PAKFIRE_CONTAINER_PAX,
+ PAKFIRE_CONTAINER_GNU,
} container;
// Compression
self->checksums = PAKFIRE_HASH_SHA3_512|PAKFIRE_HASH_BLAKE2B512;
break;
+ // OCI Layer
+ case PAKFIRE_FORMAT_OCI_LAYER:
+ // Use the GNU tar format
+ self->container = PAKFIRE_CONTAINER_GNU;
+
+ // We use Zstandard compression
+ self->compression = PAKFIRE_COMPRESSION_ZSTD;
+
+ // Use some good compression
+ self->compression_level = 20;
+ break;
+
// Fail on invalid inputs
default:
ERROR(self->ctx, "Invalid archive format\n");
// Set the container format
switch (self->container) {
+ // PAX Format
case PAKFIRE_CONTAINER_PAX:
- // Use the PAX format
r = archive_write_set_format_pax(self->archive);
if (r) {
ERROR(self->ctx, "Could not set format to PAX: %s\n",
return -ENOTSUP;
}
break;
+
+ // GNU Tar Format
+ case PAKFIRE_CONTAINER_GNU:
+ r = archive_write_set_format_gnutar(self->archive);
+ if (r) {
+ ERROR(self->ctx, "Could not set format to GNU tar: %s\n",
+ archive_error_string(self->archive));
+ return -ENOTSUP;
+ }
+ break;
}
// Set the compression
return r;
}
+int pakfire_archive_writer_write_everything(
+ struct pakfire_archive_writer* self, const char* root) {
+ struct pakfire_filelist* files = NULL;
+ int r;
+
+ // Create a new filelist
+ r = pakfire_filelist_create(&files, self->pakfire);
+ if (r < 0)
+ goto ERROR;
+
+ // Scan for all files
+ r = pakfire_filelist_scan(files, root, NULL, NULL, 0);
+ if (r < 0)
+ goto ERROR;
+
+ // Write all files
+ r = pakfire_archive_writer_write_files(self, files);
+ if (r < 0)
+ goto ERROR;
+
+ERROR:
+ if (files)
+ pakfire_filelist_unref(files);
+
+ return r;
+}
+
/*
* Creates a new file and writes it to the archive.
*/
typedef enum pakfire_archive_writer_formats {
PAKFIRE_FORMAT_ARCHIVE,
+ PAKFIRE_FORMAT_OCI_LAYER,
} pakfire_archive_writer_format;
int pakfire_archive_writer_create(struct pakfire_archive_writer** writer,
int pakfire_archive_writer_write_files(
struct pakfire_archive_writer* self, struct pakfire_filelist* files);
+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);
#include <stdio.h>
#include <stdlib.h>
-#include <pakfire/compress.h>
-#include <pakfire/filelist.h>
+#include <pakfire/archive_writer.h>
#include <pakfire/i18n.h>
#include <pakfire/logging.h>
#include <pakfire/oci.h>
#include <pakfire/pakfire.h>
int pakfire_oci_mkimage(struct pakfire* pakfire, FILE* f) {
- struct pakfire_filelist* filelist = NULL;
- struct archive* archive = NULL;
+ struct pakfire_archive_writer* writer = NULL;
int r;
// Fetch the pakfire root
const char* root = pakfire_get_path(pakfire);
- // Create a new filelist
- r = pakfire_filelist_create(&filelist, pakfire);
+ // Make a new archive writer
+ r = pakfire_archive_writer_create(&writer, pakfire, PAKFIRE_FORMAT_OCI_LAYER, f);
if (r < 0)
goto ERROR;
- // Scan for all files
- r = pakfire_filelist_scan(filelist, root, NULL, NULL, 0);
+ // Set the title
+ r = pakfire_archive_writer_set_title(writer, "%s", _("Writing Layer"));
if (r < 0)
goto ERROR;
- // Create a new archive
- r = pakfire_compress_create_archive(pakfire, &archive, f, PAKFIRE_COMPRESS_GZIP, 9);
+ // Write all files
+ r = pakfire_archive_writer_write_everything(writer, root);
if (r < 0)
goto ERROR;
- // Write all files to the image
- r = pakfire_compress(pakfire, archive, filelist,
- _("Creating Image"), PAKFIRE_COMPRESS_SHOW_THROUGHPUT, 0);
- if (r < 0)
- goto ERROR;
-
- // Close archive
- r = archive_write_close(archive);
- if (r) {
- //ERROR(pakfire, "Could not close archive: %s\n", archive_error_string(archive));
- goto ERROR;
- }
-
ERROR:
- if (filelist)
- pakfire_filelist_unref(filelist);
- if (archive)
- archive_free(archive);
+ if (writer)
+ pakfire_archive_writer_unref(writer);
return r;
}