From 684675c33b1a7c9322e2d6d5db8ba87b4d81bac4 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 29 Apr 2015 13:18:37 +0200 Subject: [PATCH] conf: Extract code to filter domain list into a separate function Separate the code to simplify future refactors. --- src/conf/domain_conf.c | 82 ++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0c3851321..6f43984db 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -22965,43 +22965,19 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, return ret; } -struct virDomainListData { - virConnectPtr conn; - virDomainPtr *domains; - virDomainObjListFilter filter; - unsigned int flags; - int ndomains; - bool error; -}; -#define MATCH(FLAG) (data->flags & (FLAG)) -static void -virDomainListPopulate(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) +#define MATCH(FLAG) (filter & (FLAG)) +static bool +virDomainObjMatchFilter(virDomainObjPtr vm, + unsigned int filter) { - struct virDomainListData *data = opaque; - virDomainObjPtr vm = payload; - virDomainPtr dom; - - if (data->error) - return; - - virObjectLock(vm); - /* check if the domain matches the filter */ - - /* filter by the callback function (access control checks) */ - if (data->filter != NULL && - !data->filter(data->conn, vm->def)) - goto cleanup; - /* filter by active state */ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) && !((MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE) && virDomainObjIsActive(vm)) || (MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE) && !virDomainObjIsActive(vm)))) - goto cleanup; + return false; /* filter by persistence */ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT) && @@ -23009,7 +22985,7 @@ virDomainListPopulate(void *payload, vm->persistent) || (MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) && !vm->persistent))) - goto cleanup; + return false; /* filter by domain state */ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) { @@ -23024,7 +23000,7 @@ virDomainListPopulate(void *payload, (st != VIR_DOMAIN_RUNNING && st != VIR_DOMAIN_PAUSED && st != VIR_DOMAIN_SHUTOFF)))) - goto cleanup; + return false; } /* filter by existence of managed save state */ @@ -23033,22 +23009,59 @@ virDomainListPopulate(void *payload, vm->hasManagedSave) || (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) && !vm->hasManagedSave))) - goto cleanup; + return false; /* filter by autostart option */ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART) && !((MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) && vm->autostart) || (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART) && !vm->autostart))) - goto cleanup; + return false; /* filter by snapshot existence */ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) { int nsnap = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0); if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) || (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap <= 0))) - goto cleanup; + return false; } + return true; +} +#undef MATCH + + +struct virDomainListData { + virConnectPtr conn; + virDomainPtr *domains; + virDomainObjListFilter filter; + unsigned int flags; + int ndomains; + bool error; +}; + +static void +virDomainListPopulate(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + struct virDomainListData *data = opaque; + virDomainObjPtr vm = payload; + virDomainPtr dom; + + if (data->error) + return; + + virObjectLock(vm); + /* check if the domain matches the filter */ + + /* filter by the callback function (access control checks) */ + if (data->filter != NULL && + !data->filter(data->conn, vm->def)) + goto cleanup; + + if (!virDomainObjMatchFilter(vm, data->flags)) + goto cleanup; + /* just count the machines */ if (!data->domains) { data->ndomains++; @@ -23068,7 +23081,6 @@ virDomainListPopulate(void *payload, virObjectUnlock(vm); return; } -#undef MATCH int -- 2.39.5