On Thu, Nov 23, 2017 at 02:23:52PM +0100, Pino Toscano wrote:
While YAJL mostly works fine, it did not see any active development
in
the latest 3 years. OTOH, Jansson is another JSON C implementation,
with a very liberal license, and a much nicer API.
Hence, switch all of libguestfs from YAJL to Jansson:
- configure checks, and buildsystem in general
- packages pulled in the appliance
- actual implementations
- contrib scripts
- documentation
This also makes use of the better APIs available (e.g. json_object_get,
json_array_foreach, and json_object_foreach). This does not change the
API of our OCaml Yajl module.
The only behaviour change is that Jansson by default accepts only
objects and arrays as input (even though it has a flag to make it accept
anything). Since this seems a good idea anyway, and as it is the RFC
behaviour, then change one of the yajl_tests checks accordingly.
---
appliance/packagelist.in | 13 ++--
builder/Makefile.am | 4 +-
builder/yajl-c.c | 66 ++++++++++-----------
builder/yajl_tests.ml | 4 +-
contrib/p2v/aux-scripts/do-build.sh | 8 +--
contrib/p2v/build-p2v-iso.sh | 3 +-
daemon/Makefile.am | 4 +-
daemon/ldm.c | 115 ++++++++++++++++--------------------
docs/guestfs-building.pod | 2 +-
lib/Makefile.am | 4 +-
lib/info.c | 113 ++++++++++++++---------------------
lib/qemu.c | 64 +++++++-------------
m4/guestfs-libraries.m4 | 4 +-
13 files changed, 170 insertions(+), 234 deletions(-)
This is nice, just one idea below that might be useful to you.
diff --git a/lib/info.c b/lib/info.c
index f7378adfd..ada4cf03c 100644
--- a/lib/info.c
+++ b/lib/info.c
@@ -38,53 +38,46 @@
#include <sys/resource.h>
#endif
-#include <yajl/yajl_tree.h>
+#include <jansson.h>
#include "guestfs.h"
#include "guestfs-internal.h"
#include "guestfs-internal-actions.h"
#ifdef HAVE_ATTRIBUTE_CLEANUP
-#define CLEANUP_YAJL_TREE_FREE __attribute__((cleanup(cleanup_yajl_tree_free)))
+#define CLEANUP_JSON_T_DECREF __attribute__((cleanup(cleanup_json_t_decref)))
static void
-cleanup_yajl_tree_free (void *ptr)
+cleanup_json_t_decref (void *ptr)
{
- yajl_tree_free (* (yajl_val *) ptr);
+ json_decref (* (json_t **) ptr);
}
Looks like you don't need to do this, there already is 'json_auto_t' type
that
has attribute cleanup with json_decref already.