From 6a7771f1632b40ea3a314b85a830ba13ae1b7fd7 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 10 Feb 2025 14:59:41 +0000 Subject: [PATCH] oci: Add some missing metadata Signed-off-by: Michael Tremer --- src/pakfire/oci.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/pakfire/oci.c b/src/pakfire/oci.c index 3914258d..cc91143b 100644 --- a/src/pakfire/oci.c +++ b/src/pakfire/oci.c @@ -37,6 +37,7 @@ #include #include #include +#include struct pakfire_oci_writer { // Context @@ -48,6 +49,9 @@ struct pakfire_oci_writer { // Image writer struct pakfire_archive_writer* image; + // Diff ID of the base layer + char* diffid; + // JSON Objects struct json_object* config; struct json_object* layers; @@ -200,6 +204,8 @@ static int pakfire_oci_writer_write_config(struct pakfire_oci_writer* self) { struct json_object* config = NULL; struct json_object* cmd = NULL; + struct json_object* rootfs = NULL; + struct json_object* diffids = NULL; // Make a new object o = pakfire_json_new_object(); @@ -254,6 +260,16 @@ static int pakfire_oci_writer_write_config(struct pakfire_oci_writer* self) { if (r < 0) goto ERROR; + // Add user + r = pakfire_json_add_string(config, "User", "root"); + if (r < 0) + goto ERROR; + + // Add working directory + r = pakfire_json_add_string(config, "WorkingDir", "/root"); + if (r < 0) + goto ERROR; + // Add command r = pakfire_json_add_array(config, "Cmd", &cmd); if (r < 0) @@ -264,6 +280,26 @@ static int pakfire_oci_writer_write_config(struct pakfire_oci_writer* self) { if (r < 0) goto ERROR; + // Add rootfs + r = pakfire_json_add_object(o, "rootfs", &rootfs); + if (r < 0) + goto ERROR; + + // Add type + r = pakfire_json_add_string(rootfs, "type", "layers"); + if (r < 0) + goto ERROR; + + // Add diff IDs + r = pakfire_json_add_array(rootfs, "diff_ids", &diffids); + if (r < 0) + goto ERROR; + + // Add the diff ID of the base layer + r = pakfire_json_array_add_stringf(diffids, "sha256:%s", self->diffid); + if (r < 0) + goto ERROR; + // Write as blob r = pakfire_oci_writer_write_json_blob(self, o, &hexdigest, &size); if (r < 0) @@ -497,6 +533,29 @@ static int pakfire_oci_writer_make_layer(struct pakfire_oci_writer* self) { goto ERROR; } + // Rewind + r = pakfire_rewind(f); + if (r < 0) + goto ERROR; + + // Replace the file handle to decompress the payload again + f = pakfire_gzfopen(f, "r"); + if (!f) { + ERROR(self->ctx, "Failed to re-open the layer for decompression: %m\n"); + r = -errno; + goto ERROR; + } + + // Hash the file + r = pakfire_hash_file(self->ctx, f, PAKFIRE_HASH_SHA2_256, &hashes); + if (r < 0) + goto ERROR; + + // Extract the diff ID + r = pakfire_hashes_get_hex(&hashes, PAKFIRE_HASH_SHA2_256, &self->diffid); + if (r < 0) + goto ERROR; + ERROR: if (layer) pakfire_archive_writer_unref(layer); @@ -587,6 +646,8 @@ ERROR: pakfire_archive_writer_unref(writer.image); if (writer.ctx) pakfire_ctx_unref(writer.ctx); + if (writer.diffid) + free(writer.diffid); return r; } -- 2.39.5