On Fri, Jul 02, 2010 at 11:18:20AM -0400, Chris Lalancette wrote: > Now that we have the ability to specify arbitrary qemu > command-line parameters in the XML, use it to handle unknown > command-line parameters when doing a native-to-xml conversion. > > Changes since v1: > - Rename num_extra to num_args > - Fix up a memory leak on an error path > > Changes since v2: > - Add a VIR_WARN when adding the argument via qemu:arg > > Signed-off-by: Chris Lalancette <clalance@xxxxxxxxxx> > --- > src/qemu/qemu_conf.c | 30 ++++++++++++++++++++++++------ > 1 files changed, 24 insertions(+), 6 deletions(-) > > diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c > index 151fa68..c7ee278 100644 > --- a/src/qemu/qemu_conf.c > +++ b/src/qemu/qemu_conf.c > @@ -5853,6 +5853,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > const char **nics = NULL; > int video = VIR_DOMAIN_VIDEO_TYPE_CIRRUS; > int nvirtiodisk = 0; > + qemuDomainCmdlineDefPtr cmd; > > if (!progargv[0]) { > qemuReportError(VIR_ERR_INTERNAL_ERROR, > @@ -5863,6 +5864,10 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > if (VIR_ALLOC(def) < 0) > goto no_memory; > > + /* allocate the cmdlinedef up-front; if it's unused, we'll free it later */ > + if (VIR_ALLOC(cmd) < 0) > + goto no_memory; > + > virUUIDGenerate(def->uuid); > > def->id = -1; > @@ -6287,12 +6292,17 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > } else if (STREQ(arg, "-S")) { > /* ignore, always added by libvirt */ > } else { > - VIR_WARN("unknown QEMU argument '%s' during conversion", arg); > -#if 0 > - qemuReportError(VIR_ERR_INTERNAL_ERROR, > - _("unknown argument '%s'"), arg); > - goto error; > -#endif > + /* something we can't yet parse. Add it to the qemu namespace > + * cmdline/environment advanced options and hope for the best > + */ > + VIR_WARN("unknown QEMU argument '%s', adding to the qemu namespace", > + arg); Lets just make this a VIR_INFO now - no need to log this at the default level, it'll just annoy people using this new feature. > + if (VIR_REALLOC_N(cmd->args, cmd->num_args+1) < 0) > + goto no_memory; > + cmd->args[cmd->num_args] = strdup(arg); > + if (cmd->args[cmd->num_args] == NULL) > + goto no_memory; > + cmd->num_args++; > } > } > > @@ -6352,11 +6362,19 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > if (virDomainDefAddImplicitControllers(def) < 0) > goto error; > > + if (cmd->num_args || cmd->num_env) { > + def->ns = caps->ns; > + def->namespaceData = cmd; > + } > + else > + VIR_FREE(cmd); > + > return def; > > no_memory: > virReportOOMError(); > error: > + VIR_FREE(cmd); > virDomainDefFree(def); > VIR_FREE(nics); > return NULL; ACK, with the logging level change Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list