libguestfs/0008-daemon-ldm.c-Replace-jansson-with-json-c.patch

235 lines
6.4 KiB
Diff
Raw Normal View History

From 5ea1e899e00f49ed27f25697e632d864760faf96 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 18 Oct 2024 21:44:13 +0100
Subject: [PATCH] daemon/ldm.c: Replace jansson with json-c
---
daemon/Makefile.am | 4 +--
daemon/ldm.c | 89 +++++++++++++++++++++++++---------------------
2 files changed, 51 insertions(+), 42 deletions(-)
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index bc74b6ef7..bb72c0244 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -225,7 +225,7 @@ guestfsd_LDADD = \
camldaemon.o \
$(ACL_LIBS) \
$(CAP_LIBS) \
- $(JANSSON_LIBS) \
+ $(JSON_C_LIBS) \
$(SELINUX_LIBS) \
$(AUGEAS_LIBS) \
$(HIVEX_LIBS) \
@@ -264,7 +264,7 @@ guestfsd_CFLAGS = \
$(AUGEAS_CFLAGS) \
$(HIVEX_CFLAGS) \
$(SD_JOURNAL_CFLAGS) \
- $(JANSSON_CFLAGS) \
+ $(JSON_C_CFLAGS) \
$(PCRE2_CFLAGS) \
$(LIBRPM_CFLAGS)
diff --git a/daemon/ldm.c b/daemon/ldm.c
index be4fb9701..1488b9259 100644
--- a/daemon/ldm.c
+++ b/daemon/ldm.c
@@ -25,7 +25,7 @@
#include <sys/stat.h>
#include <string.h>
-#include <jansson.h>
+#include <json.h>
#include "daemon.h"
#include "actions.h"
@@ -65,44 +65,54 @@ do_ldmtool_remove_all (void)
return 0;
}
-static json_t *
-parse_json (const char *json, const char *func)
+static json_object *
+parse_json (const char *json, const char *caller)
{
- json_t *tree;
- json_error_t err;
+ json_object *tree = NULL;
+ json_tokener *tok = NULL;
+ enum json_tokener_error err;
if (verbose)
- fprintf (stderr, "%s: parsing json: %s\n", func, json);
+ fprintf (stderr, "%s: parsing json: %s\n", caller, json);
- tree = json_loads (json, 0, &err);
- if (tree == NULL) {
- reply_with_error ("parse error: %s",
- strlen (err.text) ? err.text : "unknown error");
+ tok = json_tokener_new ();
+ json_tokener_set_flags (tok,
+ JSON_TOKENER_STRICT | JSON_TOKENER_VALIDATE_UTF8);
+ tree = json_tokener_parse_ex (tok, json, strlen (json));
+ err = json_tokener_get_error (tok);
+ if (err != json_tokener_success) {
+ reply_with_error ("%s: parse error: %s",
+ caller, json_tokener_error_desc (err));
+ json_tokener_free (tok);
return NULL;
}
- /* Caller should free this by doing 'json_decref (tree);'. */
+ json_tokener_free (tok);
+
+ /* Caller should free this by doing json_object_put (tree). */
return tree;
}
#define TYPE_ERROR ((char **) -1)
static char **
-json_value_to_string_list (json_t *node)
+json_value_to_string_list (json_object *node)
{
CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (strs);
- json_t *n;
+ json_object *n;
size_t i;
- if (!json_is_array (node))
+ if (json_object_get_type (node) != json_type_array)
return TYPE_ERROR;
- json_array_foreach (node, i, n) {
- if (!json_is_string (n))
+ for (i = 0; i < json_object_array_length (node); ++i) {
+ n = json_object_array_get_idx (node, i); /* Doesn't incr the refcount. */
+ if (json_object_get_type (n) != json_type_string)
return TYPE_ERROR;
- if (add_string (&strs, json_string_value (n)) == -1)
+ if (add_string (&strs, json_object_get_string (n)) == -1)
return NULL;
}
+
if (end_stringsbuf (&strs) == -1)
return NULL;
@@ -111,17 +121,17 @@ json_value_to_string_list (json_t *node)
static char **
parse_json_get_string_list (const char *json,
- const char *func, const char *cmd)
+ const char *caller, const char *cmd)
{
char **ret;
- json_t *tree = NULL;
+ json_object *tree = NULL;
- tree = parse_json (json, func);
+ tree = parse_json (json, caller);
if (tree == NULL)
return NULL;
ret = json_value_to_string_list (tree);
- json_decref (tree);
+ json_object_put (tree);
if (ret == TYPE_ERROR) {
reply_with_error ("output of '%s' was not a JSON array of strings", cmd);
return NULL;
@@ -133,74 +143,73 @@ parse_json_get_string_list (const char *json,
static char *
parse_json_get_object_string (const char *json, const char *key, int flags,
- const char *func, const char *cmd)
+ const char *caller, const char *cmd)
{
const char *str;
char *ret;
- json_t *tree = NULL, *node;
+ json_object *tree = NULL, *node;
- tree = parse_json (json, func);
+ tree = parse_json (json, caller);
if (tree == NULL)
return NULL;
- if (!json_is_object (tree))
+ if (json_object_get_type (tree) != json_type_object)
goto bad_type;
- node = json_object_get (tree, key);
+ node = json_object_object_get (tree, key);
if (node == NULL)
goto bad_type;
- if ((flags & GET_STRING_NULL_TO_EMPTY) && json_is_null (node))
+ if ((flags & GET_STRING_NULL_TO_EMPTY) &&
+ json_object_get_type (node) == json_type_null)
ret = strdup ("");
else {
- str = json_string_value (node);
- if (str == NULL)
- goto bad_type;
- ret = strndup (str, json_string_length (node));
+ str = json_object_get_string (node);
+ ret = strndup (str, strlen (str));
}
if (ret == NULL)
reply_with_perror ("strdup");
- json_decref (tree);
+ json_object_put (tree);
return ret;
bad_type:
reply_with_error ("output of '%s' was not a JSON object "
"containing a key '%s' of type string", cmd, key);
- json_decref (tree);
+ json_object_put (tree);
return NULL;
}
static char **
parse_json_get_object_string_list (const char *json, const char *key,
- const char *func, const char *cmd)
+ const char *caller, const char *cmd)
{
char **ret;
- json_t *tree, *node;
+ json_object *tree, *node;
- tree = parse_json (json, func);
+ tree = parse_json (json, caller);
if (tree == NULL)
return NULL;
- if (!json_is_object (tree))
+ if (json_object_get_type (tree) != json_type_object)
goto bad_type;
- node = json_object_get (tree, key);
+ node = json_object_object_get (tree, key);
if (node == NULL)
goto bad_type;
ret = json_value_to_string_list (node);
if (ret == TYPE_ERROR)
goto bad_type;
- json_decref (tree);
+ json_object_put (tree);
return ret;
bad_type:
reply_with_error ("output of '%s' was not a JSON object "
"containing a key '%s' of type array of strings",
cmd, key);
- json_decref (tree);
+ json_object_put (tree);
return NULL;
}
--
2.43.0