[libvirt] [PATCHv4 00/15] Switch from yajl to Jansson

Per the discussion here: https://www.redhat.com/archives/libvir-list/2017-November/msg00225.html Switch from using yajl to Jansson. v1: https://www.redhat.com/archives/libvir-list/2018-March/msg01781.html v2: https://www.redhat.com/archives/libvir-list/2018-May/msg00695.html v3: https://www.redhat.com/archives/libvir-list/2018-May/msg00850.html v4: Introduce a separate check for Jansson >= 2.8, which preserves ordering of object keys. For older platforms (e.g. Debian 8), skip tests that depend on stable ordering. All patches except for 12/15 (trivial) and 15/15 (new) were ACK'd already by either Peter or Andrea. Tested on Debian 8 with libjansson-dev 2.7. Also available on my repo: http://repo.or.cz/libvirt/jtomko.git/ jansson-skip Ján Tomko (15): build: add --with-jansson build: undef WITH_JANSSON for SETUID_RPC_CLIENT Switch from yajl to Jansson FIXUP: fix tests FIXUP: Deprecate building --with-yajl FIXUP: make nss depend on Jansson instead of yajl FIXUP: compile and link with Jansson instead of yajl FIXUP: s/WITH_YAJL/WITH_JANSSON/ FIXUP: libvirt.spec: use jansson instead of yajl Remove functions using yajl build: remove references to WITH_YAJL for SETUID_RPC_CLIENT Remove virJSONValueNewStringLen build: switch --with-qemu default from yes to check build: require Jansson if QEMU driver is enabled m4: Introduce STABLE_ORDERING_JANSSON config-post.h | 3 +- configure.ac | 3 + libvirt.spec.in | 4 +- m4/virt-driver-qemu.m4 | 9 +- m4/virt-jansson.m4 | 32 ++ m4/virt-nss.m4 | 4 +- m4/virt-yajl.m4 | 27 +- src/Makefile.am | 8 +- src/libvirt_private.syms | 1 - src/qemu/qemu_driver.c | 2 +- src/util/Makefile.inc.am | 4 +- src/util/virjson.c | 616 +++++++------------------------ src/util/virjson.h | 1 - tests/Makefile.am | 12 +- tests/cputest.c | 16 +- tests/libxlxml2domconfigtest.c | 4 +- tests/qemuagenttest.c | 2 +- tests/qemublocktest.c | 6 + tests/qemucapabilitiestest.c | 7 +- tests/qemucaps2xmltest.c | 2 +- tests/qemucommandutiltest.c | 7 +- tests/qemuhotplugtest.c | 7 +- tests/qemumigparamsdata/empty.json | 4 +- tests/qemumigparamsdata/unsupported.json | 4 +- tests/qemumigparamstest.c | 7 +- tests/qemumonitorjsontest.c | 7 +- tests/virjsontest.c | 5 + tests/virmacmaptest.c | 5 + tests/virmacmaptestdata/empty.json | 4 +- tests/virmocklibxl.c | 4 +- tests/virnetdaemontest.c | 7 +- tests/virstoragetest.c | 4 +- 32 files changed, 274 insertions(+), 554 deletions(-) create mode 100644 m4/virt-jansson.m4 -- 2.16.1

Introduce the configure argument and check for Jansson >= 2.5 Signed-off-by: Ján Tomko <jtomko@redhat.com> --- configure.ac | 3 +++ m4/virt-jansson.m4 | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 m4/virt-jansson.m4 diff --git a/configure.ac b/configure.ac index a87ca06854..c6287f656a 100644 --- a/configure.ac +++ b/configure.ac @@ -250,6 +250,7 @@ LIBVIRT_ARG_FIREWALLD LIBVIRT_ARG_FUSE LIBVIRT_ARG_GLUSTER LIBVIRT_ARG_HAL +LIBVIRT_ARG_JANSSON LIBVIRT_ARG_LIBPCAP LIBVIRT_ARG_LIBSSH LIBVIRT_ARG_LIBXML @@ -290,6 +291,7 @@ LIBVIRT_CHECK_FUSE LIBVIRT_CHECK_GLUSTER LIBVIRT_CHECK_GNUTLS LIBVIRT_CHECK_HAL +LIBVIRT_CHECK_JANSSON LIBVIRT_CHECK_LIBNL LIBVIRT_CHECK_LIBPARTED LIBVIRT_CHECK_LIBPCAP @@ -970,6 +972,7 @@ LIBVIRT_RESULT_FUSE LIBVIRT_RESULT_GLUSTER LIBVIRT_RESULT_GNUTLS LIBVIRT_RESULT_HAL +LIBVIRT_RESULT_JANSSON LIBVIRT_RESULT_LIBNL LIBVIRT_RESULT_LIBPCAP LIBVIRT_RESULT_LIBSSH diff --git a/m4/virt-jansson.m4 b/m4/virt-jansson.m4 new file mode 100644 index 0000000000..206d6a5ced --- /dev/null +++ b/m4/virt-jansson.m4 @@ -0,0 +1,29 @@ +dnl The jansson library +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl <http://www.gnu.org/licenses/>. +dnl + +AC_DEFUN([LIBVIRT_ARG_JANSSON],[ + LIBVIRT_ARG_WITH_FEATURE([JANSSON], [jansson], [check]) +]) + +AC_DEFUN([LIBVIRT_CHECK_JANSSON],[ + dnl Jansson http://www.digip.org/jansson/ + LIBVIRT_CHECK_PKG([JANSSON], [jansson], [2.5]) +]) + +AC_DEFUN([LIBVIRT_RESULT_JANSSON],[ + LIBVIRT_RESULT_LIB([JANSSON]) +]) -- 2.16.1

There is no code using WITH_JANSSON yet, but once we add it, it should not be compiled for the setuid_rpc_client. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- config-post.h | 1 + 1 file changed, 1 insertion(+) diff --git a/config-post.h b/config-post.h index 063e30fa37..24117bbbd4 100644 --- a/config-post.h +++ b/config-post.h @@ -36,6 +36,7 @@ # undef WITH_DEVMAPPER # undef WITH_DTRACE_PROBES # undef WITH_GNUTLS +# undef WITH_JANSSON # undef WITH_LIBSSH # undef WITH_MACVTAP # undef WITH_NUMACTL -- 2.16.1

Yajl has not seen much activity upstream recently. Switch to using Jansson >= 2.5. All the platforms we target on https://libvirt.org/platforms.html have a version >= 2.7 listed on the sites below: https://repology.org/metapackage/jansson/versions https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement to 2.5 since we don't use anything from newer versions. Implement virJSONValue{From,To}String using Jansson, delete the yajl code (and the related virJSONParser structure) and report an error if someone explicitly specifies --with-yajl. Also adjust the test data to account for Jansson's different whitespace usage for empty arrays and tune up the specfile to keep 'make rpm' working when bisecting. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/util/virjson.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/src/util/virjson.c b/src/util/virjson.c index 29530dcb15..608ba85d67 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1985,6 +1985,217 @@ virJSONValueToString(virJSONValuePtr object, } +#elif WITH_JANSSON +# include <jansson.h> + +static virJSONValuePtr +virJSONValueFromJansson(json_t *json) +{ + virJSONValuePtr ret = NULL; + const char *key; + json_t *cur; + size_t i; + + switch (json_typeof(json)) { + case JSON_OBJECT: + ret = virJSONValueNewObject(); + if (!ret) + goto error; + + json_object_foreach(json, key, cur) { + virJSONValuePtr val = virJSONValueFromJansson(cur); + if (!val) + goto error; + + if (virJSONValueObjectAppend(ret, key, val) < 0) { + virJSONValueFree(val); + goto error; + } + } + + break; + + case JSON_ARRAY: + ret = virJSONValueNewArray(); + if (!ret) + goto error; + + json_array_foreach(json, i, cur) { + virJSONValuePtr val = virJSONValueFromJansson(cur); + if (!val) + goto error; + + if (virJSONValueArrayAppend(ret, val) < 0) { + virJSONValueFree(val); + goto error; + } + } + break; + + case JSON_STRING: + ret = virJSONValueNewString(json_string_value(json)); + break; + + case JSON_INTEGER: + ret = virJSONValueNewNumberLong(json_integer_value(json)); + break; + + case JSON_REAL: + ret = virJSONValueNewNumberDouble(json_real_value(json)); + break; + + case JSON_TRUE: + ret = virJSONValueNewBoolean(true); + break; + + case JSON_FALSE: + ret = virJSONValueNewBoolean(false); + break; + + case JSON_NULL: + ret = virJSONValueNewNull(); + break; + } + + return ret; + + error: + virJSONValueFree(ret); + return NULL; +} + +virJSONValuePtr +virJSONValueFromString(const char *jsonstring) +{ + virJSONValuePtr ret = NULL; + json_t *json; + json_error_t error; + size_t flags = JSON_REJECT_DUPLICATES | + JSON_DECODE_ANY; + + if (!(json = json_loads(jsonstring, flags, &error))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse JSON %d:%d: %s"), + error.line, error.column, error.text); + return NULL; + } + + ret = virJSONValueFromJansson(json); + json_decref(json); + return ret; +} + + +static json_t * +virJSONValueToJansson(virJSONValuePtr object) +{ + json_t *ret = NULL; + size_t i; + + switch ((virJSONType)object->type) { + case VIR_JSON_TYPE_OBJECT: + ret = json_object(); + if (!ret) + goto no_memory; + for (i = 0; i < object->data.object.npairs; i++) { + virJSONObjectPairPtr cur = object->data.object.pairs + i; + json_t *val = virJSONValueToJansson(cur->value); + + if (!val) + goto error; + if (json_object_set_new(ret, cur->key, val) < 0) { + json_decref(val); + goto no_memory; + } + } + break; + + case VIR_JSON_TYPE_ARRAY: + ret = json_array(); + if (!ret) + goto no_memory; + for (i = 0; i < object->data.array.nvalues; i++) { + virJSONValuePtr cur = object->data.array.values[i]; + json_t *val = virJSONValueToJansson(cur); + + if (!val) + goto error; + if (json_array_append_new(ret, val) < 0) { + json_decref(val); + goto no_memory; + } + } + break; + + case VIR_JSON_TYPE_STRING: + ret = json_string(object->data.string); + break; + + case VIR_JSON_TYPE_NUMBER: { + long long ll_val; + double d_val; + if (virStrToLong_ll(object->data.number, NULL, 10, &ll_val) < 0) { + if (virStrToDouble(object->data.number, NULL, &d_val) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("JSON value is not a number")); + return NULL; + } + ret = json_real(d_val); + } else { + ret = json_integer(ll_val); + } + } + break; + + case VIR_JSON_TYPE_BOOLEAN: + ret = json_boolean(object->data.boolean); + break; + + case VIR_JSON_TYPE_NULL: + ret = json_null(); + break; + + default: + virReportEnumRangeError(virJSONType, object->type); + goto error; + } + if (!ret) + goto no_memory; + return ret; + + no_memory: + virReportOOMError(); + error: + json_decref(ret); + return NULL; +} + + +char * +virJSONValueToString(virJSONValuePtr object, + bool pretty) +{ + size_t flags = JSON_ENCODE_ANY; + json_t *json; + char *str = NULL; + + if (pretty) + flags |= JSON_INDENT(2); + else + flags |= JSON_COMPACT; + + json = virJSONValueToJansson(object); + if (!json) + return NULL; + + str = json_dumps(json, flags); + if (!str) + virReportOOMError(); + json_decref(json); + return str; +} + + #else virJSONValuePtr virJSONValueFromString(const char *jsonstring ATTRIBUTE_UNUSED) -- 2.16.1

On 07/18/2018 10:44 AM, Ján Tomko wrote:
Yajl has not seen much activity upstream recently. Switch to using Jansson >= 2.5.
All the platforms we target on https://libvirt.org/platforms.html have a version >= 2.7 listed on the sites below: https://repology.org/metapackage/jansson/versions https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson
Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement to 2.5 since we don't use anything from newer versions.
Implement virJSONValue{From,To}String using Jansson, delete the yajl code (and the related virJSONParser structure) and report an error if someone explicitly specifies --with-yajl.
Also adjust the test data to account for Jansson's different whitespace usage for empty arrays and tune up the specfile to keep 'make rpm' working when bisecting.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/util/virjson.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+)
Too late now, but git bisect and running the test suite seems to be broken starting with this patch as I started getting "FAIL: qemublocktest" here running a bisect chasing something else. As I found out "later" I didn't have jansson-devel dnf installed either, so that may have affected my results. Who knows at this point. The failure goes away with patch 13, but that introduced other issues for me. I'll respond there with what I found. John [...]

On Thu, Jul 19, 2018 at 07:24:43PM -0400, John Ferlan wrote:
On 07/18/2018 10:44 AM, Ján Tomko wrote:
Yajl has not seen much activity upstream recently. Switch to using Jansson >= 2.5.
All the platforms we target on https://libvirt.org/platforms.html have a version >= 2.7 listed on the sites below: https://repology.org/metapackage/jansson/versions https://build.opensuse.org/package/show/devel:libraries:c_c++/libjansson
Additionally, Ubuntu 14.04 on Travis-CI has 2.5. Set the requirement to 2.5 since we don't use anything from newer versions.
Implement virJSONValue{From,To}String using Jansson, delete the yajl code (and the related virJSONParser structure) and report an error if someone explicitly specifies --with-yajl.
Also adjust the test data to account for Jansson's different whitespace usage for empty arrays and tune up the specfile to keep 'make rpm' working when bisecting.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/util/virjson.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+)
Too late now, but git bisect and running the test suite seems to be broken starting with this patch as I started getting "FAIL: qemublocktest" here running a bisect chasing something else.
As I found out "later" I didn't have jansson-devel dnf installed either, so that may have affected my results. Who knows at this point.
The failure goes away with patch 13, but that introduced other issues for me. I'll respond there with what I found.
Until patch 15/15, qemublocktest was only guarded by WITH_QEMU, despite requiring a working JSON implementation, so that failure does not surprise me. Jano

Jansson does not add an extra newline after the output and it formats empty elements differently. --- tests/qemublocktest.c | 1 + tests/qemumigparamsdata/empty.json | 4 +--- tests/qemumigparamsdata/unsupported.json | 4 +--- tests/virmacmaptestdata/empty.json | 4 +--- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c index 0c335abc5b..9a387cf063 100644 --- a/tests/qemublocktest.c +++ b/tests/qemublocktest.c @@ -309,6 +309,7 @@ testQemuDiskXMLToPropsValidateFile(const void *opaque) goto cleanup; virBufferAdd(&buf, jsonstr, -1); + virBufferAddLit(&buf, "\n"); VIR_FREE(jsonstr); } diff --git a/tests/qemumigparamsdata/empty.json b/tests/qemumigparamsdata/empty.json index 0db3279e44..0967ef424b 100644 --- a/tests/qemumigparamsdata/empty.json +++ b/tests/qemumigparamsdata/empty.json @@ -1,3 +1 @@ -{ - -} +{} diff --git a/tests/qemumigparamsdata/unsupported.json b/tests/qemumigparamsdata/unsupported.json index 0db3279e44..0967ef424b 100644 --- a/tests/qemumigparamsdata/unsupported.json +++ b/tests/qemumigparamsdata/unsupported.json @@ -1,3 +1 @@ -{ - -} +{} diff --git a/tests/virmacmaptestdata/empty.json b/tests/virmacmaptestdata/empty.json index 41b42e677b..fe51488c70 100644 --- a/tests/virmacmaptestdata/empty.json +++ b/tests/virmacmaptestdata/empty.json @@ -1,3 +1 @@ -[ - -] +[] -- 2.16.1

--- m4/virt-yajl.m4 | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/m4/virt-yajl.m4 b/m4/virt-yajl.m4 index c4ea0102a3..8d4c43a6b2 100644 --- a/m4/virt-yajl.m4 +++ b/m4/virt-yajl.m4 @@ -23,31 +23,10 @@ AC_DEFUN([LIBVIRT_ARG_YAJL],[ AC_DEFUN([LIBVIRT_CHECK_YAJL],[ dnl YAJL JSON library http://lloyd.github.com/yajl/ - if test "$with_qemu:$with_yajl" = yes:check; then - dnl Some versions of qemu require the use of yajl; try to detect them - dnl here, although we do not require qemu to exist in order to compile. - dnl This check mirrors src/qemu/qemu_capabilities.c - AC_PATH_PROGS([QEMU], [qemu-kvm qemu kvm qemu-system-x86_64], - [], [$PATH:/usr/bin:/usr/libexec]) - if test -x "$QEMU"; then - if $QEMU -help 2>/dev/null | grep -q libvirt; then - with_yajl=yes - else - [qemu_version_sed='s/.*ersion \([0-9.,]*\).*/\1/'] - qemu_version=`$QEMU -version | sed "$qemu_version_sed"` - case $qemu_version in - [[1-9]].* | 0.15.* ) with_yajl=yes ;; - 0.* | '' ) ;; - *) AC_MSG_ERROR([Unexpected qemu version string]) ;; - esac - fi - fi + if test "$with_yajl" = yes; then + AC_MSG_ERROR([Compilation with YAJL is no longer supported]) fi - - LIBVIRT_CHECK_LIB_ALT([YAJL], [yajl], - [yajl_parse_complete], [yajl/yajl_common.h], - [YAJL2], [yajl], - [yajl_tree_parse], [yajl/yajl_common.h]) + with_yajl=no ]) AC_DEFUN([LIBVIRT_RESULT_YAJL],[ -- 2.16.1

--- m4/virt-nss.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/m4/virt-nss.m4 b/m4/virt-nss.m4 index 951a74e835..082b7b14f6 100644 --- a/m4/virt-nss.m4 +++ b/m4/virt-nss.m4 @@ -27,9 +27,9 @@ AC_DEFUN([LIBVIRT_CHECK_NSS],[ bsd_nss=no fail=0 if test "x$with_nss_plugin" != "xno" ; then - if test "x$with_yajl" != "xyes" ; then + if test "x$with_jansson" != "xyes" ; then if test "x$with_nss_plugin" = "xyes" ; then - AC_MSG_ERROR([Can't build nss plugin without yajl]) + AC_MSG_ERROR([Can't build nss plugin without JSON support]) else with_nss_plugin=no fi -- 2.16.1

--- src/Makefile.am | 8 ++++---- src/util/Makefile.inc.am | 4 ++-- tests/Makefile.am | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index db8c8ebd1a..83263e69e5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -544,7 +544,7 @@ libvirt_admin_la_CFLAGS = \ libvirt_admin_la_CFLAGS += \ $(XDR_CFLAGS) \ $(CAPNG_CFLAGS) \ - $(YAJL_CFLAGS) \ + $(JANSSON_CFLAGS) \ $(SSH2_CFLAGS) \ $(SASL_CFLAGS) \ $(GNUTLS_CFLAGS) \ @@ -552,7 +552,7 @@ libvirt_admin_la_CFLAGS += \ libvirt_admin_la_LIBADD += \ $(CAPNG_LIBS) \ - $(YAJL_LIBS) \ + $(JANSSON_LIBS) \ $(DEVMAPPER_LIBS) \ $(LIBXML_LIBS) \ $(SSH2_LIBS) \ @@ -994,14 +994,14 @@ libvirt_nss_la_SOURCES = \ libvirt_nss_la_CFLAGS = \ -DLIBVIRT_NSS \ $(AM_CFLAGS) \ - $(YAJL_CFLAGS) \ + $(JANSSON_CFLAGS) \ $(NULL) libvirt_nss_la_LDFLAGS = \ $(AM_LDFLAGS) \ $(NULL) libvirt_nss_la_LIBADD = \ - $(YAJL_LIBS) \ + $(JANSSON_LIBS) \ $(NULL) endif WITH_NSS diff --git a/src/util/Makefile.inc.am b/src/util/Makefile.inc.am index a22265606c..71b2b93c2d 100644 --- a/src/util/Makefile.inc.am +++ b/src/util/Makefile.inc.am @@ -251,7 +251,7 @@ libvirt_util_la_SOURCES = \ $(NULL) libvirt_util_la_CFLAGS = \ $(CAPNG_CFLAGS) \ - $(YAJL_CFLAGS) \ + $(JANSSON_CFLAGS) \ $(LIBNL_CFLAGS) \ $(AM_CFLAGS) \ $(AUDIT_CFLAGS) \ @@ -264,7 +264,7 @@ libvirt_util_la_CFLAGS = \ $(NULL) libvirt_util_la_LIBADD = \ $(CAPNG_LIBS) \ - $(YAJL_LIBS) \ + $(JANSSON_LIBS) \ $(LIBNL_LIBS) \ $(THREAD_LIBS) \ $(AUDIT_LIBS) \ diff --git a/tests/Makefile.am b/tests/Makefile.am index 21a6c823d9..e3f0947c4b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,7 +46,7 @@ AM_CFLAGS = \ $(SASL_CFLAGS) \ $(SELINUX_CFLAGS) \ $(APPARMOR_CFLAGS) \ - $(YAJL_CFLAGS) \ + $(JANSSON_CFLAGS) \ $(COVERAGE_CFLAGS) \ $(XDR_CFLAGS) \ $(WARN_CFLAGS) -- 2.16.1

--- src/qemu/qemu_driver.c | 2 +- tests/Makefile.am | 10 +++++----- tests/cputest.c | 16 ++++++++-------- tests/libxlxml2domconfigtest.c | 4 ++-- tests/qemuagenttest.c | 2 +- tests/qemucapabilitiestest.c | 2 +- tests/qemucaps2xmltest.c | 2 +- tests/qemucommandutiltest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumigparamstest.c | 2 +- tests/qemumonitorjsontest.c | 2 +- tests/virmocklibxl.c | 4 ++-- tests/virnetdaemontest.c | 2 +- tests/virstoragetest.c | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 847dab2edc..6fb66516c2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2092,7 +2092,7 @@ qemuDomainReboot(virDomainPtr dom, unsigned int flags) */ if ((!useAgent) || (ret < 0 && (acpiRequested || !flags))) { -#if !WITH_YAJL +#if !WITH_JANSSON virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("ACPI reboot is not supported without the JSON monitor")); goto endjob; diff --git a/tests/Makefile.am b/tests/Makefile.am index e3f0947c4b..302b50e1cd 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -331,9 +331,9 @@ if WITH_CIL test_programs += objectlocking endif WITH_CIL -if WITH_YAJL +if WITH_JANSSON test_programs += virjsontest -endif WITH_YAJL +endif WITH_JANSSON test_programs += \ networkxml2xmltest \ @@ -1219,15 +1219,15 @@ virdeterministichashmock_la_LIBADD = $(MOCKLIBS_LIBS) test_libraries += virdeterministichashmock.la -if WITH_YAJL +if WITH_JANSSON virmacmaptest_SOURCES = \ virmacmaptest.c testutils.h testutils.c virmacmaptest_LDADD = $(LDADDS) test_programs += virmacmaptest -else ! WITH_YAJL +else ! WITH_JANSSON EXTRA_DIST += virmacmaptest.c -endif ! WITH_YAJL +endif ! WITH_JANSSON virnetdevtest_SOURCES = \ virnetdevtest.c testutils.h testutils.c diff --git a/tests/cputest.c b/tests/cputest.c index baf2b3c648..9cc361d125 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -40,7 +40,7 @@ #include "cpu/cpu_map.h" #include "virstring.h" -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON # include "testutilsqemu.h" # include "qemumonitortestutils.h" # define __QEMU_CAPSPRIV_H_ALLOW__ @@ -67,7 +67,7 @@ struct data { int result; }; -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON static virQEMUDriver driver; #endif @@ -479,7 +479,7 @@ typedef enum { JSON_MODELS_REQUIRED, } cpuTestCPUIDJson; -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON static virQEMUCapsPtr cpuTestMakeQEMUCaps(const struct data *data) { @@ -554,7 +554,7 @@ cpuTestGetCPUModels(const struct data *data, return 0; } -#else /* if WITH_QEMU && WITH_YAJL */ +#else /* if WITH_QEMU && WITH_JANSSON */ static int cpuTestGetCPUModels(const struct data *data, @@ -834,7 +834,7 @@ cpuTestUpdateLive(const void *arg) } -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON static int cpuTestJSONCPUID(const void *arg) { @@ -911,7 +911,7 @@ mymain(void) virDomainCapsCPUModelsPtr ppc_models = NULL; int ret = 0; -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON if (qemuTestDriverInit(&driver) < 0) return EXIT_FAILURE; @@ -1004,7 +1004,7 @@ mymain(void) host "/" cpu " (" #models ")", \ host, cpu, models, 0, result) -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON # define DO_TEST_JSON(arch, host, json) \ do { \ if (json == JSON_MODELS) { \ @@ -1205,7 +1205,7 @@ mymain(void) DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-X5460", JSON_NONE); cleanup: -#if WITH_QEMU && WITH_YAJL +#if WITH_QEMU && WITH_JANSSON qemuTestDriverFree(&driver); #endif diff --git a/tests/libxlxml2domconfigtest.c b/tests/libxlxml2domconfigtest.c index 54a92cc959..34a63e22b5 100644 --- a/tests/libxlxml2domconfigtest.c +++ b/tests/libxlxml2domconfigtest.c @@ -33,7 +33,7 @@ #include "testutils.h" -#if defined(WITH_LIBXL) && defined(WITH_YAJL) && defined(HAVE_LIBXL_DOMAIN_CONFIG_FROM_JSON) +#if defined(WITH_LIBXL) && defined(WITH_JANSSON) && defined(HAVE_LIBXL_DOMAIN_CONFIG_FROM_JSON) # include "internal.h" # include "viralloc.h" @@ -227,4 +227,4 @@ int main(void) return EXIT_AM_SKIP; } -#endif /* WITH_LIBXL && WITH_YAJL && HAVE_LIBXL_DOMAIN_CONFIG_FROM_JSON */ +#endif /* WITH_LIBXL && WITH_JANSSON && HAVE_LIBXL_DOMAIN_CONFIG_FROM_JSON */ diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c index 2f79986207..232b34f9cd 100644 --- a/tests/qemuagenttest.c +++ b/tests/qemuagenttest.c @@ -907,7 +907,7 @@ mymain(void) { int ret = 0; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 4aec175968..641ec4f597 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -141,7 +141,7 @@ mymain(void) int ret = 0; testQemuData data; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index 5b9152b04d..e3b7b97925 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -165,7 +165,7 @@ mymain(void) testQemuData data; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemucommandutiltest.c b/tests/qemucommandutiltest.c index f0921e3b93..8e57a1b79d 100644 --- a/tests/qemucommandutiltest.c +++ b/tests/qemucommandutiltest.c @@ -76,7 +76,7 @@ mymain(void) int ret = 0; testQemuCommandBuildObjectFromJSONData data1; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 663e33ed00..c7bc69ab32 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -589,7 +589,7 @@ mymain(void) struct qemuHotplugTestData data = {0}; struct testQemuHotplugCpuParams cpudata; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemumigparamstest.c b/tests/qemumigparamstest.c index 0532053722..b8af68211b 100644 --- a/tests/qemumigparamstest.c +++ b/tests/qemumigparamstest.c @@ -203,7 +203,7 @@ mymain(void) virQEMUDriver driver; int ret = 0; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index e9b2632655..c11615f7ac 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2863,7 +2863,7 @@ mymain(void) virJSONValuePtr metaschema = NULL; char *metaschemastr = NULL; -#if !WITH_YAJL +#if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; #endif diff --git a/tests/virmocklibxl.c b/tests/virmocklibxl.c index 546c6d6a43..0a047c239f 100644 --- a/tests/virmocklibxl.c +++ b/tests/virmocklibxl.c @@ -22,7 +22,7 @@ #include <config.h> -#if defined(WITH_LIBXL) && defined(WITH_YAJL) +#if defined(WITH_LIBXL) && defined(WITH_JANSSON) # include "virmock.h" # include <sys/stat.h> # include <unistd.h> @@ -136,4 +136,4 @@ VIR_MOCK_IMPL_RET_ARGS(stat, int, return real_stat(path, sb); } -#endif /* WITH_LIBXL && WITH_YAJL */ +#endif /* WITH_LIBXL && WITH_JANSSON */ diff --git a/tests/virnetdaemontest.c b/tests/virnetdaemontest.c index 6f4957fc4c..cbc961dbaf 100644 --- a/tests/virnetdaemontest.c +++ b/tests/virnetdaemontest.c @@ -26,7 +26,7 @@ #define VIR_FROM_THIS VIR_FROM_RPC -#if defined(HAVE_SOCKETPAIR) && defined(WITH_YAJL) +#if defined(HAVE_SOCKETPAIR) && defined(WITH_JANSSON) struct testClientPriv { int magic; }; diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index 68d0307d5c..b20b5a8744 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -1317,7 +1317,7 @@ mymain(void) " <host name='example.org' port='6000'/>\n" "</source>\n"); -#ifdef WITH_YAJL +#ifdef WITH_JANSSON TEST_BACKING_PARSE("json:", NULL); TEST_BACKING_PARSE("json:asdgsdfg", NULL); TEST_BACKING_PARSE("json:{}", NULL); @@ -1581,7 +1581,7 @@ mymain(void) "<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n" " <host name='example.com' port='9999'/>\n" "</source>\n"); -#endif /* WITH_YAJL */ +#endif /* WITH_JANSSON */ cleanup: /* Final cleanup */ -- 2.16.1

--- libvirt.spec.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index 6f360c5579..f83e5f8601 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -330,7 +330,7 @@ BuildRequires: systemd-devel >= 185 BuildRequires: libudev-devel >= 145 %endif BuildRequires: libpciaccess-devel >= 0.10.9 -BuildRequires: yajl-devel +BuildRequires: jansson-devel %if %{with_sanlock} BuildRequires: sanlock-devel >= 2.4 %endif @@ -1321,7 +1321,7 @@ rm -f po/stamp-po --without-apparmor \ --without-hal \ --with-udev \ - --with-yajl \ + --with-jansson \ %{?arg_sanlock} \ --with-libpcap \ --with-macvtap \ -- 2.16.1

We no longer support building WITH_YAJL, remove the dead code as well as the virJSONParser structures that are no longer used. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/util/virjson.c | 529 +---------------------------------------------------- 1 file changed, 1 insertion(+), 528 deletions(-) diff --git a/src/util/virjson.c b/src/util/virjson.c index 608ba85d67..80274bc6c5 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -29,22 +29,6 @@ #include "virstring.h" #include "virutil.h" -#if WITH_YAJL -# include <yajl/yajl_gen.h> -# include <yajl/yajl_parse.h> - -# ifdef WITH_YAJL2 -# define yajl_size_t size_t -# define VIR_YAJL_STATUS_OK(status) ((status) == yajl_status_ok) -# else -# define yajl_size_t unsigned int -# define yajl_complete_parse yajl_parse_complete -# define VIR_YAJL_STATUS_OK(status) \ - ((status) == yajl_status_ok || (status) == yajl_status_insufficient_data) -# endif - -#endif - /* XXX fixme */ #define VIR_FROM_THIS VIR_FROM_NONE @@ -88,23 +72,6 @@ struct _virJSONValue { }; -typedef struct _virJSONParserState virJSONParserState; -typedef virJSONParserState *virJSONParserStatePtr; -struct _virJSONParserState { - virJSONValuePtr value; - char *key; -}; - -typedef struct _virJSONParser virJSONParser; -typedef virJSONParser *virJSONParserPtr; -struct _virJSONParser { - virJSONValuePtr head; - virJSONParserStatePtr state; - size_t nstate; - int wrap; -}; - - virJSONType virJSONValueGetType(const virJSONValue *value) { @@ -1491,501 +1458,7 @@ virJSONValueCopy(const virJSONValue *in) } -#if WITH_YAJL -static int -virJSONParserInsertValue(virJSONParserPtr parser, - virJSONValuePtr value) -{ - if (!parser->head) { - parser->head = value; - } else { - virJSONParserStatePtr state; - if (!parser->nstate) { - VIR_DEBUG("got a value to insert without a container"); - return -1; - } - - state = &parser->state[parser->nstate-1]; - - switch (state->value->type) { - case VIR_JSON_TYPE_OBJECT: { - if (!state->key) { - VIR_DEBUG("missing key when inserting object value"); - return -1; - } - - if (virJSONValueObjectAppend(state->value, - state->key, - value) < 0) - return -1; - - VIR_FREE(state->key); - } break; - - case VIR_JSON_TYPE_ARRAY: { - if (state->key) { - VIR_DEBUG("unexpected key when inserting array value"); - return -1; - } - - if (virJSONValueArrayAppend(state->value, - value) < 0) - return -1; - } break; - - default: - VIR_DEBUG("unexpected value type, not a container"); - return -1; - } - } - - return 0; -} - - -static int -virJSONParserHandleNull(void *ctx) -{ - virJSONParserPtr parser = ctx; - virJSONValuePtr value = virJSONValueNewNull(); - - VIR_DEBUG("parser=%p", parser); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - return 1; -} - - -static int -virJSONParserHandleBoolean(void *ctx, - int boolean_) -{ - virJSONParserPtr parser = ctx; - virJSONValuePtr value = virJSONValueNewBoolean(boolean_); - - VIR_DEBUG("parser=%p boolean=%d", parser, boolean_); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - return 1; -} - - -static int -virJSONParserHandleNumber(void *ctx, - const char *s, - yajl_size_t l) -{ - virJSONParserPtr parser = ctx; - char *str; - virJSONValuePtr value; - - if (VIR_STRNDUP(str, s, l) < 0) - return -1; - value = virJSONValueNewNumber(str); - VIR_FREE(str); - - VIR_DEBUG("parser=%p str=%s", parser, str); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - return 1; -} - - -static int -virJSONParserHandleString(void *ctx, - const unsigned char *stringVal, - yajl_size_t stringLen) -{ - virJSONParserPtr parser = ctx; - virJSONValuePtr value = virJSONValueNewStringLen((const char *)stringVal, - stringLen); - - VIR_DEBUG("parser=%p str=%p", parser, (const char *)stringVal); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - return 1; -} - - -static int -virJSONParserHandleMapKey(void *ctx, - const unsigned char *stringVal, - yajl_size_t stringLen) -{ - virJSONParserPtr parser = ctx; - virJSONParserStatePtr state; - - VIR_DEBUG("parser=%p key=%p", parser, (const char *)stringVal); - - if (!parser->nstate) - return 0; - - state = &parser->state[parser->nstate-1]; - if (state->key) - return 0; - if (VIR_STRNDUP(state->key, (const char *)stringVal, stringLen) < 0) - return 0; - return 1; -} - - -static int -virJSONParserHandleStartMap(void *ctx) -{ - virJSONParserPtr parser = ctx; - virJSONValuePtr value = virJSONValueNewObject(); - - VIR_DEBUG("parser=%p", parser); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - if (VIR_REALLOC_N(parser->state, - parser->nstate + 1) < 0) { - return 0; - } - - parser->state[parser->nstate].value = value; - parser->state[parser->nstate].key = NULL; - parser->nstate++; - - return 1; -} - - -static int -virJSONParserHandleEndMap(void *ctx) -{ - virJSONParserPtr parser = ctx; - virJSONParserStatePtr state; - - VIR_DEBUG("parser=%p", parser); - - if (!parser->nstate) - return 0; - - state = &(parser->state[parser->nstate-1]); - if (state->key) { - VIR_FREE(state->key); - return 0; - } - - VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate); - - return 1; -} - - -static int -virJSONParserHandleStartArray(void *ctx) -{ - virJSONParserPtr parser = ctx; - virJSONValuePtr value = virJSONValueNewArray(); - - VIR_DEBUG("parser=%p", parser); - - if (!value) - return 0; - - if (virJSONParserInsertValue(parser, value) < 0) { - virJSONValueFree(value); - return 0; - } - - if (VIR_REALLOC_N(parser->state, - parser->nstate + 1) < 0) - return 0; - - parser->state[parser->nstate].value = value; - parser->state[parser->nstate].key = NULL; - parser->nstate++; - - return 1; -} - - -static int -virJSONParserHandleEndArray(void *ctx) -{ - virJSONParserPtr parser = ctx; - virJSONParserStatePtr state; - - VIR_DEBUG("parser=%p", parser); - - if (!(parser->nstate - parser->wrap)) - return 0; - - state = &(parser->state[parser->nstate-1]); - if (state->key) { - VIR_FREE(state->key); - return 0; - } - - VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate); - - return 1; -} - - -static const yajl_callbacks parserCallbacks = { - virJSONParserHandleNull, - virJSONParserHandleBoolean, - NULL, - NULL, - virJSONParserHandleNumber, - virJSONParserHandleString, - virJSONParserHandleStartMap, - virJSONParserHandleMapKey, - virJSONParserHandleEndMap, - virJSONParserHandleStartArray, - virJSONParserHandleEndArray -}; - - -/* XXX add an incremental streaming parser - yajl trivially supports it */ -virJSONValuePtr -virJSONValueFromString(const char *jsonstring) -{ - yajl_handle hand; - virJSONParser parser = { NULL, NULL, 0, 0 }; - virJSONValuePtr ret = NULL; - int rc; - size_t len = strlen(jsonstring); -# ifndef WITH_YAJL2 - yajl_parser_config cfg = { 0, 1 }; /* Match yajl 2 default behavior */ - VIR_AUTOPTR(virJSONValue) tmp = NULL; -# endif - - VIR_DEBUG("string=%s", jsonstring); - -# ifdef WITH_YAJL2 - hand = yajl_alloc(&parserCallbacks, NULL, &parser); -# else - hand = yajl_alloc(&parserCallbacks, &cfg, NULL, &parser); -# endif - if (!hand) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to create JSON parser")); - goto cleanup; - } - - /* Yajl 2 is nice enough to default to rejecting trailing garbage. - * Yajl 1.0.12 has yajl_get_bytes_consumed to make that detection - * simpler. But we're stuck with yajl 1.0.7 on RHEL 6, which - * happily quits parsing at the end of a valid JSON construct, - * with no visibility into how much more input remains. Wrapping - * things in an array forces yajl to confess the truth. */ -# ifdef WITH_YAJL2 - rc = yajl_parse(hand, (const unsigned char *)jsonstring, len); -# else - rc = yajl_parse(hand, (const unsigned char *)"[", 1); - parser.wrap = 1; - if (VIR_YAJL_STATUS_OK(rc)) - rc = yajl_parse(hand, (const unsigned char *)jsonstring, len); - parser.wrap = 0; - if (VIR_YAJL_STATUS_OK(rc)) - rc = yajl_parse(hand, (const unsigned char *)"]", 1); -# endif - if (!VIR_YAJL_STATUS_OK(rc) || - yajl_complete_parse(hand) != yajl_status_ok) { - unsigned char *errstr = yajl_get_error(hand, 1, - (const unsigned char*)jsonstring, - strlen(jsonstring)); - - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse json %s: %s"), - jsonstring, (const char*) errstr); - yajl_free_error(hand, errstr); - virJSONValueFree(parser.head); - goto cleanup; - } - - if (parser.nstate != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse json %s: unterminated string/map/array"), - jsonstring); - virJSONValueFree(parser.head); - } else { - ret = parser.head; -# ifndef WITH_YAJL2 - /* Undo the array wrapping above */ - tmp = ret; - ret = NULL; - if (virJSONValueArraySize(tmp) > 1) - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse json %s: too many items present"), - jsonstring); - else - ret = virJSONValueArraySteal(tmp, 0); -# endif - } - - cleanup: - yajl_free(hand); - - if (parser.nstate) { - size_t i; - for (i = 0; i < parser.nstate; i++) - VIR_FREE(parser.state[i].key); - VIR_FREE(parser.state); - } - - VIR_DEBUG("result=%p", ret); - - return ret; -} - - -static int -virJSONValueToStringOne(virJSONValuePtr object, - yajl_gen g) -{ - size_t i; - - VIR_DEBUG("object=%p type=%d gen=%p", object, object->type, g); - - switch (object->type) { - case VIR_JSON_TYPE_OBJECT: - if (yajl_gen_map_open(g) != yajl_gen_status_ok) - return -1; - for (i = 0; i < object->data.object.npairs; i++) { - if (yajl_gen_string(g, - (unsigned char *)object->data.object.pairs[i].key, - strlen(object->data.object.pairs[i].key)) - != yajl_gen_status_ok) - return -1; - if (virJSONValueToStringOne(object->data.object.pairs[i].value, g) < 0) - return -1; - } - if (yajl_gen_map_close(g) != yajl_gen_status_ok) - return -1; - break; - case VIR_JSON_TYPE_ARRAY: - if (yajl_gen_array_open(g) != yajl_gen_status_ok) - return -1; - for (i = 0; i < object->data.array.nvalues; i++) { - if (virJSONValueToStringOne(object->data.array.values[i], g) < 0) - return -1; - } - if (yajl_gen_array_close(g) != yajl_gen_status_ok) - return -1; - break; - - case VIR_JSON_TYPE_STRING: - if (yajl_gen_string(g, (unsigned char *)object->data.string, - strlen(object->data.string)) != yajl_gen_status_ok) - return -1; - break; - - case VIR_JSON_TYPE_NUMBER: - if (yajl_gen_number(g, object->data.number, - strlen(object->data.number)) != yajl_gen_status_ok) - return -1; - break; - - case VIR_JSON_TYPE_BOOLEAN: - if (yajl_gen_bool(g, object->data.boolean) != yajl_gen_status_ok) - return -1; - break; - - case VIR_JSON_TYPE_NULL: - if (yajl_gen_null(g) != yajl_gen_status_ok) - return -1; - break; - - default: - return -1; - } - - return 0; -} - - -char * -virJSONValueToString(virJSONValuePtr object, - bool pretty) -{ - yajl_gen g; - const unsigned char *str; - char *ret = NULL; - yajl_size_t len; -# ifndef WITH_YAJL2 - yajl_gen_config conf = { pretty ? 1 : 0, pretty ? " " : " "}; -# endif - - VIR_DEBUG("object=%p", object); - -# ifdef WITH_YAJL2 - g = yajl_gen_alloc(NULL); - if (g) { - yajl_gen_config(g, yajl_gen_beautify, pretty ? 1 : 0); - yajl_gen_config(g, yajl_gen_indent_string, pretty ? " " : " "); - yajl_gen_config(g, yajl_gen_validate_utf8, 1); - } -# else - g = yajl_gen_alloc(&conf, NULL); -# endif - if (!g) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to create JSON formatter")); - goto cleanup; - } - - if (virJSONValueToStringOne(object, g) < 0) { - virReportOOMError(); - goto cleanup; - } - - if (yajl_gen_get_buf(g, &str, &len) != yajl_gen_status_ok) { - virReportOOMError(); - goto cleanup; - } - - ignore_value(VIR_STRDUP(ret, (const char *)str)); - - cleanup: - yajl_gen_free(g); - - VIR_DEBUG("result=%s", NULLSTR(ret)); - - return ret; -} - - -#elif WITH_JANSSON +#if WITH_JANSSON # include <jansson.h> static virJSONValuePtr -- 2.16.1

We no longer allow building WITH_YAJL, remove the remaining uses of the macro. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- config-post.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/config-post.h b/config-post.h index 24117bbbd4..05672121f0 100644 --- a/config-post.h +++ b/config-post.h @@ -44,8 +44,6 @@ # undef WITH_SSH2 # undef WITH_SYSTEMD_DAEMON # undef WITH_VIRTUALPORT -# undef WITH_YAJL -# undef WITH_YAJL2 #endif /* -- 2.16.1

It is no longer used. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/libvirt_private.syms | 1 - src/util/virjson.c | 22 ---------------------- src/util/virjson.h | 1 - 3 files changed, 24 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1caecb96b6..c27c224e93 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2096,7 +2096,6 @@ virJSONValueNewNumberUint; virJSONValueNewNumberUlong; virJSONValueNewObject; virJSONValueNewString; -virJSONValueNewStringLen; virJSONValueObjectAdd; virJSONValueObjectAddVArgs; virJSONValueObjectAppend; diff --git a/src/util/virjson.c b/src/util/virjson.c index 80274bc6c5..01a387b2f7 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -420,28 +420,6 @@ virJSONValueNewString(const char *data) } -virJSONValuePtr -virJSONValueNewStringLen(const char *data, - size_t length) -{ - virJSONValuePtr val; - - if (!data) - return virJSONValueNewNull(); - - if (VIR_ALLOC(val) < 0) - return NULL; - - val->type = VIR_JSON_TYPE_STRING; - if (VIR_STRNDUP(val->data.string, data, length) < 0) { - VIR_FREE(val); - return NULL; - } - - return val; -} - - static virJSONValuePtr virJSONValueNewNumber(const char *data) { diff --git a/src/util/virjson.h b/src/util/virjson.h index 75f7f17b44..0d5a7ef753 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -59,7 +59,6 @@ int virJSONValueObjectAddVArgs(virJSONValuePtr obj, va_list args) virJSONValuePtr virJSONValueNewString(const char *data); -virJSONValuePtr virJSONValueNewStringLen(const char *data, size_t length); virJSONValuePtr virJSONValueNewNumberInt(int data); virJSONValuePtr virJSONValueNewNumberUint(unsigned int data); virJSONValuePtr virJSONValueNewNumberLong(long long data); -- 2.16.1

Unless explicitly requested, enable the QEMU driver only if the Jansson library is present. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-driver-qemu.m4 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/m4/virt-driver-qemu.m4 b/m4/virt-driver-qemu.m4 index 80e1d3ad46..ddb2834705 100644 --- a/m4/virt-driver-qemu.m4 +++ b/m4/virt-driver-qemu.m4 @@ -18,7 +18,7 @@ dnl <http://www.gnu.org/licenses/>. dnl AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [ - LIBVIRT_ARG_WITH_FEATURE([QEMU], [QEMU/KVM], [yes]) + LIBVIRT_ARG_WITH_FEATURE([QEMU], [QEMU/KVM], [check]) LIBVIRT_ARG_WITH([QEMU_USER], [username to run QEMU system instance as], ['platform dependent']) LIBVIRT_ARG_WITH([QEMU_GROUP], [groupname to run QEMU system instance as], @@ -26,6 +26,10 @@ AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [ ]) AC_DEFUN([LIBVIRT_DRIVER_CHECK_QEMU], [ + AC_REQUIRE([LIBVIRT_CHECK_JANSSON]) + if test "$with_qemu" = "check"; then + with_qemu=$with_jansson + fi if test "$with_qemu" = "yes" ; then AC_DEFINE_UNQUOTED([WITH_QEMU], 1, [whether QEMU driver is enabled]) fi -- 2.16.1

On 07/18/2018 10:44 AM, Ján Tomko wrote:
Unless explicitly requested, enable the QEMU driver only if the Jansson library is present.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-driver-qemu.m4 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Perhaps it's obvious for someone else, but I think there some sort of dependency missing. Starting with this patch I found that my with-qemu "went away". I have: jansson.x86_64 2.11-1.fc28 @fedora But not: jansson-devel x86_64 2.11-1.fc28 fedora 15 k If I explicitly add --with-jansson onto the command line, then I get: checking for JANSSON... no configure: error: You must install the jansson >= 2.5 pkg-config module to compile libvirt error: configure failed If I then install jansson-devel, the build succeeds. Honestly I think we need to be much more in your face in this instance - something isn't quite right and it eventually leads to some really strange results because nothing in/for qemu is built, but you are left with old build bits in your tree. Eventually something fails. This whole build/config system is a generally a mystery to me, so I have zero suggestions. Ironically if I had to build from source, I'd know from libvirt.spec that jansson-devel was required, although there's no
= version check so that probably should be fixed.
Suffice to say digging into the config.log trying to figure why one's QEMU is disabled is not an enjoyable or easy experience. Yeah, yeah, we're developers we're supposed to be smart, we get what we get... I'll bet some qemu devel will hit this some day and wonder how to actually build libvirt with qemu because it's not obvious and it "used to be" a default=yes. John Off to go drown the rest of my frustration ;-)
diff --git a/m4/virt-driver-qemu.m4 b/m4/virt-driver-qemu.m4 index 80e1d3ad46..ddb2834705 100644 --- a/m4/virt-driver-qemu.m4 +++ b/m4/virt-driver-qemu.m4 @@ -18,7 +18,7 @@ dnl <http://www.gnu.org/licenses/>. dnl
AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [ - LIBVIRT_ARG_WITH_FEATURE([QEMU], [QEMU/KVM], [yes]) + LIBVIRT_ARG_WITH_FEATURE([QEMU], [QEMU/KVM], [check]) LIBVIRT_ARG_WITH([QEMU_USER], [username to run QEMU system instance as], ['platform dependent']) LIBVIRT_ARG_WITH([QEMU_GROUP], [groupname to run QEMU system instance as], @@ -26,6 +26,10 @@ AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [ ])
AC_DEFUN([LIBVIRT_DRIVER_CHECK_QEMU], [ + AC_REQUIRE([LIBVIRT_CHECK_JANSSON]) + if test "$with_qemu" = "check"; then + with_qemu=$with_jansson + fi if test "$with_qemu" = "yes" ; then AC_DEFINE_UNQUOTED([WITH_QEMU], 1, [whether QEMU driver is enabled]) fi

On Thu, Jul 19, 2018 at 07:38:15PM -0400, John Ferlan wrote:
On 07/18/2018 10:44 AM, Ján Tomko wrote:
Unless explicitly requested, enable the QEMU driver only if the Jansson library is present.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-driver-qemu.m4 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Perhaps it's obvious for someone else, but I think there some sort of dependency missing. Starting with this patch I found that my with-qemu "went away".
I have:
jansson.x86_64 2.11-1.fc28 @fedora
But not:
jansson-devel x86_64 2.11-1.fc28 fedora 15 k
If I explicitly add --with-jansson onto the command line, then I get:
checking for JANSSON... no configure: error: You must install the jansson >= 2.5 pkg-config module to compile libvirt error: configure failed
If I then install jansson-devel, the build succeeds.
Honestly I think we need to be much more in your face in this instance - something isn't quite right and it eventually leads to some really strange results because nothing in/for qemu is built, but you are left with old build bits in your tree. Eventually something fails.
There was not that much discussion about it: https://www.redhat.com/archives/libvir-list/2018-May/msg01321.html I do not oppose reverting this bit and failing by default if we don't have a JSON library (as Andrea mentioned, more drivers might possibly require a working JSON implementation). However after dropping old QEMU support, building QEMU driver without JSON makes no sense. (There was some logic in virt-yajl.m4 that tried to figure out whether lack of yajl should be fatal based on the version of the QEMU executable present on the system).
This whole build/config system is a generally a mystery to me, so I have zero suggestions. Ironically if I had to build from source, I'd know from libvirt.spec that jansson-devel was required, although there's no
= version check so that probably should be fixed.
Right, the specfile still has: %define min_rhel 6
Suffice to say digging into the config.log trying to figure why one's QEMU is disabled is not an enjoyable or easy experience.
Yeah, yeah, we're developers we're supposed to be smart, we get what we get... I'll bet some qemu devel will hit this some day and wonder how to actually build libvirt with qemu because it's not obvious and it "used to be" a default=yes.
I expected that people surprised by the lack of QEMU driver would pass --with-qemu, which should have the proper error. Jano
John
Off to go drown the rest of my frustration ;-)

On Fri, Jul 20, 2018 at 12:24:50PM +0200, Ján Tomko wrote:
On Thu, Jul 19, 2018 at 07:38:15PM -0400, John Ferlan wrote:
On 07/18/2018 10:44 AM, Ján Tomko wrote:
Unless explicitly requested, enable the QEMU driver only if the Jansson library is present.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-driver-qemu.m4 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Perhaps it's obvious for someone else, but I think there some sort of dependency missing. Starting with this patch I found that my with-qemu "went away".
I have:
jansson.x86_64 2.11-1.fc28 @fedora
But not:
jansson-devel x86_64 2.11-1.fc28 fedora 15 k
If I explicitly add --with-jansson onto the command line, then I get:
checking for JANSSON... no configure: error: You must install the jansson >= 2.5 pkg-config module to compile libvirt error: configure failed
If I then install jansson-devel, the build succeeds.
Honestly I think we need to be much more in your face in this instance - something isn't quite right and it eventually leads to some really strange results because nothing in/for qemu is built, but you are left with old build bits in your tree. Eventually something fails.
There was not that much discussion about it: https://www.redhat.com/archives/libvir-list/2018-May/msg01321.html
I do not oppose reverting this bit and failing by default if we don't have a JSON library (as Andrea mentioned, more drivers might possibly require a working JSON implementation).
We use virjson.h throughout src/util and src/rpc so that code is not even driver specific, however, there are not currently mingw pacakges for jansson in Fedora at least. Maybe it will work, but we would need someone todo the work to add that to Fedora before we can consider making this mandatory. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, 2018-07-20 at 11:33 +0100, Daniel P. Berrangé wrote:
On Fri, Jul 20, 2018 at 12:24:50PM +0200, Ján Tomko wrote:
I do not oppose reverting this bit and failing by default if we don't have a JSON library (as Andrea mentioned, more drivers might possibly require a working JSON implementation).
We use virjson.h throughout src/util and src/rpc so that code is not even driver specific, however, there are not currently mingw pacakges for jansson in Fedora at least. Maybe it will work, but we would need someone todo the work to add that to Fedora before we can consider making this mandatory.
So does the MinGW build work at all without jansson, considering its functionality is fairly reduced in scope compared to the Unix builds? Either way, at least Arch seems to have a MinGW package for it: https://aur.archlinux.org/packages/mingw-w64-jansson/ so it's probably just a matter of sitting down, coming up with a suitable .spec and getting it into Fedora. -- Andrea Bolognani / Red Hat / Virtualization

On Mon, 2018-07-23 at 09:27 +0200, Andrea Bolognani wrote:
On Fri, 2018-07-20 at 11:33 +0100, Daniel P. Berrangé wrote:
On Fri, Jul 20, 2018 at 12:24:50PM +0200, Ján Tomko wrote:
I do not oppose reverting this bit and failing by default if we don't have a JSON library (as Andrea mentioned, more drivers might possibly require a working JSON implementation).
We use virjson.h throughout src/util and src/rpc so that code is not even driver specific, however, there are not currently mingw pacakges for jansson in Fedora at least. Maybe it will work, but we would need someone todo the work to add that to Fedora before we can consider making this mandatory.
So does the MinGW build work at all without jansson, considering its functionality is fairly reduced in scope compared to the Unix builds?
Partially answering myself (morning coffee hasn't quite kicked in just yet), the MinGW .spec doesn't list yajl as a BuildRequires, which means that either we're not hitting any of the code paths you mention on that platform, or we've been producing completely useless Windows builds for a while now :) -- Andrea Bolognani / Red Hat / Virtualization

On Mon, Jul 23, 2018 at 09:38:47AM +0200, Andrea Bolognani wrote:
On Mon, 2018-07-23 at 09:27 +0200, Andrea Bolognani wrote:
On Fri, 2018-07-20 at 11:33 +0100, Daniel P. Berrangé wrote:
On Fri, Jul 20, 2018 at 12:24:50PM +0200, Ján Tomko wrote:
I do not oppose reverting this bit and failing by default if we don't have a JSON library (as Andrea mentioned, more drivers might possibly require a working JSON implementation).
We use virjson.h throughout src/util and src/rpc so that code is not even driver specific, however, there are not currently mingw pacakges for jansson in Fedora at least. Maybe it will work, but we would need someone todo the work to add that to Fedora before we can consider making this mandatory.
So does the MinGW build work at all without jansson, considering its functionality is fairly reduced in scope compared to the Unix builds?
Partially answering myself (morning coffee hasn't quite kicked in just yet), the MinGW .spec doesn't list yajl as a BuildRequires, which means that either we're not hitting any of the code paths you mention on that platform, or we've been producing completely useless Windows builds for a while now :)
The remote driver works fine without JSON being required. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Mon, 2018-07-23 at 10:27 +0100, Daniel P. Berrangé wrote:
On Mon, Jul 23, 2018 at 09:38:47AM +0200, Andrea Bolognani wrote:
Partially answering myself (morning coffee hasn't quite kicked in just yet), the MinGW .spec doesn't list yajl as a BuildRequires, which means that either we're not hitting any of the code paths you mention on that platform, or we've been producing completely useless Windows builds for a while now :)
The remote driver works fine without JSON being required.
That being the case, not having jansson as mandatory sounds like the proper thing to do, at least from the theoretical point of view: even if you build without it, you can still get *some* functionality out of libvirt, so it's kinda hard to argue for it being a strict requirement the same way something like libxml2 is. -- Andrea Bolognani / Red Hat / Virtualization

If the QEMU driver was requested, require Jansson, since we need to use the JSON monitor to probe capabilities for all QEMU version supported by libvirt. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-driver-qemu.m4 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/m4/virt-driver-qemu.m4 b/m4/virt-driver-qemu.m4 index ddb2834705..2d9992d0dc 100644 --- a/m4/virt-driver-qemu.m4 +++ b/m4/virt-driver-qemu.m4 @@ -27,6 +27,9 @@ AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [ AC_DEFUN([LIBVIRT_DRIVER_CHECK_QEMU], [ AC_REQUIRE([LIBVIRT_CHECK_JANSSON]) + if test "$with_qemu:$with_jansson" = "yes:no"; then + AC_MSG_ERROR([Jansson >= 2.5 is required to build QEMU driver]) + fi if test "$with_qemu" = "check"; then with_qemu=$with_jansson fi -- 2.16.1

Add a second check for Jansson >= 2.8, which includes fixes to preserve ordering of object keys. Use this constant to guard tests that depend on stable ordering. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-jansson.m4 | 3 +++ tests/qemublocktest.c | 5 +++++ tests/qemucapabilitiestest.c | 5 +++++ tests/qemucommandutiltest.c | 5 +++++ tests/qemuhotplugtest.c | 5 +++++ tests/qemumigparamstest.c | 5 +++++ tests/qemumonitorjsontest.c | 5 +++++ tests/virjsontest.c | 5 +++++ tests/virmacmaptest.c | 5 +++++ tests/virnetdaemontest.c | 5 +++++ 10 files changed, 48 insertions(+) diff --git a/m4/virt-jansson.m4 b/m4/virt-jansson.m4 index 206d6a5ced..ab4c020f62 100644 --- a/m4/virt-jansson.m4 +++ b/m4/virt-jansson.m4 @@ -22,6 +22,9 @@ AC_DEFUN([LIBVIRT_ARG_JANSSON],[ AC_DEFUN([LIBVIRT_CHECK_JANSSON],[ dnl Jansson http://www.digip.org/jansson/ LIBVIRT_CHECK_PKG([JANSSON], [jansson], [2.5]) + dnl Older versions of Jansson did not preserve the order of object keys + dnl use this check to guard the tests that are sensitive to this + LIBVIRT_CHECK_PKG([STABLE_ORDERING_JANSSON], [jansson], [2.8], [true]) ]) AC_DEFUN([LIBVIRT_RESULT_JANSSON],[ diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c index 9a387cf063..d22b4b754e 100644 --- a/tests/qemublocktest.c +++ b/tests/qemublocktest.c @@ -337,6 +337,11 @@ mymain(void) char *capslatest_x86_64 = NULL; virQEMUCapsPtr caps_x86_64 = NULL; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + if (qemuTestDriverInit(&driver) < 0) return EXIT_FAILURE; diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 641ec4f597..28f903a88c 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -141,6 +141,11 @@ mymain(void) int ret = 0; testQemuData data; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; diff --git a/tests/qemucommandutiltest.c b/tests/qemucommandutiltest.c index 8e57a1b79d..9b13dde63f 100644 --- a/tests/qemucommandutiltest.c +++ b/tests/qemucommandutiltest.c @@ -76,6 +76,11 @@ mymain(void) int ret = 0; testQemuCommandBuildObjectFromJSONData data1; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index c7bc69ab32..674ba92b27 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -589,6 +589,11 @@ mymain(void) struct qemuHotplugTestData data = {0}; struct testQemuHotplugCpuParams cpudata; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; diff --git a/tests/qemumigparamstest.c b/tests/qemumigparamstest.c index b8af68211b..5e12430991 100644 --- a/tests/qemumigparamstest.c +++ b/tests/qemumigparamstest.c @@ -203,6 +203,11 @@ mymain(void) virQEMUDriver driver; int ret = 0; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index c11615f7ac..1826c4f297 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2863,6 +2863,11 @@ mymain(void) virJSONValuePtr metaschema = NULL; char *metaschemastr = NULL; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #if !WITH_JANSSON fputs("libvirt not compiled with JSON support, skipping this test\n", stderr); return EXIT_AM_SKIP; diff --git a/tests/virjsontest.c b/tests/virjsontest.c index d42413d11d..d352d370fd 100644 --- a/tests/virjsontest.c +++ b/tests/virjsontest.c @@ -479,6 +479,11 @@ mymain(void) { int ret = 0; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #define DO_TEST_FULL(name, cmd, doc, expect, pass) \ do { \ struct testInfo info = { doc, expect, pass }; \ diff --git a/tests/virmacmaptest.c b/tests/virmacmaptest.c index 6e3e9984d1..420531dcdb 100644 --- a/tests/virmacmaptest.c +++ b/tests/virmacmaptest.c @@ -157,6 +157,11 @@ mymain(void) int ret = 0; virMacMapPtr mgr = NULL; +#if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + #define DO_TEST_BASIC(f, d, ...) \ do { \ const char * const m[] = {__VA_ARGS__, NULL }; \ diff --git a/tests/virnetdaemontest.c b/tests/virnetdaemontest.c index cbc961dbaf..277fb06385 100644 --- a/tests/virnetdaemontest.c +++ b/tests/virnetdaemontest.c @@ -375,6 +375,11 @@ mymain(void) int ret = 0; const char *server_names[] = { "testServer0", "testServer1" }; +# if !WITH_STABLE_ORDERING_JANSSON + fputs("libvirt not compiled with recent enough Jansson, skipping this test\n", stderr); + return EXIT_AM_SKIP; +# endif + if (virInitialize() < 0 || virEventRegisterDefaultImpl() < 0) { virDispatchError(NULL); -- 2.16.1

On Wed, Jul 18, 2018 at 16:44:40 +0200, Ján Tomko wrote:
Add a second check for Jansson >= 2.8, which includes fixes to preserve ordering of object keys.
Use this constant to guard tests that depend on stable ordering.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- m4/virt-jansson.m4 | 3 +++ tests/qemublocktest.c | 5 +++++ tests/qemucapabilitiestest.c | 5 +++++ tests/qemucommandutiltest.c | 5 +++++ tests/qemuhotplugtest.c | 5 +++++ tests/qemumigparamstest.c | 5 +++++ tests/qemumonitorjsontest.c | 5 +++++ tests/virjsontest.c | 5 +++++ tests/virmacmaptest.c | 5 +++++ tests/virnetdaemontest.c | 5 +++++ 10 files changed, 48 insertions(+)
Disclamer: I don't have old enough jansson to test this. ACK, way better than messing with all the data files.
participants (5)
-
Andrea Bolognani
-
Daniel P. Berrangé
-
John Ferlan
-
Ján Tomko
-
Peter Krempa