[libvirt] [PATCH v2 1/4] qemu_firmware: Separate firmware loading into a function

Michal Privoznik mprivozn at redhat.com
Tue Apr 9 14:52:55 UTC 2019


This piece of code will be reused later.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/qemu/qemu_firmware.c | 53 ++++++++++++++++++++++++++++------------
 1 file changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
index 787b76b531..065e0d11aa 100644
--- a/src/qemu/qemu_firmware.c
+++ b/src/qemu/qemu_firmware.c
@@ -1314,15 +1314,49 @@ qemuFirmwareSanityCheck(const qemuFirmware *fw,
 }
 
 
+static ssize_t
+qemuFirmwareFetchParsedConfigs(bool privileged,
+                               qemuFirmwarePtr **firmwaresRet,
+                               char ***pathsRet)
+{
+    VIR_AUTOSTRINGLIST paths = NULL;
+    size_t npaths;
+    qemuFirmwarePtr *firmwares = NULL;
+    size_t i;
+
+    if (qemuFirmwareFetchConfigs(&paths, privileged) < 0)
+        return -1;
+
+    npaths = virStringListLength((const char **)paths);
+
+    if (VIR_ALLOC_N(firmwares, npaths) < 0)
+        return -1;
+
+    for (i = 0; i < npaths; i++) {
+        if (!(firmwares[i] = qemuFirmwareParse(paths[i])))
+            goto error;
+    }
+
+    VIR_STEAL_PTR(*firmwaresRet, firmwares);
+    VIR_STEAL_PTR(*pathsRet, paths);
+    return npaths;
+
+ error:
+    while (i > 0)
+        qemuFirmwareFree(firmwares[--i]);
+    VIR_FREE(firmwares);
+    return -1;
+}
+
+
 int
 qemuFirmwareFillDomain(virQEMUDriverPtr driver,
                        virDomainObjPtr vm,
                        unsigned int flags)
 {
     VIR_AUTOSTRINGLIST paths = NULL;
-    size_t npaths = 0;
     qemuFirmwarePtr *firmwares = NULL;
-    size_t nfirmwares = 0;
+    ssize_t nfirmwares = 0;
     const qemuFirmware *theone = NULL;
     size_t i;
     int ret = -1;
@@ -1333,21 +1367,10 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver,
     if (vm->def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_NONE)
         return 0;
 
-    if (qemuFirmwareFetchConfigs(&paths, driver->privileged) < 0)
+    if ((nfirmwares = qemuFirmwareFetchParsedConfigs(driver->privileged,
+                                                     &firmwares, &paths)) < 0)
         return -1;
 
-    npaths = virStringListLength((const char **)paths);
-
-    if (VIR_ALLOC_N(firmwares, npaths) < 0)
-        return -1;
-
-    nfirmwares = npaths;
-
-    for (i = 0; i < nfirmwares; i++) {
-        if (!(firmwares[i] = qemuFirmwareParse(paths[i])))
-            goto cleanup;
-    }
-
     for (i = 0; i < nfirmwares; i++) {
         if (qemuFirmwareMatchDomain(vm->def, firmwares[i], paths[i])) {
             theone = firmwares[i];
-- 
2.21.0




More information about the libvir-list mailing list