From e43a759d866882a8cd500133dd5e3e20d5fe3d45 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 3 Feb 2025 10:28:32 +0000 Subject: [PATCH] repos: Add a new object to parse the metadata into Signed-off-by: Michael Tremer --- src/pakfire/repo.c | 68 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/pakfire/repo.c b/src/pakfire/repo.c index 2be82477..5a6d5af8 100644 --- a/src/pakfire/repo.c +++ b/src/pakfire/repo.c @@ -60,6 +60,14 @@ #define MAX_DESCRIPTION 4096 +struct pakfire_repomd { + // Version + int64_t version; + + // Revision + int64_t revision; +}; + struct pakfire_repo_appdata { // Reference Counter int nrefs; @@ -759,6 +767,50 @@ ERROR: return r; } +static int pakfire_repo_parse_repomd(struct pakfire_repo* self, + struct pakfire_repomd* repomd, const struct pakfire_buffer* buffer) { + struct json_object* root = NULL; + int r; + + // Parse JSON from buffer + root = pakfire_json_parse(self->ctx, buffer->data, buffer->length); + if (!root) { + r = -EBADMSG; + goto ERROR; + } + + // Parse version + r = pakfire_json_get_int64(root, "version", &repomd->version); + if (r < 0) + goto ERROR; + + // Check if we support this version + switch (repomd->version) { + case 0: + break; + + default: + ERROR(self->ctx, "Unsupported version of repository metadata: %ld\n", repomd->version); + r = -ENOTSUP; + goto ERROR; + } + + DEBUG(self->ctx, "Parsing repository metadata in version %ld\n", repomd->version); + + // Parse revision + r = pakfire_json_get_int64(root, "revision", &repomd->revision); + if (r < 0) + goto ERROR; + + // XXX There is more to do here... + +ERROR: + if (root) + json_object_put(root); + + return r; +} + static int pakfire_repo_verify_metadata( struct pakfire_repo* self, const struct pakfire_buffer* repomd) { struct pakfire_buffer signature = {}; @@ -812,7 +864,8 @@ ERROR: } static int pakfire_repo_download_metadata(struct pakfire_repo* repo, const char* path, int force) { - struct pakfire_buffer repomd = {}; + struct pakfire_repomd repomd = {}; + struct pakfire_buffer buffer = {}; struct pakfire_xfer* xfer = NULL; int r; @@ -851,7 +904,7 @@ static int pakfire_repo_download_metadata(struct pakfire_repo* repo, const char* goto ERROR; // Set the output path - r = pakfire_xfer_set_output_buffer(xfer, &repomd.data, &repomd.length); + r = pakfire_xfer_set_output_buffer(xfer, &buffer.data, &buffer.length); if (r < 0) goto ERROR; @@ -862,16 +915,21 @@ static int pakfire_repo_download_metadata(struct pakfire_repo* repo, const char* // Verify the downloaded data if (repo->appdata->key) { - r = pakfire_repo_verify_metadata(repo, &repomd); + r = pakfire_repo_verify_metadata(repo, &buffer); if (r < 0) goto ERROR; } + // Parse the metadata + r = pakfire_repo_parse_repomd(repo, &repomd, &buffer); + if (r < 0) + goto ERROR; + ERROR: if (xfer) pakfire_xfer_unref(xfer); - if (repomd.data) - free(repomd.data); + if (buffer.data) + free(buffer.data); return r; } -- 2.39.5