# HG changeset patch # User Ewan Mellor # Date 1168000232 0 # Node ID bb8ae710d829d5a7805c5588d8ded2ea393686cf # Parent 36e00d04278d4fbdb0b034355a0e683372211752 Treat tags with no type tag inside as if they were strings (as required by the XML-RPC spec). Signed-off-by: Ewan Mellor diff -r 36e00d04278d -r bb8ae710d829 tools/libxen/src/xen_common.c --- a/tools/libxen/src/xen_common.c Fri Jan 05 12:29:26 2007 +0000 +++ b/tools/libxen/src/xen_common.c Fri Jan 05 12:30:32 2007 +0000 @@ -373,11 +373,18 @@ static void server_error_2(xen_session * } -static bool is_container_node(xmlNode *n, char *type) +static bool is_node(xmlNode *n, char *type) { return n->type == XML_ELEMENT_NODE && - 0 == strcmp((char *)n->name, type) && + 0 == strcmp((char *)n->name, type); +} + + +static bool is_container_node(xmlNode *n, char *type) +{ + return + is_node(n, type) && n->children != NULL && n->children == n->last && n->children->type == XML_ELEMENT_NODE; @@ -390,13 +397,30 @@ static bool is_container_node(xmlNode *n */ static xmlChar *string_from_value(xmlNode *n, char *type) { - return - is_container_node(n, "value") && - 0 == strcmp((char *)n->children->name, type) ? - (n->children->children == NULL ? - xmlStrdup(BAD_CAST("")) : - xmlNodeGetContent(n->children->children)) : - NULL; + /* + XYZ is normal, but the XML-RPC spec also + allows XYZ where XYZ is to be interpreted as a string. + */ + + if (is_container_node(n, "value") && + 0 == strcmp((char *)n->children->name, type)) + { + return + n->children->children == NULL ? + xmlStrdup(BAD_CAST("")) : + xmlNodeGetContent(n->children->children); + } + else if (0 == strcmp(type, "string") && is_node(n, "value")) + { + return + n->children == NULL ? + xmlStrdup(BAD_CAST("")) : + xmlNodeGetContent(n->children); + } + else + { + return NULL; + } }