[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [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 <cardoe 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]