]> git.ipfire.org Git - pakfire.git/commitdiff
util: Add helper function to parse JSON data
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 Mar 2021 14:17:19 +0000 (14:17 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 Mar 2021 14:17:19 +0000 (14:17 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/util.h
src/libpakfire/repo.c
src/libpakfire/util.c

index d18c30057caa8dbee86843c8647683d94e393e3b..128f98ebfef999d5d99b7df7768f24874ec338d7 100644 (file)
@@ -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;
 }
index f91fb5743d75d8e3e3007de9dffabec3fd5d2964..9572686aa8650e274c2e29c4e8a54cfaee6a2a62 100644 (file)
@@ -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 */
index ce181773413c16b8dd0a3545006907b7b09f9651..5d673b5d64f7ce86e0efb34e7cd973c5353d83ca 100644 (file)
@@ -31,6 +31,7 @@
 #include <solv/repo_solv.h>
 #include <solv/repo_write.h>
 
+#include <json.h>
 #include <lzma.h>
 
 #include <pakfire/archive.h>
index b599e3a2fea7665d46d8cc8a811f546e39afbffb..a445b57c4d4ee0d9f7953eec702f9aa28f2a4e3e 100644 (file)
@@ -32,6 +32,7 @@
 #include <time.h>
 #include <unistd.h>
 
+#include <json.h>
 #include <uuid/uuid.h>
 
 #include <pakfire/constants.h>
@@ -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;
+}