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 <cardoe@xxxxxxxxxx> --- tools/virsh.c | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 0354822..a6649f4 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 *listen_addr; if (!vshConnectionUsability(ctl, ctl->conn)) return false; @@ -13857,6 +13857,12 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return false; + /* 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; + } + doc = virDomainGetXMLDesc(dom, 0); if (!doc) goto cleanup; @@ -13866,29 +13872,23 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) if (!xml) 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) { + /* 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; } - if (virStrToLong_i((const char *)obj->stringval, NULL, 10, &port) || port < 0) - 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((const char *)listen_addr, "0.0.0.0")) { vshPrint(ctl, ":%d\n", port-5900); } else { - vshPrint(ctl, "%s:%d\n", (const char *)obj->stringval, port-5900); + vshPrint(ctl, "%s:%d\n", (const char *)listen_addr, port-5900); } - xmlXPathFreeObject(obj); - obj = NULL; ret = true; cleanup: - xmlXPathFreeObject(obj); xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); virDomainFree(dom); -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list