]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
build: fix build with older libxml2
authorEric Blake <eblake@redhat.com>
Wed, 7 Dec 2011 22:06:18 +0000 (15:06 -0700)
committerDaniel Veillard <veillard@redhat.com>
Thu, 8 Dec 2011 03:37:24 +0000 (11:37 +0800)
On RHEL 5, with libxml2-2.6.26, the build failed with:
virsh.c: In function 'vshNodeIsSuperset':
virsh.c:11951: warning: implicit declaration of function 'xmlChildElementCount'

(or if warnings aren't errors, a link failure later on).

* src/util/xml.h (virXMLChildElementCount): New prototype.
* src/util/xml.c (virXMLChildElementCount): New function.
* src/libvirt_private.syms (xml.h): Export it.
* tools/virsh.c (vshNodeIsSuperset): Use it.

src/libvirt_private.syms
src/util/xml.c
src/util/xml.h
tools/virsh.c

index 99a109922f16f609ed260c10880a134efc3878fe..a81c230c2e29cb1ec5af32a589cd9d7b906b214c 100644 (file)
@@ -1400,6 +1400,7 @@ virTimeStringThenRaw;
 
 
 # xml.h
+virXMLChildElementCount;
 virXMLParseHelper;
 virXMLPropString;
 virXMLSaveFile;
index 4e98b052272810588523ce2efa13727d638c8a01..2909e85386a6c8ff6b2250268d9c68f8a0fb7d1e 100644 (file)
@@ -833,3 +833,23 @@ virXMLSaveFile(const char *path,
 
     return virFileRewrite(path, S_IRUSR | S_IWUSR, virXMLRewriteFile, &data);
 }
+
+/* Returns the number of children of node, or -1 on error.  */
+long
+virXMLChildElementCount(xmlNodePtr node)
+{
+    long ret = 0;
+    xmlNodePtr cur = NULL;
+
+    /* xmlChildElementCount returns 0 on error, which isn't helpful;
+     * besides, it is not available in libxml2 2.6.  */
+    if (!node || node->type != XML_ELEMENT_NODE)
+        return -1;
+    cur = node->children;
+    while (cur) {
+        if (cur->type == XML_ELEMENT_NODE)
+            ret++;
+        cur = cur->next;
+    }
+    return ret;
+}
index c492063cf1f5a9384a8d02f11ec4ad200faa636d..a3750fa253a0824516b3e99a3471e0646f6ad99e 100644 (file)
@@ -52,6 +52,7 @@ int              virXPathNodeSet(const char *xpath,
                                  xmlNodePtr **list);
 char *          virXMLPropString(xmlNodePtr node,
                                  const char *name);
+long     virXMLChildElementCount(xmlNodePtr node);
 
 /* Internal function; prefer the macros below.  */
 xmlDocPtr      virXMLParseHelper(int domcode,
index d02be5cd3095306d876620a702489c3ef44358db..a51478f525b4041988ddb6c5c9f83ca81a1e8e57 100644 (file)
@@ -11919,7 +11919,7 @@ vshNodeIsSuperset(xmlNodePtr n1, xmlNodePtr n2)
     bool found;
     bool visited;
     bool ret = false;
-    unsigned long n1_child_size, n2_child_size, n1_iter;
+    long n1_child_size, n2_child_size, n1_iter;
     virBitmapPtr bitmap;
 
     if (!n1 && !n2)
@@ -11948,9 +11948,10 @@ vshNodeIsSuperset(xmlNodePtr n1, xmlNodePtr n2)
         attr = attr->next;
     }
 
-    n1_child_size = xmlChildElementCount(n1);
-    n2_child_size = xmlChildElementCount(n2);
-    if (n1_child_size < n2_child_size)
+    n1_child_size = virXMLChildElementCount(n1);
+    n2_child_size = virXMLChildElementCount(n2);
+    if (n1_child_size < 0 || n2_child_size < 0 ||
+        n1_child_size < n2_child_size)
         return false;
 
     if (n1_child_size == 0 && n2_child_size == 0)