From 4ddde38e2ddb2849582c3b05a97947f3b7c9b1ee Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Mon, 30 May 2016 16:35:17 +0200 Subject: [PATCH] virsh: domdisplay: if listen is 0.0.0.0 or [::] print address from URI 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 --- tools/virsh-domain.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 8d7ff61240..6f8edbb5d1 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,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);