[libvirt] [PATCH v2 2/4] test_driver: extract image loading code into a separate function

Ilias Stamatis stamatis.iliass at gmail.com
Mon Jun 10 09:04:59 UTC 2019


Extracting the code logic for opening and parsing a test image from
testDomainRestoreFlags into a separate function, allows us to reuse this
code in other functions such as testDomainSaveImageGetXMLDesc.

Signed-off-by: Ilias Stamatis <stamatis.iliass at gmail.com>
---
 src/test/test_driver.c | 116 ++++++++++++++++++++++++++---------------
 1 file changed, 73 insertions(+), 43 deletions(-)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 3331ed5495..1b92cb43dd 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2075,6 +2075,78 @@ testDomainSaveImageWrite(testDriverPtr driver,
 }


+/**
+ * testDomainSaveImageOpen:
+ * @driver: test driver data
+ * @path: path of the saved image
+ * @ret_def: returns domain definition created from the XML stored in the image
+ *
+ * Returns the opened fd of the save image file and fills ret_def on success.
+ * Returns -1, on error.
+ */
+static int ATTRIBUTE_NONNULL(3)
+testDomainSaveImageOpen(testDriverPtr driver,
+                        const char *path,
+                        virDomainDefPtr *ret_def)
+{
+    char magic[15];
+    int fd = -1;
+    int len;
+    virDomainDefPtr def = NULL;
+    VIR_AUTOFREE(char *) xml = NULL;
+
+    if ((fd = open(path, O_RDONLY)) < 0) {
+        virReportSystemError(errno, _("cannot read domain image '%s'"), path);
+        goto error;
+    }
+
+    if (saferead(fd, magic, sizeof(magic)) != sizeof(magic)) {
+        virReportSystemError(errno, _("incomplete save header in '%s'"), path);
+        goto error;
+    }
+
+    if (memcmp(magic, TEST_SAVE_MAGIC, sizeof(magic))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("mismatched header magic"));
+        goto error;
+    }
+
+    if (saferead(fd, (char*)&len, sizeof(len)) != sizeof(len)) {
+        virReportSystemError(errno,
+                             _("failed to read metadata length in '%s'"),
+                             path);
+        goto error;
+    }
+
+    if (len < 1 || len > 8192) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "%s", _("length of metadata out of range"));
+        goto error;
+    }
+
+    if (VIR_ALLOC_N(xml, len+1) < 0)
+        goto error;
+
+    if (saferead(fd, xml, len) != len) {
+        virReportSystemError(errno, _("incomplete metadata in '%s'"), path);
+        goto error;
+    }
+    xml[len] = '\0';
+
+    if (!(def = virDomainDefParseString(xml, driver->caps, driver->xmlopt, NULL,
+                                        VIR_DOMAIN_DEF_PARSE_INACTIVE |
+                                        VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
+        goto error;
+
+    VIR_STEAL_PTR(*ret_def, def);
+    return fd;
+
+ error:
+    virDomainDefFree(def);
+    VIR_FORCE_CLOSE(fd);
+    return -1;
+}
+
+
 static int
 testDomainSaveFlags(virDomainPtr domain, const char *path,
                     const char *dxml, unsigned int flags)
@@ -2130,14 +2202,11 @@ testDomainRestoreFlags(virConnectPtr conn,
                        unsigned int flags)
 {
     testDriverPtr privconn = conn->privateData;
-    char magic[15];
     int fd = -1;
-    int len;
     virDomainDefPtr def = NULL;
     virDomainObjPtr dom = NULL;
     virObjectEventPtr event = NULL;
     int ret = -1;
-    VIR_AUTOFREE(char *) xml = NULL;

     virCheckFlags(0, -1);
     if (dxml) {
@@ -2146,46 +2215,7 @@ testDomainRestoreFlags(virConnectPtr conn,
         return -1;
     }

-    if ((fd = open(path, O_RDONLY)) < 0) {
-        virReportSystemError(errno,
-                             _("cannot read domain image '%s'"),
-                             path);
-        goto cleanup;
-    }
-    if (saferead(fd, magic, sizeof(magic)) != sizeof(magic)) {
-        virReportSystemError(errno,
-                             _("incomplete save header in '%s'"),
-                             path);
-        goto cleanup;
-    }
-    if (memcmp(magic, TEST_SAVE_MAGIC, sizeof(magic))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("mismatched header magic"));
-        goto cleanup;
-    }
-    if (saferead(fd, (char*)&len, sizeof(len)) != sizeof(len)) {
-        virReportSystemError(errno,
-                             _("failed to read metadata length in '%s'"),
-                             path);
-        goto cleanup;
-    }
-    if (len < 1 || len > 8192) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("length of metadata out of range"));
-        goto cleanup;
-    }
-    if (VIR_ALLOC_N(xml, len+1) < 0)
-        goto cleanup;
-    if (saferead(fd, xml, len) != len) {
-        virReportSystemError(errno,
-                             _("incomplete metadata in '%s'"), path);
-        goto cleanup;
-    }
-    xml[len] = '\0';
-
-    def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt,
-                                  NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE);
-    if (!def)
+    if ((fd = testDomainSaveImageOpen(privconn, path, &def)) < 0)
         goto cleanup;

     if (testDomainGenerateIfnames(def) < 0)
--
2.21.0




More information about the libvir-list mailing list