]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Add functions to copy and free network disk source definitions
authorPeter Krempa <pkrempa@redhat.com>
Fri, 15 Nov 2013 15:34:07 +0000 (16:34 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 2 Dec 2013 13:31:03 +0000 (14:31 +0100)
To simplify operations on virDomainDiskHostDef arrays we will need deep
copy and freeing functions. Add and properly export them.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 1fc524fa27f6acef65f7a36491b936844b1edb0a..ff884327ac553ecb466bc059f51614b45ea2541a 100644 (file)
@@ -1216,9 +1216,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def)
         VIR_FREE(def->seclabels);
     }
 
-    for (i = 0; i < def->nhosts; i++)
-        virDomainDiskHostDefClear(&def->hosts[i]);
-    VIR_FREE(def->hosts);
+    virDomainDiskHostDefFree(def->nhosts, def->hosts);
 
     VIR_FREE(def);
 }
@@ -1233,6 +1231,57 @@ void virDomainDiskHostDefClear(virDomainDiskHostDefPtr def)
     VIR_FREE(def->socket);
 }
 
+
+void
+virDomainDiskHostDefFree(size_t nhosts,
+                         virDomainDiskHostDefPtr hosts)
+{
+    size_t i;
+
+    if (!hosts)
+        return;
+
+    for (i = 0; i < nhosts; i++)
+        virDomainDiskHostDefClear(&hosts[i]);
+
+    VIR_FREE(hosts);
+}
+
+
+virDomainDiskHostDefPtr
+virDomainDiskHostDefCopy(size_t nhosts,
+                         virDomainDiskHostDefPtr hosts)
+{
+    virDomainDiskHostDefPtr ret = NULL;
+    size_t i;
+
+    if (VIR_ALLOC_N(ret, nhosts) < 0)
+        goto error;
+
+    for (i = 0; i < nhosts; i++) {
+        virDomainDiskHostDefPtr src = &hosts[i];
+        virDomainDiskHostDefPtr dst = &ret[i];
+
+        dst->transport = src->transport;
+
+        if (VIR_STRDUP(dst->name, src->name) < 0)
+            goto error;
+
+        if (VIR_STRDUP(dst->port, src->port) < 0)
+            goto error;
+
+        if (VIR_STRDUP(dst->socket, src->socket) < 0)
+            goto error;
+    }
+
+    return ret;
+
+error:
+    virDomainDiskHostDefFree(nhosts, ret);
+    return NULL;
+}
+
+
 void virDomainControllerDefFree(virDomainControllerDefPtr def)
 {
     if (!def)
index b2231604ba8458ac385980f5badc70d1d6ce70f0..dd672e254ff93a156cc45cd756fbf209d8713346 100644 (file)
@@ -2210,6 +2210,9 @@ void virDomainInputDefFree(virDomainInputDefPtr def);
 void virDomainDiskDefFree(virDomainDiskDefPtr def);
 void virDomainLeaseDefFree(virDomainLeaseDefPtr def);
 void virDomainDiskHostDefClear(virDomainDiskHostDefPtr def);
+void virDomainDiskHostDefFree(size_t nhosts, virDomainDiskHostDefPtr hosts);
+virDomainDiskHostDefPtr virDomainDiskHostDefCopy(size_t nhosts,
+                                                 virDomainDiskHostDefPtr hosts);
 int virDomainDeviceFindControllerModel(virDomainDefPtr def,
                                        virDomainDeviceInfoPtr info,
                                        int controllerType);
index 50fe00e91cddc9bb99e45d8c4926c51ad84f653f..c6a876380cc00f0ac33552679d1581dd376cee83 100644 (file)
@@ -198,6 +198,8 @@ virDomainDiskFindByBusAndDst;
 virDomainDiskGeometryTransTypeFromString;
 virDomainDiskGeometryTransTypeToString;
 virDomainDiskHostDefClear;
+virDomainDiskHostDefCopy;
+virDomainDiskHostDefFree;
 virDomainDiskIndexByName;
 virDomainDiskInsert;
 virDomainDiskInsertPreAlloced;