aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Config.mk5
-rwxr-xr-xtools/check/check_yajl_lib6
-rw-r--r--tools/libxl/Makefile4
-rw-r--r--tools/libxl/libxl_json.c19
-rw-r--r--tools/libxl/libxl_json.h51
-rw-r--r--tools/libxl/libxl_qmp.c6
6 files changed, 70 insertions, 21 deletions
diff --git a/Config.mk b/Config.mk
index 90a77286a1..c666646003 100644
--- a/Config.mk
+++ b/Config.mk
@@ -186,6 +186,11 @@ CONFIG_LIBICONV := $(shell export OS="`uname -s`"; \
. $(XEN_ROOT)/tools/check/funcs.sh; \
has_lib libiconv.so && echo 'y' || echo 'n')
+CONFIG_YAJL_VERSION := $(shell export OS="`uname -s`"; \
+ export CHECK_INCLUDES="$(CHECK_INCLUDES)"; \
+ . $(XEN_ROOT)/tools/check/funcs.sh; \
+ has_header yajl/yajl_version.h && echo 'y' || echo 'n')
+
# Enable XSM security module (by default, Flask).
XSM_ENABLE ?= n
FLASK_ENABLE ?= $(XSM_ENABLE)
diff --git a/tools/check/check_yajl_lib b/tools/check/check_yajl_lib
deleted file mode 100755
index a0f6c02ab8..0000000000
--- a/tools/check/check_yajl_lib
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# CHECK-BUILD CHECK-INSTALL
-
-. ./funcs.sh
-
-has_lib libyajl.so.1 || fail "can't find libyajl.so.1 version 1"
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index d0b6fda277..113b7c2e50 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -19,6 +19,10 @@ ifeq ($(CONFIG_Linux),y)
LIBUUID_LIBS += -luuid
endif
+ifeq ($(CONFIG_YAJL_VERSION),y)
+CFLAGS += -DHAVE_YAJL_VERSION
+endif
+
LIBXL_LIBS =
LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(UTIL_LIBS) $(LIBUUID_LIBS)
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 6ff2910806..345894b000 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -517,7 +517,7 @@ static bool is_decimal(const char *s, unsigned len)
return false;
}
-static int json_callback_number(void *opaque, const char *s, unsigned int len)
+static int json_callback_number(void *opaque, const char *s, libxl_yajl_length len)
{
libxl__yajl_ctx *ctx = opaque;
libxl__json_object *obj = NULL;
@@ -574,7 +574,7 @@ out:
}
static int json_callback_string(void *opaque, const unsigned char *str,
- unsigned int len)
+ libxl_yajl_length len)
{
libxl__yajl_ctx *ctx = opaque;
char *t = NULL;
@@ -607,7 +607,7 @@ static int json_callback_string(void *opaque, const unsigned char *str,
}
static int json_callback_map_key(void *opaque, const unsigned char *str,
- unsigned int len)
+ libxl_yajl_length len)
{
libxl__yajl_ctx *ctx = opaque;
char *t = NULL;
@@ -770,17 +770,13 @@ libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s)
DEBUG_GEN_ALLOC(&yajl_ctx);
if (yajl_ctx.hand == NULL) {
- yajl_parser_config cfg = {
- .allowComments = 1,
- .checkUTF8 = 1,
- };
- yajl_ctx.hand = yajl_alloc(&callbacks, &cfg, NULL, &yajl_ctx);
+ yajl_ctx.hand = libxl__yajl_alloc(&callbacks, NULL, &yajl_ctx);
}
status = yajl_parse(yajl_ctx.hand, (const unsigned char *)s, strlen(s));
if (status != yajl_status_ok)
goto out;
- status = yajl_parse_complete(yajl_ctx.hand);
+ status = yajl_complete_parse(yajl_ctx.hand);
if (status != yajl_status_ok)
goto out;
@@ -832,14 +828,13 @@ static const char *yajl_gen_status_to_string(yajl_gen_status s)
char *libxl__object_to_json(libxl_ctx *ctx, const char *type,
libxl__gen_json_callback gen, void *p)
{
- yajl_gen_config conf = { 1, " " };
const unsigned char *buf;
char *ret = NULL;
- unsigned int len = 0;
+ libxl_yajl_length len = 0;
yajl_gen_status s;
yajl_gen hand;
- hand = yajl_gen_alloc(&conf, NULL);
+ hand = libxl__yajl_gen_alloc(NULL);
if (!hand)
return NULL;
diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h
index 720f6df10f..898dec79e7 100644
--- a/tools/libxl/libxl_json.h
+++ b/tools/libxl/libxl_json.h
@@ -16,7 +16,58 @@
#define LIBXL_JSON_H
#include <yajl/yajl_gen.h>
+#include <yajl/yajl_parse.h>
+
+#ifdef HAVE_YAJL_VERSION
+# include <yajl/yajl_version.h>
+#endif
#include <_libxl_types_json.h>
+/* YAJL version check */
+#if defined(YAJL_MAJOR) && (YAJL_MAJOR > 1)
+# define HAVE_YAJL_V2 1
+#endif
+
+#ifdef HAVE_YAJL_V2
+
+typedef size_t libxl_yajl_length;
+
+static inline yajl_handle libxl__yajl_alloc(const yajl_callbacks *callbacks,
+ yajl_alloc_funcs *allocFuncs,
+ void *ctx)
+{
+ return yajl_alloc(callbacks, allocFuncs, ctx);
+}
+
+static inline yajl_gen libxl__yajl_gen_alloc(const yajl_alloc_funcs *allocFuncs)
+{
+ return yajl_gen_alloc(allocFuncs);
+}
+
+#else /* !HAVE_YAJL_V2 */
+
+#define yajl_complete_parse yajl_parse_complete
+
+typedef unsigned int libxl_yajl_length;
+
+static inline yajl_handle libxl__yajl_alloc(const yajl_callbacks *callbacks,
+ const yajl_alloc_funcs *allocFuncs,
+ void *ctx)
+{
+ yajl_parser_config cfg = {
+ .allowComments = 1,
+ .checkUTF8 = 1,
+ };
+ return yajl_alloc(callbacks, &cfg, allocFuncs, ctx);
+}
+
+static inline yajl_gen libxl__yajl_gen_alloc(const yajl_alloc_funcs *allocFuncs)
+{
+ yajl_gen_config conf = { 1, " " };
+ return yajl_gen_alloc(&conf, allocFuncs);
+}
+
+#endif /* !HAVE_YAJL_V2 */
+
#endif /* LIBXL_JSON_H */
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index a43838d85a..e0642e31b5 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -454,15 +454,15 @@ static char *qmp_send_prepare(libxl__gc *gc, libxl__qmp_handler *qmp,
qmp_callback_t callback, void *opaque,
qmp_request_context *context)
{
- yajl_gen_config conf = { 0, NULL };
const unsigned char *buf = NULL;
char *ret = NULL;
- unsigned int len = 0;
+ libxl_yajl_length len = 0;
yajl_gen_status s;
yajl_gen hand;
callback_id_pair *elm = NULL;
- hand = yajl_gen_alloc(&conf, NULL);
+ hand = libxl__yajl_gen_alloc(NULL);
+
if (!hand) {
return NULL;
}