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;
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;
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;
}
#include <time.h>
#include <unistd.h>
+#include <json.h>
#include <uuid/uuid.h>
#include <pakfire/constants.h>
// 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;
+}