]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: domdisplay: if listen is 0.0.0.0 or [::] print address from URI
authorPavel Hrdina <phrdina@redhat.com>
Mon, 30 May 2016 14:35:17 +0000 (16:35 +0200)
committerPavel Hrdina <phrdina@redhat.com>
Wed, 8 Jun 2016 11:54:25 +0000 (13:54 +0200)
Currently if a guest has listen address 0.0.0.0 or [::] and you run
"virsh domdisplay $domain" you always get "spice://localhost:$port".

We want to print better address if someone is connected from a different
computer using "virsh -c qemu+ssh://some.host/system".  This patch fixes the
behavior of virsh to print in this case "spice://some.host:$port".

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1332446

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
tools/virsh-domain.c

index 8d7ff612409579e35daf38fca4017c4b9da44e7e..6f8edbb5d1535ad7138d335282e7a837873c2559 100644 (file)
@@ -57,6 +57,7 @@
 #include "virtypedparam.h"
 #include "virxml.h"
 #include "virsh-nodedev.h"
+#include "viruri.h"
 
 /* Gnulib doesn't guarantee SA_SIGINFO support.  */
 #ifndef SA_SIGINFO
@@ -10617,6 +10618,30 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd)
             VIR_FREE(xpath);
         }
 
+        /* If listen_addr is 0.0.0.0 or [::] we should try to parse URI and set
+         * listen_addr based on current URI. */
+        if (listen_addr) {
+            if (virSocketAddrParse(&addr, listen_addr, AF_UNSPEC) > 0 &&
+                virSocketAddrIsWildcard(&addr)) {
+
+                virConnectPtr conn = ((virshControlPtr)(ctl->privData))->conn;
+                char *uriStr = virConnectGetURI(conn);
+                virURIPtr uri = NULL;
+
+                if (uriStr) {
+                    uri = virURIParse(uriStr);
+                    VIR_FREE(uriStr);
+                }
+
+                /* It's safe to free the listen_addr even if parsing of URI
+                 * fails, if there is no listen_addr we will print "localhost". */
+                VIR_FREE(listen_addr);
+
+                if (uri && VIR_STRDUP(listen_addr, uri->server) < 0)
+                    goto cleanup;
+            }
+        }
+
         /* We can query this info for all the graphics types since we'll
          * get nothing for the unsupported ones (just rdp for now).
          * Also the parameter '--include-password' was already taken
@@ -10638,9 +10663,7 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd)
             virBufferAsprintf(&buf, ":%s@", passwd);
 
         /* Then host name or IP */
-        if (!listen_addr ||
-            (virSocketAddrParse(&addr, listen_addr, AF_UNSPEC) > 0 &&
-             virSocketAddrIsWildcard(&addr)))
+        if (!listen_addr)
             virBufferAddLit(&buf, "localhost");
         else if (strchr(listen_addr, ':'))
             virBufferAsprintf(&buf, "[%s]", listen_addr);