[libvirt] [PATCHv2 07/12] FIXUP: Remove functions using yajl

Peter Krempa pkrempa at redhat.com
Fri May 11 07:58:17 UTC 2018


On Thu, May 10, 2018 at 18:44:19 +0200, Ján Tomko wrote:
> ---
>  m4/virt-yajl.m4    |  27 +--
>  src/util/virjson.c | 530 +----------------------------------------------------
>  2 files changed, 4 insertions(+), 553 deletions(-)

This patch can be mostly separated if you want to do it by ...

> 
> 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
>  ])

Leaving this part in the patch switching to janson ...

>  
>  AC_DEFUN([LIBVIRT_RESULT_YAJL],[
> diff --git a/src/util/virjson.c b/src/util/virjson.c
> index cb38c35522..eab498222e 100644
> --- a/src/util/virjson.c
> +++ b/src/util/virjson.c
> @@ -30,22 +30,6 @@
>  #include "virstring.h"
>  #include "virutil.h"
>  
> -#if WITH_YAJL

And this will not get compiled in, so it can be nuked later.

> -# 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
>  
> @@ -89,23 +73,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)
>  {
> @@ -1516,502 +1483,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 */
> -    virJSONValuePtr tmp;
> -# 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);
> -        virJSONValueFree(tmp);
> -# 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>

At any rate ... ACK to this bit.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180511/1572e8c2/attachment-0001.sig>


More information about the libvir-list mailing list