From dcbfd57214d841bce6df6d81bef384261ca5febb Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Sun, 24 Jun 2012 16:36:00 -0500 Subject: [PATCH] virsh: Use virXPath wrappers for vncdisplay cmd Update the vncdisplay command to use the virXPath wrappers as well as check if the domain is up rather than using the port set to -1 to mean the domain is not up. Signed-off-by: Doug Goldstein --- tools/virsh.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 035482269b..75147efd62 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -13844,12 +13844,12 @@ static bool cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) { xmlDocPtr xml = NULL; - xmlXPathObjectPtr obj = NULL; xmlXPathContextPtr ctxt = NULL; virDomainPtr dom; bool ret = false; int port = 0; - char *doc; + char *doc = NULL; + char *listen_addr = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) return false; @@ -13857,38 +13857,37 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return false; - doc = virDomainGetXMLDesc(dom, 0); - if (!doc) + /* Check if the domain is active and don't rely on -1 for this */ + if (!virDomainIsActive(dom)) { + vshError(ctl, _("Domain is not running")); goto cleanup; + } - xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt); - VIR_FREE(doc); - if (!xml) + if (!(doc = virDomainGetXMLDesc(dom, 0))) goto cleanup; - obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt); - if (obj == NULL || obj->type != XPATH_STRING || - obj->stringval == NULL || obj->stringval[0] == 0) { + if (!(xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt))) goto cleanup; - } - if (virStrToLong_i((const char *)obj->stringval, NULL, 10, &port) || port < 0) + + /* Get the VNC port */ + if (virXPathInt("string(/domain/devices/graphics[@type='vnc']/@port)", + ctxt, &port)) { + vshError(ctl, _("Failed to get VNC port. Is this domain using VNC?")); goto cleanup; - xmlXPathFreeObject(obj); + } - obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@listen)", ctxt); - if (obj == NULL || obj->type != XPATH_STRING || - obj->stringval == NULL || obj->stringval[0] == 0 || - STREQ((const char*)obj->stringval, "0.0.0.0")) { + listen_addr = virXPathString("string(/domain/devices/graphics" + "[@type='vnc']/@listen)", ctxt); + if (listen_addr == NULL || STREQ(listen_addr, "0.0.0.0")) vshPrint(ctl, ":%d\n", port-5900); - } else { - vshPrint(ctl, "%s:%d\n", (const char *)obj->stringval, port-5900); - } - xmlXPathFreeObject(obj); - obj = NULL; + else + vshPrint(ctl, "%s:%d\n", listen_addr, port-5900); + ret = true; cleanup: - xmlXPathFreeObject(obj); + VIR_FREE(doc); + VIR_FREE(listen_addr); xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); virDomainFree(dom); -- GitLab