[PATCH v3 3/8] Handle arbitrary qemu command-lines in qemuParseCommandLine.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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);
+            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;
-- 
1.6.6.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]