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(a)cardoe.com>
---
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