提交 684675c3 编写于 作者: P Peter Krempa

conf: Extract code to filter domain list into a separate function

Separate the code to simplify future refactors.
上级 a5e89ae1
...@@ -22965,43 +22965,19 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, ...@@ -22965,43 +22965,19 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src,
return ret; return ret;
} }
struct virDomainListData {
virConnectPtr conn;
virDomainPtr *domains;
virDomainObjListFilter filter;
unsigned int flags;
int ndomains;
bool error;
};
#define MATCH(FLAG) (data->flags & (FLAG)) #define MATCH(FLAG) (filter & (FLAG))
static void static bool
virDomainListPopulate(void *payload, virDomainObjMatchFilter(virDomainObjPtr vm,
const void *name ATTRIBUTE_UNUSED, unsigned int filter)
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;
/* filter by active state */ /* filter by active state */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) && if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) &&
!((MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE) && !((MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE) &&
virDomainObjIsActive(vm)) || virDomainObjIsActive(vm)) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE) && (MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE) &&
!virDomainObjIsActive(vm)))) !virDomainObjIsActive(vm))))
goto cleanup; return false;
/* filter by persistence */ /* filter by persistence */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT) && if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT) &&
...@@ -23009,7 +22985,7 @@ virDomainListPopulate(void *payload, ...@@ -23009,7 +22985,7 @@ virDomainListPopulate(void *payload,
vm->persistent) || vm->persistent) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) && (MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) &&
!vm->persistent))) !vm->persistent)))
goto cleanup; return false;
/* filter by domain state */ /* filter by domain state */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) { if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) {
...@@ -23024,7 +23000,7 @@ virDomainListPopulate(void *payload, ...@@ -23024,7 +23000,7 @@ virDomainListPopulate(void *payload,
(st != VIR_DOMAIN_RUNNING && (st != VIR_DOMAIN_RUNNING &&
st != VIR_DOMAIN_PAUSED && st != VIR_DOMAIN_PAUSED &&
st != VIR_DOMAIN_SHUTOFF)))) st != VIR_DOMAIN_SHUTOFF))))
goto cleanup; return false;
} }
/* filter by existence of managed save state */ /* filter by existence of managed save state */
...@@ -23033,22 +23009,59 @@ virDomainListPopulate(void *payload, ...@@ -23033,22 +23009,59 @@ virDomainListPopulate(void *payload,
vm->hasManagedSave) || vm->hasManagedSave) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) && (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) &&
!vm->hasManagedSave))) !vm->hasManagedSave)))
goto cleanup; return false;
/* filter by autostart option */ /* filter by autostart option */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART) && if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART) &&
!((MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) && vm->autostart) || !((MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) && vm->autostart) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART) && !vm->autostart))) (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART) && !vm->autostart)))
goto cleanup; return false;
/* filter by snapshot existence */ /* filter by snapshot existence */
if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) { if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) {
int nsnap = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0); int nsnap = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0);
if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) || if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) ||
(MATCH(VIR_CONNECT_LIST_DOMAINS_NO_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 */ /* just count the machines */
if (!data->domains) { if (!data->domains) {
data->ndomains++; data->ndomains++;
...@@ -23068,7 +23081,6 @@ virDomainListPopulate(void *payload, ...@@ -23068,7 +23081,6 @@ virDomainListPopulate(void *payload,
virObjectUnlock(vm); virObjectUnlock(vm);
return; return;
} }
#undef MATCH
int int
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册