]> git.ipfire.org Git - pakfire.git/commitdiff
repos: Add a new object to parse the metadata into
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 3 Feb 2025 10:28:32 +0000 (10:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 3 Feb 2025 10:28:32 +0000 (10:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/repo.c

index 2be824776a28f3146bd0d92fda313d2794f7fc6a..5a6d5af802c507a6e89376fd4700d634c70c1d01 100644 (file)
 
 #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;
 }