aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxen
diff options
context:
space:
mode:
authorEwan Mellor <ewan@xensource.com>2007-04-05 18:47:04 +0100
committerEwan Mellor <ewan@xensource.com>2007-04-05 18:47:04 +0100
commit8a2926fac23e268fc91b4129af11aa22829ea09c (patch)
treea1cb7170b842d2c470f5b55f19129d42595c1918 /tools/libxen
parent0c36a653f270b8e81fd55bf1fca6a88c0ba184dd (diff)
downloadxen-8a2926fac23e268fc91b4129af11aa22829ea09c.tar.gz
xen-8a2926fac23e268fc91b4129af11aa22829ea09c.tar.bz2
xen-8a2926fac23e268fc91b4129af11aa22829ea09c.zip
Serialize string string maps.
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
Diffstat (limited to 'tools/libxen')
-rw-r--r--tools/libxen/src/xen_common.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/tools/libxen/src/xen_common.c b/tools/libxen/src/xen_common.c
index 60cbf16132..70ecc1e4fc 100644
--- a/tools/libxen/src/xen_common.c
+++ b/tools/libxen/src/xen_common.c
@@ -102,6 +102,9 @@ add_struct_value(const struct abstract_type *, void *,
const char *),
const char *, xmlNode *);
+static xmlNode *
+add_container(xmlNode *parent, const char *name);
+
static void
call_raw(xen_session *, const char *, abstract_value [], int,
const abstract_type *, void *);
@@ -1290,6 +1293,48 @@ make_body_add_type(enum abstract_typename typename, abstract_value *v,
}
break;
+ case MAP:
+ {
+ const struct struct_member *member = v->type->members;
+ arbitrary_map *map_val = v->u.struct_val;
+ xmlNode *param_node = add_param_struct(params_node);
+ for (size_t i = 0; i < map_val->size; i++) {
+ enum abstract_typename typename_key = member[0].type->typename;
+ enum abstract_typename typename_val = member[1].type->typename;
+ int offset_key = member[0].offset;
+ int offset_val = member[1].offset;
+ int struct_size = v->type->struct_size;
+
+ switch (typename_key) {
+ case STRING: {
+ char **addr = (void *)(map_val + 1) +
+ (i * struct_size) +
+ offset_key;
+ char *key = *addr;
+
+ switch (typename_val) {
+ case STRING: {
+ char *val;
+ addr = (void *)(map_val + 1) +
+ (i * struct_size) +
+ offset_val;
+ val = *addr;
+ add_struct_member(param_node, key, "string", val);
+ break;
+ }
+ default:
+ assert(false);
+ }
+ break;
+ }
+ default:
+ assert(false);
+ }
+ }
+ }
+ break;
+
+
default:
assert(false);
}