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 b9c4c61..057602b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -22927,43 +22927,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) && @@ -22971,7 +22947,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)) { @@ -22986,7 +22962,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 */ @@ -22995,22 +22971,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++; @@ -23030,7 +23043,6 @@ virDomainListPopulate(void *payload, virObjectUnlock(vm); return; } -#undef MATCH int -- 2.3.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list