From: Peter Krempa Date: Thu, 12 Jun 2014 13:26:18 +0000 (+0200) Subject: storage: encryption: Add deep copy function for storage encryption X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=756b46ddd243c3293f7d8193916f0c048d8d6347;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git storage: encryption: Add deep copy function for storage encryption --- diff --git a/src/util/virstorageencryption.c b/src/util/virstorageencryption.c index 13064900c..5a401b79b 100644 --- a/src/util/virstorageencryption.c +++ b/src/util/virstorageencryption.c @@ -66,6 +66,46 @@ virStorageEncryptionFree(virStorageEncryptionPtr enc) VIR_FREE(enc); } +static virStorageEncryptionSecretPtr +virStorageEncryptionSecretCopy(const virStorageEncryptionSecret *src) +{ + virStorageEncryptionSecretPtr ret; + + if (VIR_ALLOC(ret) < 0) + return NULL; + + memcpy(ret, src, sizeof(*src)); + + return ret; +} + +virStorageEncryptionPtr +virStorageEncryptionCopy(const virStorageEncryption *src) +{ + virStorageEncryptionPtr ret; + size_t i; + + if (VIR_ALLOC(ret) < 0) + return NULL; + + if (VIR_ALLOC_N(ret->secrets, src->nsecrets) < 0) + goto error; + + ret->nsecrets = src->nsecrets; + ret->format = src->format; + + for (i = 0; i < src->nsecrets; i++) { + if (!(ret->secrets[i] = virStorageEncryptionSecretCopy(src->secrets[i]))) + goto error; + } + + return ret; + + error: + virStorageEncryptionFree(ret); + return NULL; +} + static virStorageEncryptionSecretPtr virStorageEncryptionSecretParse(xmlXPathContextPtr ctxt, xmlNodePtr node) diff --git a/src/util/virstorageencryption.h b/src/util/virstorageencryption.h index f63c9eeb1..04641b1dc 100644 --- a/src/util/virstorageencryption.h +++ b/src/util/virstorageencryption.h @@ -61,6 +61,9 @@ struct _virStorageEncryption { virStorageEncryptionSecretPtr *secrets; }; +virStorageEncryptionPtr virStorageEncryptionCopy(const virStorageEncryption *src) + ATTRIBUTE_NONNULL(1); + void virStorageEncryptionFree(virStorageEncryptionPtr enc); virStorageEncryptionPtr virStorageEncryptionParseNode(xmlDocPtr xml,