From 47171cd1a6a62e7e0c9851dcde945aa14973d775 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 15 Jun 2015 19:04:41 +0200 Subject: [PATCH] conf: Introduce helper to help getting correct def for getter functions virDomainObjGetOneDef will help to retrieve the correct definition pointer from @vm in cases where VIR_DOMAIN_AFFECT_LIVE and VIR_DOMAIN_AFFECT_CONFIG are mutually exclusive. The function simply returns the correct pointer. This similarly to virDomainObjGetDefs will greatly simplify the code. --- src/conf/domain_conf.c | 36 ++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + 3 files changed, 38 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e771d346c5..9d19893f31 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2948,6 +2948,42 @@ virDomainObjGetDefs(virDomainObjPtr vm, } +/** + * virDomainObjGetOneDef: + * + * @vm: Domain object + * @flags: for virDomainModificationImpact + * + * Helper function to resolve @flags and return the correct domain pointer + * object. This function returns one of @vm->def or @vm->persistentDef + * according to @flags. This helper should be used only in APIs that guarantee + * that @flags contains exactly one of VIR_DOMAIN_AFFECT_LIVE or + * VIR_DOMAIN_AFFECT_CONFIG and not both. + * + * Returns the correct definition pointer or NULL on error. + */ +virDomainDefPtr +virDomainObjGetOneDef(virDomainObjPtr vm, + unsigned int flags) +{ + if (flags & VIR_DOMAIN_AFFECT_LIVE && flags & VIR_DOMAIN_AFFECT_CONFIG) { + virReportInvalidArg(ctl, "%s", + _("Flags 'VIR_DOMAIN_AFFECT_LIVE' and " + "'VIR_DOMAIN_AFFECT_CONFIG' are mutually " + "exclusive")); + return NULL; + } + + if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) + return NULL; + + if (virDomainObjIsActive(vm) && flags & VIR_DOMAIN_AFFECT_CONFIG) + return vm->newDef; + else + return vm->def; +} + + /* * The caller must hold a lock on the driver owning 'doms', * and must also have locked 'dom', to ensure no one else diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ba17a8d732..db49d46752 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2553,6 +2553,7 @@ int virDomainObjGetDefs(virDomainObjPtr vm, unsigned int flags, virDomainDefPtr *liveDef, virDomainDefPtr *persDef); +virDomainDefPtr virDomainObjGetOneDef(virDomainObjPtr vm, unsigned int flags); int virDomainLiveConfigHelperMethod(virCapsPtr caps, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cd347ac6ad..2d4ab2171d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -385,6 +385,7 @@ virDomainObjEndAPI; virDomainObjFormat; virDomainObjGetDefs; virDomainObjGetMetadata; +virDomainObjGetOneDef; virDomainObjGetPersistentDef; virDomainObjGetState; virDomainObjListAdd;