static void *_vshCalloc(vshControl *ctl, size_t nmemb, size_t sz, const char *filename, int line);
#define vshCalloc(_ctl, _nmemb, _sz) _vshCalloc(_ctl, _nmemb, _sz, __FILE__, __LINE__)
-static void *_vshRealloc(vshControl *ctl, void *ptr, size_t sz, const char *filename, int line);
-#define vshRealloc(_ctl, _ptr, _sz) _vshRealloc(_ctl, _ptr, _sz, __FILE__, __LINE__)
-
static char *_vshStrdup(vshControl *ctl, const char *s, const char *filename, int line);
#define vshStrdup(_ctl, _s) _vshStrdup(_ctl, _s, __FILE__, __LINE__)
exit(EXIT_FAILURE);
}
-static void *
-_vshRealloc(vshControl *ctl, void *ptr, size_t size, const char *filename, int line)
-{
- void *x;
-
- if ((x = realloc(ptr, size)))
- return x;
- VIR_FREE(ptr);
- vshError(ctl, _("%s: %d: failed to allocate %d bytes"),
- filename, line, (int) size);
- exit(EXIT_FAILURE);
-}
-
static char *
_vshStrdup(vshControl *ctl, const char *s, const char *filename, int line)
{
cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
{
const char *from = NULL;
- bool ret = true;
+ bool ret = false;
char *buffer;
char *result = NULL;
const char **list = NULL;
- unsigned int count = 0;
- xmlDocPtr doc = NULL;
- xmlNodePtr node_list;
+ int count = 0;
+
+ xmlDocPtr xml = NULL;
+ xmlNodePtr *node_list = NULL;
xmlXPathContextPtr ctxt = NULL;
- xmlSaveCtxtPtr sctxt = NULL;
- xmlBufferPtr buf = NULL;
- xmlXPathObjectPtr obj = NULL;
- int res, i;
+ xmlBufferPtr xml_buf = NULL;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ int i;
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
return false;
- doc = xmlNewDoc(NULL);
- if (doc == NULL)
+ /* add an separate container around the xml */
+ virBufferStrcat(&buf, "<container>", buffer, "</container>", NULL);
+ if (virBufferError(&buf))
goto no_memory;
- res = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
- (const xmlChar *)buffer, &node_list);
- if (res != 0) {
- vshError(ctl, _("Failed to parse XML fragment %s"), from);
- ret = false;
+ VIR_FREE(buffer);
+ buffer = virBufferContentAndReset(&buf);
+
+
+ if (!(xml = virXMLParseStringCtxt(buffer, from, &ctxt)))
+ goto cleanup;
+
+ if ((count = virXPathNodeSet("//cpu[not(ancestor::cpus)]",
+ ctxt, &node_list)) == -1)
+ goto cleanup;
+
+ if (count == 0) {
+ vshError(ctl, _("No host CPU specified in '%s'"), from);
goto cleanup;
}
- xmlAddChildList((xmlNodePtr) doc, node_list);
+ list = vshCalloc(ctl, count, sizeof(const char *));
- ctxt = xmlXPathNewContext(doc);
- if (!ctxt)
+ if (!(xml_buf = xmlBufferCreate()))
goto no_memory;
- obj = xmlXPathEval(BAD_CAST "//cpu[not(ancestor::cpu)]", ctxt);
- if ((obj == NULL) || (obj->nodesetval == NULL) ||
- (obj->nodesetval->nodeTab == NULL))
- goto cleanup;
+ for (i = 0; i < count; i++) {
+ xmlBufferEmpty(xml_buf);
- for (i = 0;i < obj->nodesetval->nodeNr;i++) {
- buf = xmlBufferCreate();
- if (buf == NULL)
- goto no_memory;
- sctxt = xmlSaveToBuffer(buf, NULL, 0);
- if (sctxt == NULL) {
- xmlBufferFree(buf);
- goto no_memory;
+ if (xmlNodeDump(xml_buf, xml, node_list[i], 0, 0) < 0) {
+ vshError(ctl, _("Failed to extract <cpu> element"));
+ goto cleanup;
}
- xmlSaveTree(sctxt, obj->nodesetval->nodeTab[i]);
- xmlSaveClose(sctxt);
-
- list = vshRealloc(ctl, list, sizeof(char *) * (count + 1));
- list[count++] = (char *) buf->content;
- buf->content = NULL;
- xmlBufferFree(buf);
- buf = NULL;
- }
-
- if (count == 0) {
- vshError(ctl, _("No host CPU specified in '%s'"), from);
- ret = false;
- goto cleanup;
+ list[i] = vshStrdup(ctl, (const char *)xmlBufferContent(xml_buf));
}
result = virConnectBaselineCPU(ctl->conn, list, count, 0);
- if (result)
+ if (result) {
vshPrint(ctl, "%s", result);
- else
- ret = false;
+ ret = true;
+ }
cleanup:
- xmlXPathFreeObject(obj);
xmlXPathFreeContext(ctxt);
- xmlFreeDoc(doc);
+ xmlFreeDoc(xml);
+ xmlBufferFree(xml_buf);
VIR_FREE(result);
if ((list != NULL) && (count > 0)) {
- for (i = 0;i < count;i++)
+ for (i = 0; i < count; i++)
VIR_FREE(list[i]);
}
VIR_FREE(list);