The 'virsh domdisplay' command is able to display the password configured for spice, but it was missing for vnc type graphics. Also, there were some inconsistencies that are cleaned now. --- tools/virsh-domain.c | 74 +++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index cc47383..cc5c830 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -7038,8 +7038,11 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd) /* Attempt to grab our display info */ for (iter = 0; scheme[iter] != NULL; iter++) { /* Create our XPATH lookup for the current display's port */ - virAsprintf(&xpath, "string(/domain/devices/graphics[@type='%s']" - "/@port)", scheme[iter]); + virAsprintf(&xpath, + "string(/domain/devices/graphics[@type='%s']" + "/@port)", + scheme[iter]); + if (!xpath) { virReportOOMError(); goto cleanup; @@ -7056,8 +7059,10 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd) continue; /* Create our XPATH lookup for the current display's address */ - virAsprintf(&xpath, "string(/domain/devices/graphics[@type='%s']" - "/@listen)", scheme[iter]); + virAsprintf(&xpath, + "string(/domain/devices/graphics[@type='%s']" + "/@listen)", + scheme[iter]); if (!xpath) { virReportOOMError(); goto cleanup; @@ -7069,14 +7074,36 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd) listen_addr = virXPathString(xpath, ctxt); VIR_FREE(xpath); + /* We can query this info for all the graphics types since we'll + * get nothing for the unsupported ones (just rdp for now) */ + if (vshCommandOptBool(cmd, "include-password")) { + /* Create our XPATH lookup for the password */ + virAsprintf(&xpath, + "string(/domain/devices/graphics" + "[@type='%s']/@passwd)", + scheme[iter]); + + if (!xpath) { + virReportOOMError(); + goto cleanup; + } + + /* Attempt to get the password */ + passwd = virXPathString(xpath, ctxt); + VIR_FREE(xpath); + } + /* Per scheme data mangling */ if (STREQ(scheme[iter], "vnc")) { - /* VNC protocol handlers take their port number as 'port' - 5900 */ + /* VNC protocol handlers take their port number as + * 'port' - 5900 */ port -= 5900; } else if (STREQ(scheme[iter], "spice")) { /* Create our XPATH lookup for the SPICE TLS Port */ - virAsprintf(&xpath, "string(/domain/devices/graphics[@type='%s']" - "/@tlsPort)", scheme[iter]); + virAsprintf(&xpath, + "string(/domain/devices/graphics[@type='%s']" + "/@tlsPort)", + scheme[iter]); if (!xpath) { virReportOOMError(); goto cleanup; @@ -7087,25 +7114,17 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd) VIR_FREE(xpath); if (tmp) tls_port = 0; - - if (vshCommandOptBool(cmd, "include-password")) { - /* Create our XPATH lookup for the SPICE password */ - virAsprintf(&xpath, "string(/domain/devices/graphics" - "[@type='%s']/@passwd)", scheme[iter]); - if (!xpath) { - virReportOOMError(); - goto cleanup; - } - - /* Attempt to get the SPICE password */ - passwd = virXPathString(xpath, ctxt); - VIR_FREE(xpath); - } } /* Build up the full URI, starting with the scheme */ virBufferAsprintf(&buf, "%s://", scheme[iter]); + /* There is no user, so just append password if there's any */ + if (passwd) { + virBufferAsprintf(&buf, ":%s@", passwd); + VIR_FREE(passwd); + } + /* Then host name or IP */ if (!listen_addr || STREQ((const char *)listen_addr, "0.0.0.0")) virBufferAddLit(&buf, "localhost"); @@ -7115,20 +7134,11 @@ cmdDomDisplay(vshControl *ctl, const vshCmd *cmd) VIR_FREE(listen_addr); /* Add the port */ - if (STREQ(scheme[iter], "spice")) - virBufferAsprintf(&buf, "?port=%d", port); - else - virBufferAsprintf(&buf, ":%d", port); + virBufferAsprintf(&buf, ":%d", port); /* TLS Port */ if (tls_port) - virBufferAsprintf(&buf, "&tls-port=%d", tls_port); - - /* Password */ - if (passwd) { - virBufferAsprintf(&buf, "&password=%s", passwd); - VIR_FREE(passwd); - } + virBufferAsprintf(&buf, "?tls-port=%d", tls_port); /* Ensure we can print our URI */ if (virBufferError(&buf)) { -- 1.8.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list