xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Wei Liu <wei.liu2@citrix.com>
To: xen-devel@lists.xen.org
Cc: Wei Liu <wei.liu2@citrix.com>,
	ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [PATCH V5 16/32] libxl_json: introduce parser functions for builtin types
Date: Tue, 13 May 2014 22:53:58 +0100	[thread overview]
Message-ID: <1400018054-26038-17-git-send-email-wei.liu2@citrix.com> (raw)
In-Reply-To: <1400018054-26038-1-git-send-email-wei.liu2@citrix.com>

This changeset introduces following functions:
 * libxl_defbool_parse_json
 * libxl__bool_parse_json
 * libxl_uuid_parse_json
 * libxl_mac_parse_json
 * libxl_bitmap_parse_json
 * libxl_cpuid_policy_list_parse_json
 * libxl_string_list_parse_json
 * libxl_key_value_list_parse_json
 * libxl_hwcap_parse_json
 * libxl__int_parse_json
 * libxl__uint{8,16,32,64}_parse_json
 * libxl__string_parse_json

They will be used in later patch to convert the libxl__json_object
tree of a builtin type to libxl_FOO struct.

Also remove declaration of libxl_domid_gen_json as libxl_domid uses
yajl_gen_integer to generate JSON object.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Anthony Perard <anthony.perard@citrix.com>
---
 tools/libxl/libxl_cpuid.c   |   89 +++++++++++---
 tools/libxl/libxl_json.c    |  271 +++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_json.h    |   36 +++++-
 tools/libxl/libxl_nocpuid.c |    7 ++
 4 files changed, 386 insertions(+), 17 deletions(-)

diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c
index 3787213..d9007b2 100644
--- a/tools/libxl/libxl_cpuid.c
+++ b/tools/libxl/libxl_cpuid.c
@@ -338,29 +338,29 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
                      (const char**)(cpuid[i].policy), cpuid_res);
 }
 
+static const char *input_names[2] = { "leaf", "subleaf" };
+static const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
+/*
+ * Aiming for:
+ * [
+ *     { 'leaf':    'val-eax',
+ *       'subleaf': 'val-ecx',
+ *       'eax':     'filter',
+ *       'ebx':     'filter',
+ *       'ecx':     'filter',
+ *       'edx':     'filter' },
+ *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
+ *     ... etc ...
+ * ]
+ */
+
 yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
                                 libxl_cpuid_policy_list *pcpuid)
 {
     libxl_cpuid_policy_list cpuid = *pcpuid;
     yajl_gen_status s;
-    const char *input_names[2] = { "leaf", "subleaf" };
-    const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
     int i, j;
 
-    /*
-     * Aiming for:
-     * [
-     *     { 'leaf':    'val-eax',
-     *       'subleaf': 'val-ecx',
-     *       'eax':     'filter',
-     *       'ebx':     'filter',
-     *       'ecx':     'filter',
-     *       'edx':     'filter' },
-     *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
-     *     ... etc ...
-     * ]
-     */
-
     s = yajl_gen_array_open(hand);
     if (s != yajl_gen_status_ok) goto out;
 
@@ -398,6 +398,63 @@ out:
     return s;
 }
 
+int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
+                                       const libxl__json_object *o,
+                                       libxl_cpuid_policy_list *p)
+{
+    int i, size;
+    libxl_cpuid_policy_list l;
+    flexarray_t *array;
+
+    if (!libxl__json_object_is_array(o))
+        return ERROR_FAIL;
+
+    array = libxl__json_object_get_array(o);
+    if (!array->count)
+        return 0;
+
+    size = array->count;
+    /* need one extra slot as sentinel */
+    l = *p = libxl__calloc(NOGC, size + 1, sizeof(libxl_cpuid_policy));
+
+    l[size].input[0] = XEN_CPUID_INPUT_UNUSED;
+    l[size].input[1] = XEN_CPUID_INPUT_UNUSED;
+
+    for (i = 0; i < size; i++) {
+        const libxl__json_object *t;
+        int j;
+
+        if (flexarray_get(array, i, (void**)&t) != 0)
+            return ERROR_FAIL;
+
+        if (!libxl__json_object_is_map(t))
+            return ERROR_FAIL;
+
+        for (j = 0; j < ARRAY_SIZE(l[0].input); j++) {
+            const libxl__json_object *r;
+
+            r = libxl__json_map_get(input_names[j], t, JSON_INTEGER);
+            if (!r)
+                l[i].input[j] = XEN_CPUID_INPUT_UNUSED;
+            else
+                l[i].input[j] = libxl__json_object_get_integer(r);
+        }
+
+        for (j = 0; j < ARRAY_SIZE(l[0].policy); j++) {
+            const libxl__json_object *r;
+
+            r = libxl__json_map_get(policy_names[j], t, JSON_STRING);
+            if (!r)
+                l[i].policy[j] = NULL;
+            else
+                l[i].policy[j] =
+                    libxl__strdup(NOGC, libxl__json_object_get_string(r));
+        }
+    }
+
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 178db45..bbc1618 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -100,6 +100,42 @@ yajl_gen_status libxl_defbool_gen_json(yajl_gen hand,
     return libxl__yajl_gen_asciiz(hand, libxl_defbool_to_string(*db));
 }
 
+int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             libxl_defbool *p)
+{
+    const char *s;
+
+    if (!libxl__json_object_is_string(o))
+        return ERROR_FAIL;
+
+    s = libxl__json_object_get_string(o);
+
+    if (!strncmp(s, LIBXL__DEFBOOL_STR_DEFAULT,
+                 strlen(LIBXL__DEFBOOL_STR_DEFAULT)))
+        p->val = LIBXL__DEFBOOL_DEFAULT;
+    else if (!strncmp(s, LIBXL__DEFBOOL_STR_TRUE,
+                      strlen(LIBXL__DEFBOOL_STR_TRUE)))
+        p->val = LIBXL__DEFBOOL_TRUE;
+    else if (!strncmp(s, LIBXL__DEFBOOL_STR_FALSE,
+                      strlen(LIBXL__DEFBOOL_STR_FALSE)))
+        p->val = LIBXL__DEFBOOL_FALSE;
+    else
+        return ERROR_FAIL;
+
+    return 0;
+}
+
+int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                           bool *p)
+{
+    if (!libxl__json_object_is_bool(o))
+        return ERROR_FAIL;
+
+    *p = libxl__json_object_get_bool(o);
+
+    return 0;
+}
+
 yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
                                     libxl_uuid *uuid)
 {
@@ -108,6 +144,15 @@ yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
     return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_UUID_FMTLEN);
 }
 
+int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                          libxl_uuid *p)
+{
+    if (!libxl__json_object_is_string(o))
+        return ERROR_FAIL;
+
+    return libxl_uuid_from_string(p, o->u.string);
+}
+
 yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand,
                                       libxl_bitmap *bitmap)
 {
@@ -128,6 +173,40 @@ out:
     return s;
 }
 
+int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                            libxl_bitmap *p)
+{
+    int i;
+    int size;
+    const libxl__json_object *t;
+    flexarray_t *array;
+
+    if (!libxl__json_object_is_array(o))
+        return ERROR_FAIL;
+
+    array = libxl__json_object_get_array(o);
+    if (!array->count) {
+        libxl_bitmap_init(p);
+        return 0;
+    }
+
+    t = libxl__json_array_get(o, array->count - 1);
+    if (!libxl__json_object_is_integer(t))
+        return ERROR_FAIL;
+    size = libxl__json_object_get_integer(t) + 1;
+
+    libxl_bitmap_alloc(CTX, p, size);
+
+    for (i = 0; (t = libxl__json_array_get(o, i)); i++) {
+        if (!libxl__json_object_is_integer(t))
+            return ERROR_FAIL;
+
+        libxl_bitmap_set(p, libxl__json_object_get_integer(t));
+    }
+
+    return 0;
+}
+
 yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
                                               libxl_key_value_list *pkvl)
 {
@@ -155,6 +234,41 @@ out:
     return s;
 }
 
+int libxl_key_value_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                                    libxl_key_value_list *p)
+{
+    libxl__json_map_node *node = NULL;
+    flexarray_t *maps = NULL;
+    int i, size;
+    libxl_key_value_list kvl;
+
+    if (!libxl__json_object_is_map(o))
+        return ERROR_FAIL;
+
+    maps = libxl__json_object_get_map(o);
+    size = maps->count * 2;
+    kvl = *p = libxl__calloc(NOGC, size, sizeof(char *));
+
+    for (i = 0; i < maps->count; i++) {
+        int idx = i * 2;
+        if (flexarray_get(maps, i, (void**)&node) != 0)
+            return ERROR_FAIL;
+
+        if (!libxl__json_object_is_string(node->obj) &&
+            !libxl__json_object_is_null(node->obj))
+            return ERROR_FAIL;
+
+        kvl[idx] = libxl__strdup(NOGC, node->map_key);
+        if (libxl__json_object_is_string(node->obj))
+            kvl[idx+1] =
+                libxl__strdup(NOGC, libxl__json_object_get_string(node->obj));
+        else
+            kvl[idx+1] = NULL;
+    }
+
+    return 0;
+}
+
 yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *pl)
 {
     libxl_string_list l = *pl;
@@ -176,6 +290,38 @@ out:
     return s;
 }
 
+int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                                 libxl_string_list *p)
+{
+    const libxl__json_object *t;
+    libxl_string_list l;
+    flexarray_t *array = NULL;
+    int i, size;
+
+    if (!libxl__json_object_is_array(o))
+        return ERROR_FAIL;
+
+    array = libxl__json_object_get_array(o);
+    size = array->count;
+
+    if (size == 0) {
+        *p = NULL;
+        return 0;
+    }
+
+    /* need one extra slot as sentinel */
+    l = *p = libxl__calloc(NOGC, size + 1, sizeof(char *));
+
+    for (i = 0; (t = libxl__json_array_get(o, i)); i++) {
+        if (!libxl__json_object_is_string(t))
+            return ERROR_FAIL;
+
+        l[i] = libxl__strdup(NOGC, libxl__json_object_get_string(t));
+    }
+
+    return 0;
+}
+
 yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac)
 {
     char buf[LIBXL_MAC_FMTLEN+1];
@@ -183,6 +329,15 @@ yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac)
     return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_MAC_FMTLEN);
 }
 
+int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                         libxl_mac *p)
+{
+    if (!libxl__json_object_is_string(o))
+        return ERROR_FAIL;
+
+    return libxl__parse_mac(libxl__json_object_get_string(o), *p);
+}
+
 yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand,
                                      libxl_hwcap *p)
 {
@@ -201,6 +356,27 @@ out:
     return s;
 }
 
+int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                           libxl_hwcap *p)
+{
+    int i;
+
+    if (!libxl__json_object_is_array(o))
+        return ERROR_FAIL;
+
+    for (i = 0; i<4; i++) {
+        const libxl__json_object *t;
+
+        t = libxl__json_array_get(o, i);
+        if (!t || !libxl__json_object_is_integer(t))
+            return ERROR_FAIL;
+
+        (*p)[i] = libxl__json_object_get_integer(t);
+    }
+
+    return 0;
+}
+
 yajl_gen_status libxl__string_gen_json(yajl_gen hand,
                                        const char *p)
 {
@@ -210,6 +386,20 @@ yajl_gen_status libxl__string_gen_json(yajl_gen hand,
         return yajl_gen_null(hand);
 }
 
+int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             char **p)
+{
+    if (!libxl__json_object_is_string(o) && !libxl__json_object_is_null(o))
+        return ERROR_FAIL;
+
+    if (libxl__json_object_is_null(o))
+        *p = NULL;
+    else
+        *p = libxl__strdup(NOGC, libxl__json_object_get_string(o));
+
+    return 0;
+}
+
 /*
  * libxl__json_object helper functions
  */
@@ -845,6 +1035,87 @@ out:
     return rc;
 }
 
+int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                          void *p)
+{
+    long long i;
+
+    if (!libxl__json_object_is_integer(o))
+        return ERROR_FAIL;
+
+    i = libxl__json_object_get_integer(o);
+
+    if (i > INT_MAX || i < INT_MIN)
+        return ERROR_FAIL;
+
+    *((int *)p) = i;
+
+    return 0;
+}
+
+/* Macro to generate:
+ *  libxl__uint8_parse_json
+ *  libxl__uint16_parse_json
+ *  libxl__uint32_parse_json
+ */
+#define PARSE_UINT(width)                                               \
+    int libxl__uint ## width ## _parse_json(libxl__gc *gc,              \
+                                            const libxl__json_object *o,\
+                                            void *p)                    \
+    {                                                                   \
+        long long i;                                                    \
+                                                                        \
+        if (!libxl__json_object_is_integer(o))                          \
+            return ERROR_FAIL;                                          \
+                                                                        \
+        i = libxl__json_object_get_integer(o);                          \
+                                                                        \
+        if (i < 0 || i > UINT ## width ## _MAX)                         \
+            return ERROR_FAIL;                                          \
+                                                                        \
+        *((uint ## width ## _t *)p) = i;                                \
+                                                                        \
+        return 0;                                                       \
+    }
+
+PARSE_UINT(8);
+PARSE_UINT(16);
+PARSE_UINT(32);
+
+int libxl__uint64_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             void *p)
+{
+    if (!libxl__json_object_is_integer(o) &&
+        !libxl__json_object_is_number(o))
+        return ERROR_FAIL;
+
+    if (libxl__json_object_is_integer(o)) {
+        long long i = libxl__json_object_get_integer(o);
+
+        if (i < 0)
+            return ERROR_FAIL;
+
+        *((uint64_t *)p) = i;
+    } else {
+        const char *s;
+        unsigned long long i;
+        int saved_errno = errno;
+
+        s = libxl__json_object_get_number(o);
+
+        errno = 0;
+        i = strtoull(s, NULL, 10);
+
+        if (i == ULLONG_MAX && errno == ERANGE)
+            return ERROR_FAIL;
+
+        errno = saved_errno;
+        *((uint64_t *)p) = i;
+    }
+
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h
index a45d429..b196c1c 100644
--- a/tools/libxl/libxl_json.h
+++ b/tools/libxl/libxl_json.h
@@ -22,18 +22,52 @@
 #  include <yajl/yajl_version.h>
 #endif
 
+typedef struct libxl__gc libxl__gc;
+typedef struct libxl__json_object libxl__json_object;
+
 yajl_gen_status libxl__uint64_gen_json(yajl_gen hand, uint64_t val);
 yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, libxl_defbool *p);
-yajl_gen_status libxl_domid_gen_json(yajl_gen hand, libxl_domid *p);
+int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             libxl_defbool *p);
+int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                           bool *p);
 yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *p);
+int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                          libxl_uuid *p);
 yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *p);
+int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                         libxl_mac *p);
 yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, libxl_bitmap *p);
+int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                            libxl_bitmap *p);
 yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
                                                  libxl_cpuid_policy_list *p);
+int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
+                                       const libxl__json_object *o,
+                                       libxl_cpuid_policy_list *p);
 yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *p);
+int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                                 libxl_string_list *p);
 yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
                                               libxl_key_value_list *p);
+int libxl_key_value_list_parse_json(libxl__gc *gc,
+                                    const libxl__json_object *o,
+                                    libxl_key_value_list *p);
 yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, libxl_hwcap *p);
+int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                           libxl_hwcap *p);
+int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                          void *p);
+int libxl__uint8_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                            void *p);
+int libxl__uint16_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             void *p);
+int libxl__uint32_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             void *p);
+int libxl__uint64_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             void *p);
+int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o,
+                             char **p);
 
 #include <_libxl_types_json.h>
 
diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c
index 5f7cb6a..eb525fc 100644
--- a/tools/libxl/libxl_nocpuid.c
+++ b/tools/libxl/libxl_nocpuid.c
@@ -44,6 +44,13 @@ yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
     return 0;
 }
 
+int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
+                                       const libxl__json_object *o,
+                                       libxl_cpuid_policy_list *p)
+{
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
-- 
1.7.10.4

  parent reply	other threads:[~2014-05-13 21:53 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-13 21:53 [PATCH V5 00/32] JSON infrastructure, new "xl-json" format and domain configuration synchronization Wei Liu
2014-05-13 21:53 ` [PATCH V5 01/32] libxl: make cpupool_qualifier_to_cpupoolid a library function Wei Liu
2014-05-15 16:28   ` Ian Campbell
2014-05-20 14:47     ` Ian Jackson
2014-05-20 17:24       ` Wei Liu
2014-05-21  8:27         ` Ian Campbell
2014-05-21  8:37         ` Comments on LIBXL_HAVE_* defines (Was: Re: [PATCH V5 01/32] libxl: make cpupool_qualifier_to_cpupoolid a library function) Ian Campbell
2014-05-22  9:35           ` George Dunlap
2014-05-27 23:04           ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 02/32] xl / libxl: push parsing of SSID and CPU pool ID down to libxl Wei Liu
2014-05-15 16:38   ` Ian Campbell
2014-05-15 17:11     ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 03/32] xl / libxl: push VCPU affinity pinning " Wei Liu
2014-05-15  0:59   ` Dario Faggioli
2014-05-15  9:24     ` Wei Liu
2014-05-15 15:31       ` Dario Faggioli
2014-05-15 15:37         ` Wei Liu
2014-05-15 16:45   ` Ian Campbell
2014-05-15 17:06     ` Wei Liu
2014-05-15 17:19       ` Wei Liu
2014-05-16  9:51         ` Ian Campbell
2014-05-16  8:10       ` Dario Faggioli
2014-05-16  9:57       ` Ian Campbell
2014-05-16 10:15         ` Wei Liu
2014-05-16 10:28           ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 04/32] libxl: libxl_uuid_copy now taks a ctx argument Wei Liu
2014-05-15 16:51   ` Ian Campbell
2014-05-15 17:13     ` Wei Liu
2014-05-16  9:46       ` Ian Campbell
2014-05-16 10:18         ` Wei Liu
2014-05-16 10:30           ` Ian Campbell
2014-05-16 11:17             ` Wei Liu
2014-05-16 11:21               ` Wei Liu
2014-05-16 11:23                 ` Ian Campbell
2014-05-16 11:28                   ` Wei Liu
2014-05-16 11:31                     ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 05/32] xl: remove parsing of "vncviewer" option in xl domain config file Wei Liu
2014-05-20 12:44   ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 06/32] libxl: fix memory leak in libxl_cpuid_dispose Wei Liu
2014-05-13 21:53 ` [PATCH V5 07/32] libxl.h: document the paradigm of using libxl types Wei Liu
2014-05-20 12:49   ` Ian Campbell
2014-05-20 14:54     ` Ian Jackson
2014-05-20 15:02       ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 08/32] libxl.h: document libxl_<type>_to_json Wei Liu
2014-05-20 12:50   ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 09/32] libxl_internal.h: move / add some libxl defbool #define here Wei Liu
2014-05-20 12:51   ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 10/32] libxl: fix JSON generator for uint64_t Wei Liu
2014-05-20 12:55   ` Ian Campbell
2014-05-20 13:15     ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 11/32] libxl IDL: rename json_fn to json_gen_fn Wei Liu
2014-05-13 21:53 ` [PATCH V5 12/32] libxl_json: introduce libxl__object_from_json Wei Liu
2014-05-13 21:53 ` [PATCH V5 13/32] libxl_internal: make JSON_* types a bit-field Wei Liu
2014-05-13 21:53 ` [PATCH V5 14/32] libxl_internal.h: introduce libxl__json_object_is_{null, number, double} Wei Liu
2014-05-13 21:53 ` [PATCH V5 15/32] libxl_internal.h: introduce libxl__json_object_get_number Wei Liu
2014-05-20 12:56   ` Ian Campbell
2014-05-20 15:11     ` Ian Campbell
2014-05-13 21:53 ` Wei Liu [this message]
2014-05-13 21:53 ` [PATCH V5 17/32] libxl_json: allow basic JSON type objects generation Wei Liu
2014-05-13 21:54 ` [PATCH V5 18/32] libxl/gentypes.py: special-case KeyedUnion map handle generation Wei Liu
2014-05-20 13:26   ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 19/32] libxl/gentypes.py: don't generate default values Wei Liu
2014-05-20 13:29   ` Ian Campbell
2014-05-20 17:17     ` Wei Liu
2014-05-21  8:31       ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 20/32] libxl IDL: generate code to parse libxl__json_object to libxl_FOO struct Wei Liu
2014-05-20 13:35   ` Ian Campbell
2014-06-01 17:43     ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 21/32] libxl/gentest.py: test JSON parser Wei Liu
2014-05-13 21:54 ` [PATCH V5 22/32] libxl: introduce libxl_key_value_list_length Wei Liu
2014-05-20 13:36   ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 23/32] libxl: introduce libxl_cpuid_policy_list_length Wei Liu
2014-05-20 13:36   ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 24/32] libxl: copy function for builtin types Wei Liu
2014-05-20 13:39   ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 25/32] libxl IDL: generate deep copy functions Wei Liu
2014-05-20 13:42   ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 26/32] libxl/gentest.py: test " Wei Liu
2014-05-13 21:54 ` [PATCH V5 27/32] libxl: libxl-json format and load/store configuration functions Wei Liu
2014-05-20 14:03   ` Ian Campbell
2014-06-01 18:41     ` Wei Liu
2014-06-02 16:19       ` Ian Campbell
2014-06-02 19:56         ` Wei Liu
2014-05-20 15:01   ` Ian Jackson
2014-06-01 18:46     ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 28/32] libxl: store up-to-date domain configuration as we create domain Wei Liu
2014-05-20 14:12   ` Ian Campbell
2014-06-01 19:02     ` Wei Liu
2014-06-02 16:21       ` Ian Campbell
2014-05-20 15:04   ` Ian Jackson
2014-05-13 21:54 ` [PATCH V5 29/32] xl: use "libxl-json" format Wei Liu
2014-05-20 14:23   ` Ian Campbell
2014-05-20 15:13     ` Ian Jackson
2014-05-20 15:31       ` Ian Campbell
2014-06-01 19:37     ` Wei Liu
2014-06-02 16:30       ` Ian Campbell
2014-06-03 10:02         ` Wei Liu
2014-06-03 10:34           ` Ian Campbell
2014-05-20 15:11   ` Ian Jackson
2014-05-20 15:15     ` Ian Campbell
2014-05-20 15:39       ` Ian Jackson
2014-06-01 19:18         ` Wei Liu
2014-06-01 19:07     ` Wei Liu
2014-06-02 16:23       ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 30/32] libxl: consider force removal of device successful Wei Liu
2014-05-20 14:26   ` Ian Campbell
2014-06-01 19:44     ` Wei Liu
2014-05-20 15:15   ` Ian Jackson
2014-06-01 19:46     ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 31/32] libxl: update domain configuration when updating memory targets Wei Liu
2014-05-20 14:32   ` Ian Campbell
2014-06-01 20:00     ` Wei Liu
2014-05-20 15:21   ` Ian Jackson
2014-05-20 15:35     ` Ian Campbell
2014-05-20 15:44       ` Ian Jackson
2014-05-20 15:55         ` Ian Campbell
2014-05-20 16:03           ` Ian Jackson
2014-05-21  8:38             ` Ian Campbell
2014-06-01 20:51             ` Wei Liu
2014-06-01 20:22     ` Wei Liu
2014-06-02 16:32       ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 32/32] libxl: synchronize configuration when we plug / unplug device Wei Liu
2014-05-20 14:35   ` Ian Campbell
2014-05-20 15:33   ` Ian Jackson
2014-06-01 20:57     ` Wei Liu
2014-06-02 16:33       ` Ian Campbell
2014-05-21 10:18 ` [PATCH V5 00/32] JSON infrastructure, new "xl-json" format and domain configuration synchronization Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1400018054-26038-17-git-send-email-wei.liu2@citrix.com \
    --to=wei.liu2@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).