[libvirt] [PATCH] virsh: domdisplay: if listen is 0.0.0.0 or [::] print address from URI

Pavel Hrdina phrdina at redhat.com
Mon May 30 14:45:32 UTC 2016


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 at redhat.com>
---
 tools/virsh-domain.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 8d7ff61..93c7050 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -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,23 @@ 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)) {
+
+                virURIPtr uri = virURIParse(ctl->connname);
+
+                /* 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 +10656,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);
-- 
2.8.3




More information about the libvir-list mailing list