[libvirt] [PATCH 1/2] virsh.c: new xPathULong() to parse XML returning ulong value of selected node.

Matthias Bolte matthias.bolte at googlemail.com
Thu Feb 17 14:18:02 UTC 2011


2011/2/17 Michal Privoznik <mprivozn at 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




More information about the libvir-list mailing list