From 4dced75e79431567dffc2f38f595fabe6440db48 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 11 Sep 2012 13:42:20 +0100 Subject: [PATCH] Add API for copying instances of the qemuCapsPtr object To allow each VM instance to record additional capabilities without affecting other VMs, there needs to be a way to do a deep copy of the qemuCapsPtr object --- src/qemu/qemu_capabilities.c | 47 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 1 + 2 files changed, 48 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 784ba8889c..c0082fb490 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1727,6 +1727,53 @@ no_memory: } +qemuCapsPtr qemuCapsNewCopy(qemuCapsPtr caps) +{ + qemuCapsPtr ret = qemuCapsNew(); + size_t i; + + if (!ret) + return NULL; + + virBitmapCopy(ret->flags, caps->flags); + + ret->version = caps->version; + ret->kvmVersion = caps->kvmVersion; + + if (caps->arch && + !(ret->arch = strdup(caps->arch))) + goto no_memory; + + if (VIR_ALLOC_N(ret->cpuDefinitions, caps->ncpuDefinitions) < 0) + goto no_memory; + ret->ncpuDefinitions = caps->ncpuDefinitions; + for (i = 0 ; i < caps->ncpuDefinitions ; i++) { + if (!(ret->cpuDefinitions[i] = strdup(caps->cpuDefinitions[i]))) + goto no_memory; + } + + if (VIR_ALLOC_N(ret->machineTypes, caps->nmachineTypes) < 0) + goto no_memory; + if (VIR_ALLOC_N(ret->machineAliases, caps->nmachineTypes) < 0) + goto no_memory; + ret->nmachineTypes = caps->nmachineTypes; + for (i = 0 ; i < caps->nmachineTypes ; i++) { + if (!(ret->machineTypes[i] = strdup(caps->machineTypes[i]))) + goto no_memory; + if (caps->machineAliases[i] && + !(ret->machineAliases[i] = strdup(caps->machineAliases[i]))) + goto no_memory; + } + + return ret; + +no_memory: + virReportOOMError(); + virObjectUnref(ret); + return NULL; +} + + void qemuCapsDispose(void *obj) { qemuCapsPtr caps = obj; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 05e4ad11c7..8f145a7d00 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -150,6 +150,7 @@ typedef struct _qemuCaps qemuCaps; typedef qemuCaps *qemuCapsPtr; qemuCapsPtr qemuCapsNew(void); +qemuCapsPtr qemuCapsNewCopy(qemuCapsPtr caps); void qemuCapsSet(qemuCapsPtr caps, enum qemuCapsFlags flag) ATTRIBUTE_NONNULL(1);