On 18.06.2013 16:06, Jiri Denemark wrote:
---
tools/virsh-domain.c | 77 ++++++++++++++++++++++++++++++++++++----------------
1 file changed, 54 insertions(+), 23 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 7f9b9e3..2226b5c 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -8345,15 +8345,15 @@ doMigrate(void *opaque)
char ret = '1';
virDomainPtr dom = NULL;
const char *desturi = NULL;
- const char *migrateuri = NULL;
- const char *dname = NULL;
+ const char *opt = NULL;
unsigned int flags = 0;
vshCtrlData *data = opaque;
vshControl *ctl = data->ctl;
const vshCmd *cmd = data->cmd;
- const char *xmlfile = NULL;
- char *xml = NULL;
sigset_t sigmask, oldsigmask;
+ virTypedParameterPtr params = NULL;
+ int nparams = 0;
+ int maxparams = 0;
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
@@ -8363,11 +8363,40 @@ doMigrate(void *opaque)
if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
goto out;
- if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0 ||
- vshCommandOptStringReq(ctl, cmd, "migrateuri", &migrateuri) < 0
||
- vshCommandOptStringReq(ctl, cmd, "dname", &dname) < 0 ||
- vshCommandOptStringReq(ctl, cmd, "xml", &xmlfile) < 0)
+ if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0)
+ goto out;
+
+ if (vshCommandOptStringReq(ctl, cmd, "migrateuri", &opt) < 0)
+ goto out;
+ else if (opt &&
You can just drop these 'else' and hence make the code more readable.
+ virTypedParamsAddString(¶ms, &nparams,
&maxparams,
+ VIR_MIGRATE_PARAM_URI, opt) < 0)
+ goto save_error;
+
+ if (vshCommandOptStringReq(ctl, cmd, "dname", &opt) < 0)
goto out;
+ else if (opt &&
+ virTypedParamsAddString(¶ms, &nparams, &maxparams,
+ VIR_MIGRATE_PARAM_DEST_NAME, opt) < 0)
+ goto save_error;
+
+ if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0) {
+ goto out;
+ } else if (opt) {
+ char *xml;
+
+ if (virFileReadAll(opt, 1024 * 1024, &xml) < 0) {
+ vshError(ctl, _("cannot read file '%s'"), opt);
+ goto save_error;
'save_error' is not on the list of allowed labels
(
http://libvirt.org/hacking.html#goto) but it makes sense here.
+ }
+
+ if (virTypedParamsAddString(¶ms, &nparams, &maxparams,
+ VIR_MIGRATE_PARAM_DEST_XML, xml) < 0) {
+ VIR_FREE(xml);
+ goto save_error;
+ }
+ VIR_FREE(xml);
+ }
if (vshCommandOptBool(cmd, "live"))
flags |= VIR_MIGRATE_LIVE;
@@ -8406,23 +8435,19 @@ doMigrate(void *opaque)
if (vshCommandOptBool(cmd, "abort-on-error"))
flags |= VIR_MIGRATE_ABORT_ON_ERROR;
- if (xmlfile &&
- virFileReadAll(xmlfile, 8192, &xml) < 0) {
- vshError(ctl, _("file '%s' doesn't exist"), xmlfile);
- goto out;
- }
-
if ((flags & VIR_MIGRATE_PEER2PEER) ||
vshCommandOptBool(cmd, "direct")) {
/* migrateuri doesn't make sense for tunnelled migration */
- if (flags & VIR_MIGRATE_TUNNELLED && migrateuri != NULL) {
- vshError(ctl, "%s", _("migrate: Unexpected migrateuri for
peer2peer/direct migration"));
+ if (flags & VIR_MIGRATE_TUNNELLED &&
+ virTypedParamsGetString(params, nparams,
+ VIR_MIGRATE_PARAM_URI, NULL) == 1) {
+ vshError(ctl, "%s", _("migrate: Unexpected migrateuri for
"
+ "peer2peer/direct migration"));
goto out;
}
- if (virDomainMigrateToURI2(dom, desturi, migrateuri,
- xml, flags, dname, 0) == 0)
+ if (virDomainMigrateToURI3(dom, desturi, params, nparams, flags) == 0)
ret = '0';
} else {
/* For traditional live migration, connect to the destination host directly. */
@@ -8430,10 +8455,10 @@ doMigrate(void *opaque)
virDomainPtr ddom = NULL;
dconn = virConnectOpenAuth(desturi, virConnectAuthPtrDefault, 0);
- if (!dconn) goto out;
+ if (!dconn)
+ goto out;
- ddom = virDomainMigrate2(dom, dconn, xml, flags, dname, migrateuri, 0);
- if (ddom) {
+ if ((ddom = virDomainMigrate3(dom, dconn, params, nparams, flags))) {
virDomainFree(ddom);
ret = '0';
}
@@ -8443,9 +8468,15 @@ doMigrate(void *opaque)
out:
pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL);
out_sig:
- if (dom) virDomainFree(dom);
- VIR_FREE(xml);
+ virTypedParamsFree(params, nparams);
+ if (dom)
+ virDomainFree(dom);
ignore_value(safewrite(data->writefd, &ret, sizeof(ret)));
+ return;
+
+save_error:
+ vshSaveLibvirtError();
+ goto out;
}
static void