VIR_FREE(port);
goto error;
}
+ /* Legacy compat syntax, used -1 for auto-port */
+ if (def->data.rdp.port == -1)
+ def->data.rdp.autoport = 1;
+
VIR_FREE(port);
} else {
def->data.rdp.port = 0;
}
if ((autoport = virXMLPropString(node, "autoport")) != NULL) {
- if (STREQ(autoport, "yes")) {
- if (flags & VIR_DOMAIN_XML_INACTIVE)
- def->data.rdp.port = 0;
+ if (STREQ(autoport, "yes"))
def->data.rdp.autoport = 1;
- }
+
VIR_FREE(autoport);
}
+ if (def->data.rdp.autoport && (flags & VIR_DOMAIN_XML_INACTIVE))
+ def->data.rdp.port = 0;
+
if ((replaceUser = virXMLPropString(node, "replaceUser")) != NULL) {
if (STREQ(replaceUser, "yes")) {
def->data.rdp.replaceUser = 1;
}
if ((autoport = virXMLPropString(node, "autoport")) != NULL) {
- if (STREQ(autoport, "yes")) {
- if (flags & VIR_DOMAIN_XML_INACTIVE) {
- def->data.spice.port = 0;
- def->data.spice.tlsPort = 0;
- }
+ if (STREQ(autoport, "yes"))
def->data.spice.autoport = 1;
- }
VIR_FREE(autoport);
}
+ if (def->data.spice.port == -1 && def->data.spice.tlsPort == -1) {
+ /* Legacy compat syntax, used -1 for auto-port */
+ def->data.spice.autoport = 1;
+ }
+
+ if (def->data.spice.autoport && (flags & VIR_DOMAIN_XML_INACTIVE)) {
+ def->data.spice.port = 0;
+ def->data.spice.tlsPort = 0;
+ }
+
def->data.spice.keymap = virXMLPropString(node, "keymap");
if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth,
};
struct _virDomainGraphicsDef {
+ /* Port value discipline:
+ * Value -1 is legacy syntax indicating that it should be auto-allocated.
+ * Value 0 means port wasn't specified in XML at all.
+ * Positive value is actual port number given in XML.
+ */
int type;
union {
struct {
virBufferAsprintf(&opt, "port=%u", def->graphics[0]->data.spice.port);
- if (def->graphics[0]->data.spice.tlsPort) {
+ if (def->graphics[0]->data.spice.tlsPort > 0) {
if (!driver->spiceTLS) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("spice TLS port set in XML configuration,"
goto cleanup;
}
vm->def->graphics[0]->data.vnc.port = port;
- } else if (vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
- vm->def->graphics[0]->data.spice.autoport) {
- int port = qemuProcessNextFreePort(driver, QEMU_VNC_PORT_MIN);
- int tlsPort = -1;
- if (port < 0) {
- qemuReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("Unable to find an unused SPICE port"));
- goto cleanup;
+ } else if (vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+ int port = -1;
+ if (vm->def->graphics[0]->data.spice.autoport ||
+ vm->def->graphics[0]->data.spice.port == -1) {
+ port = qemuProcessNextFreePort(driver, QEMU_VNC_PORT_MIN);
+
+ if (port < 0) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Unable to find an unused SPICE port"));
+ goto cleanup;
+ }
+
+ vm->def->graphics[0]->data.spice.port = port;
}
- if (driver->spiceTLS) {
- tlsPort = qemuProcessNextFreePort(driver, port + 1);
+ if (driver->spiceTLS &&
+ (vm->def->graphics[0]->data.spice.autoport ||
+ vm->def->graphics[0]->data.spice.tlsPort == -1)) {
+ int tlsPort = qemuProcessNextFreePort(driver,
+ vm->def->graphics[0]->data.spice.port + 1);
if (tlsPort < 0) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Unable to find an unused SPICE TLS port"));
qemuProcessReturnPort(driver, port);
goto cleanup;
}
- }
- vm->def->graphics[0]->data.spice.port = port;
- vm->def->graphics[0]->data.spice.tlsPort = tlsPort;
+ vm->def->graphics[0]->data.spice.tlsPort = tlsPort;
+ }
}
}