2011/2/17 Michal Privoznik <mpriv...@redhat.com>: > Parse XML from given buffer, select appropiate XPath node and return its > value as unsigned long. > --- > tools/virsh.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 49 insertions(+), 0 deletions(-) > > diff --git a/tools/virsh.c b/tools/virsh.c > index 50d5e33..8804fc3 100644 > --- a/tools/virsh.c > +++ b/tools/virsh.c > @@ -2270,6 +2270,55 @@ static const vshCmdInfo info_freecell[] = { > {NULL, NULL} > }; > > +static int > +xPathULong(char *xml, char *xpath, unsigned long *value) { > + > + xmlDocPtr doc = NULL; > + xmlXPathContextPtr ctxt = NULL; > + xmlXPathObjectPtr obj = NULL; > + int ret = -1; > + > + doc = xmlReadDoc((const xmlChar *) xml, "domain.xml", NULL, > + XML_PARSE_NOENT | XML_PARSE_NONET | > XML_PARSE_NOWARNING); > + if (!doc) > + goto cleanup; > + > + ctxt = xmlXPathNewContext(doc); > + if (!ctxt) > + goto cleanup; > + > + obj = xmlXPathEval(BAD_CAST xpath, ctxt); > + if (!obj) > + goto cleanup; > + > + if (!value) > + goto cleanup; > + > + *value = 0; > + if ((obj->type == XPATH_STRING) && > + (obj->stringval != NULL) && (obj->stringval[0] != 0)) { > + char *conv = NULL; > + unsigned long val; > + > + val = strtoul((const char *) obj->stringval, &conv, 10); > + if (*conv =='\0') { > + *value = val; > + ret = 0; > + } > + } else if ((obj != NULL) && (obj->type == XPATH_NUMBER)) { > + *value = (unsigned long) obj->floatval; > + if (*value == obj->floatval) { > + ret = 0; > + } > + } > + > +cleanup: > + xmlXPathFreeObject(obj); > + xmlXPathFreeContext(ctxt); > + xmlFreeDoc(doc); > + return ret; > +} > + > static const vshCmdOptDef opts_freecell[] = { > {"cellno", VSH_OT_INT, 0, N_("NUMA cell number")}, > {"all", VSH_OT_BOOL, 0, N_("show free memory for all NUMA cells")}, > -- > 1.7.3.5 >
NACK, there already is a virXPathULong function. Look at how other virXPath* functions are used in virsh. Matthias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list