#define MAX_DESCRIPTION 4096
+struct pakfire_repomd {
+ // Version
+ int64_t version;
+
+ // Revision
+ int64_t revision;
+};
+
struct pakfire_repo_appdata {
// Reference Counter
int nrefs;
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 = {};
}
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;
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;
// 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;
}