[libvirt] [PATCHv2 1/2] Make -boot arg generation more readable

Ján Tomko jtomko at redhat.com
Wed Feb 25 12:52:52 UTC 2015


If we combine the boot order on the command line with other
boot options, we prepend order= in front of it.

Instead of checking if the number of added arguments is between
0 and 2, separate the strings for boot order and options
and prepend boot order only if both strings are not empty.
---
 src/qemu/qemu_command.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 736e285..b504461 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8213,6 +8213,7 @@ qemuBuildCommandLine(virConnectPtr conn,
     virArch hostarch = virArchFromHost();
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     virBuffer boot_buf = VIR_BUFFER_INITIALIZER;
+    char *boot_order_str = NULL, *boot_opts_str = NULL;
     int boot_nparams = 0;
 
     VIR_DEBUG("conn=%p driver=%p def=%p mon=%p json=%d "
@@ -8778,7 +8779,9 @@ qemuBuildCommandLine(virConnectPtr conn,
         boot[def->os.nBootDevs] = '\0';
 
         virBufferAsprintf(&boot_buf, "%s", boot);
-        boot_nparams++;
+        if (virBufferCheckError(&boot_buf) < 0)
+            goto error;
+        boot_order_str = virBufferContentAndReset(&boot_buf);
     }
 
     if (def->os.bootmenu) {
@@ -8834,23 +8837,23 @@ qemuBuildCommandLine(virConnectPtr conn,
         virBufferAddLit(&boot_buf, "strict=on");
     }
 
-    if (boot_nparams > 0) {
-        virCommandAddArg(cmd, "-boot");
+    if (virBufferCheckError(&boot_buf) < 0)
+        goto error;
 
-        if (virBufferCheckError(&boot_buf) < 0)
-            goto error;
+    boot_opts_str = virBufferContentAndReset(&boot_buf);
+    if (boot_order_str || boot_opts_str) {
+        virCommandAddArg(cmd, "-boot");
 
-        if (boot_nparams < 2 || emitBootindex) {
-            virCommandAddArgBuffer(cmd, &boot_buf);
-            virBufferFreeAndReset(&boot_buf);
-        } else {
-            char *str = virBufferContentAndReset(&boot_buf);
-            virCommandAddArgFormat(cmd,
-                                   "order=%s",
-                                   str);
-            VIR_FREE(str);
+        if (boot_order_str && boot_opts_str) {
+            virCommandAddArgFormat(cmd, "order=%s,%s",
+                                   boot_order_str, boot_opts_str);
+        } else if (boot_order_str) {
+            virCommandAddArg(cmd, boot_order_str);
+        } else if (boot_opts_str) {
+            virCommandAddArg(cmd, boot_opts_str);
         }
     }
+    VIR_FREE(boot_opts_str);
 
     if (def->os.kernel)
         virCommandAddArgList(cmd, "-kernel", def->os.kernel, NULL);
@@ -10342,6 +10345,7 @@ qemuBuildCommandLine(virConnectPtr conn,
     return cmd;
 
  error:
+    VIR_FREE(boot_order_str);
     virBufferFreeAndReset(&boot_buf);
     virObjectUnref(cfg);
     /* free up any resources in the network driver
-- 
2.0.5




More information about the libvir-list mailing list