[libvirt] [PATCH] virsh: Use virXPath wrappers for vncdisplay cmd

Doug Goldstein cardoe at cardoe.com
Sun Jun 24 21:36:00 UTC 2012


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 at 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




More information about the libvir-list mailing list