From: Michael Tremer Date: Fri, 12 Mar 2021 14:17:19 +0000 (+0000) Subject: util: Add helper function to parse JSON data X-Git-Tag: 0.9.28~1285^2~555 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0351af83f6edc6e5214971db8050392e0be4eda5;p=pakfire.git util: Add helper function to parse JSON data Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index d18c30057..128f98ebf 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -254,55 +254,16 @@ int pakfire_downloader_read_mirrorlist(struct pakfire_downloader* downloader, const char* path) { DEBUG(downloader->pakfire, "Reading mirrorlist from %s\n", path); - FILE* f = NULL; - struct json_object* root = NULL; - struct json_object* mirrors = NULL; - char* buffer = NULL; - size_t length; - int r = 1; - - // Create tokener - struct json_tokener* tokener = json_tokener_new(); - if (!tokener) { - ERROR(downloader->pakfire, "Could not allocate JSON tokener: %s\n", strerror(errno)); - goto ERROR; - } - - // Read file into buffer - f = fopen(path, "r"); - if (!f) - goto ERROR; - - r = pakfire_read_file_into_buffer(f, &buffer, &length); - if (r) - goto ERROR; - - // Fail if content was empty - if (!length) { - ERROR(downloader->pakfire, "%s is empty\n", path); - errno = EINVAL; - goto ERROR; - } - - // Parse JSON from path - root = json_tokener_parse_ex(tokener, buffer, length); - if (!root) { - enum json_tokener_error error = json_tokener_get_error(tokener); - - ERROR(downloader->pakfire, "JSON parsing error: %s\n", - json_tokener_error_desc(error)); - r = 1; - goto ERROR; + struct json_object* json = pakfire_json_parse_from_file(downloader->pakfire, path); + if (!json) { + ERROR(downloader->pakfire, "Could not parse mirrorlist\n"); + return 1; } -#ifdef ENABLE_DEBUG - const char* parsed_json = json_object_to_json_string_ext(root, - JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY); - DEBUG(downloader->pakfire, "Parsed JSON:\n%s\n", parsed_json); -#endif + struct json_object* mirrors = NULL; // Check if we found a valid mirrorlist - r = pakfire_downloader_check_mirrorlist(downloader, root); + int r = pakfire_downloader_check_mirrorlist(downloader, json); if (r) goto ERROR; @@ -310,7 +271,7 @@ int pakfire_downloader_read_mirrorlist(struct pakfire_downloader* downloader, pakfire_downloader_clear_mirrors(downloader); // Add the new mirrors - r = json_object_object_get_ex(root, "mirrors", &mirrors); + r = json_object_object_get_ex(json, "mirrors", &mirrors); if (r == FALSE) { DEBUG(downloader->pakfire, "Mirrorlist has no mirrors\n"); r = 0; @@ -350,12 +311,8 @@ NEXT: ERROR: if (mirrors) json_object_put(mirrors); - if (root) - json_object_put(root); - json_tokener_free(tokener); - - if (f) - fclose(f); + if (json) + json_object_put(json); return r; } diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index f91fb5743..9572686aa 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -65,6 +65,10 @@ char* pakfire_hexlify(const char* digest, const size_t length); FILE* pakfire_mktemp(char* path); +// JSON Stuff + +struct json_object* pakfire_json_parse_from_file(Pakfire pakfire, const char* path); + #endif #endif /* PAKFIRE_UTIL_H */ diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index ce1817734..5d673b5d6 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -31,6 +31,7 @@ #include #include +#include #include #include diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index b599e3a2f..a445b57c4 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -538,3 +539,59 @@ FILE* pakfire_mktemp(char* path) { // Re-open as file handle return fdopen(fd, "w+"); } + +// JSON Stuff + +static struct json_object* pakfire_json_parse(Pakfire pakfire, FILE* f) { + struct json_tokener* tokener = NULL; + struct json_object* json = NULL; + char* buffer = NULL; + size_t length; + + // Read everything into memory + int r = pakfire_read_file_into_buffer(f, &buffer, &length); + if (r) + goto ERROR; + + // Create tokener + tokener = json_tokener_new(); + if (!tokener) { + ERROR(pakfire, "Could not allocate JSON tokener: %s\n", strerror(errno)); + goto ERROR; + } + + // Parse JSON from path + json = json_tokener_parse_ex(tokener, buffer, length); + if (!json) { + enum json_tokener_error error = json_tokener_get_error(tokener); + + ERROR(pakfire, "JSON parsing error: %s\n", json_tokener_error_desc(error)); + goto ERROR; + } + + // Log what we have parsed + DEBUG(pakfire, "Parsed JSON:\n%s\n", + json_object_to_json_string_ext(json, + JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY) + ); + +ERROR: + if (buffer) + free(buffer); + + if (tokener) + json_tokener_free(tokener); + + return json; +} + +struct json_object* pakfire_json_parse_from_file(Pakfire pakfire, const char* path) { + FILE* f = fopen(path, "r"); + if (!f) + return NULL; + + struct json_object* json = pakfire_json_parse(pakfire, f); + fclose(f); + + return json; +}