diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a3beedb02e67f13ad0b256a3e9f05ef8e0eabc0a..7f61885080f75a241f54b791d09ed2d89d4575f4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6314,15 +6314,32 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn, /* Get the port number. */ p = strrchr (uri_in, ':'); - p++; /* definitely has a ':' in it, see above */ - this_port = virParseNumber (&p); - if (this_port == -1 || p-uri_in != strlen (uri_in)) { - qemudReportError (dconn, NULL, NULL, VIR_ERR_INVALID_ARG, - "%s", _("URI did not have ':port' at the end")); - goto cleanup; + if (p == strchr(uri_in, ':')) { + /* Generate a port */ + this_port = QEMUD_MIGRATION_FIRST_PORT + port++; + if (port == QEMUD_MIGRATION_NUM_PORTS) + port = 0; + + /* Caller frees */ + if (virAsprintf(uri_out, "%s:%d", uri_in, this_port) < 0) { + virReportOOMError (dconn); + goto cleanup; + } + + } else { + p++; /* definitely has a ':' in it, see above */ + this_port = virParseNumber (&p); + if (this_port == -1 || p-uri_in != strlen (uri_in)) { + qemudReportError (dconn, NULL, NULL, VIR_ERR_INVALID_ARG, + "%s", _("URI ended with incorrect ':port'")); + goto cleanup; + } } } + if (uri_out && *uri_out) + VIR_DEBUG("Generated uri_out=%s", *uri_out); + /* Parse the domain XML. */ if (!(def = virDomainDefParseString(dconn, driver->caps, dom_xml, VIR_DOMAIN_XML_INACTIVE))) {