}
-static void
-virDomainObjListCountActive(void *payload,
- const void *name ATTRIBUTE_UNUSED,
- void *data)
-{
- virDomainObjPtr obj = payload;
- int *count = data;
- virObjectLock(obj);
- if (virDomainObjIsActive(obj))
- (*count)++;
- virObjectUnlock(obj);
-}
+struct virDomainObjListData {
+ virDomainObjListFilter filter;
+ virConnectPtr conn;
+ bool active;
+ int count;
+};
static void
-virDomainObjListCountInactive(void *payload,
- const void *name ATTRIBUTE_UNUSED,
- void *data)
+virDomainObjListCount(void *payload,
+ const void *name ATTRIBUTE_UNUSED,
+ void *opaque)
{
virDomainObjPtr obj = payload;
- int *count = data;
+ struct virDomainObjListData *data = opaque;
virObjectLock(obj);
- if (!virDomainObjIsActive(obj))
- (*count)++;
+ if (data->filter &&
+ !data->filter(data->conn, obj->def))
+ goto cleanup;
+ if (virDomainObjIsActive(obj)) {
+ if (data->active)
+ data->count++;
+ } else {
+ if (!data->active)
+ data->count++;
+ }
+cleanup:
virObjectUnlock(obj);
}
int
virDomainObjListNumOfDomains(virDomainObjListPtr doms,
- int active)
+ bool active,
+ virDomainObjListFilter filter,
+ virConnectPtr conn)
{
- int count = 0;
+ struct virDomainObjListData data = { filter, conn, active, 0 };
virObjectLock(doms);
- if (active)
- virHashForEach(doms->objs, virDomainObjListCountActive, &count);
- else
- virHashForEach(doms->objs, virDomainObjListCountInactive, &count);
+ virHashForEach(doms->objs, virDomainObjListCount, &data);
virObjectUnlock(doms);
- return count;
+ return data.count;
}
struct virDomainIDData {
+ virDomainObjListFilter filter;
+ virConnectPtr conn;
int numids;
int maxids;
int *ids;
virDomainObjPtr obj = payload;
struct virDomainIDData *data = opaque;
virObjectLock(obj);
+ if (data->filter &&
+ !data->filter(data->conn, obj->def))
+ goto cleanup;
if (virDomainObjIsActive(obj) && data->numids < data->maxids)
data->ids[data->numids++] = obj->def->id;
+cleanup:
virObjectUnlock(obj);
}
int
virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
int *ids,
- int maxids)
+ int maxids,
+ virDomainObjListFilter filter,
+ virConnectPtr conn)
{
- struct virDomainIDData data = { 0, maxids, ids };
+ struct virDomainIDData data = { filter, conn,
+ 0, maxids, ids };
virObjectLock(doms);
virHashForEach(doms->objs, virDomainObjListCopyActiveIDs, &data);
virObjectUnlock(doms);
}
struct virDomainNameData {
+ virDomainObjListFilter filter;
+ virConnectPtr conn;
int oom;
int numnames;
int maxnames;
return;
virObjectLock(obj);
+ if (data->filter &&
+ !data->filter(data->conn, obj->def))
+ goto cleanup;
if (!virDomainObjIsActive(obj) && data->numnames < data->maxnames) {
if (VIR_STRDUP(data->names[data->numnames], obj->def->name) < 0)
data->oom = 1;
else
data->numnames++;
}
+cleanup:
virObjectUnlock(obj);
}
int
virDomainObjListGetInactiveNames(virDomainObjListPtr doms,
char **const names,
- int maxnames)
+ int maxnames,
+ virDomainObjListFilter filter,
+ virConnectPtr conn)
{
- struct virDomainNameData data = { 0, 0, maxnames, names };
+ struct virDomainNameData data = { filter, conn,
+ 0, 0, maxnames, names };
int i;
virObjectLock(doms);
virHashForEach(doms->objs, virDomainObjListCopyInactiveNames, &data);
struct virDomainListData {
virConnectPtr conn;
virDomainPtr *domains;
+ virDomainObjListFilter filter;
unsigned int flags;
int ndomains;
bool error;
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) &&
virDomainObjListExport(virDomainObjListPtr doms,
virConnectPtr conn,
virDomainPtr **domains,
+ virDomainObjListFilter filter,
unsigned int flags)
{
int ret = -1;
int i;
- struct virDomainListData data = { conn, NULL, flags, 0, false };
+ struct virDomainListData data = {
+ conn, NULL,
+ filter,
+ flags, 0, false
+ };
virObjectLock(doms);
if (domains) {
typedef struct _virDomainObjList virDomainObjList;
typedef virDomainObjList *virDomainObjListPtr;
+typedef bool (*virDomainObjListFilter)(virConnectPtr conn,
+ virDomainDefPtr def);
+
/* This structure holds various callbacks and data needed
* while parsing and creating domain XMLs */
int virDomainVideoDefaultType(virDomainDefPtr def);
int virDomainVideoDefaultRAM(virDomainDefPtr def, int type);
-int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active);
+int virDomainObjListNumOfDomains(virDomainObjListPtr doms,
+ bool active,
+ virDomainObjListFilter filter,
+ virConnectPtr conn);
int virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
int *ids,
- int maxids);
+ int maxids,
+ virDomainObjListFilter filter,
+ virConnectPtr conn);
int virDomainObjListGetInactiveNames(virDomainObjListPtr doms,
char **const names,
- int maxnames);
+ int maxnames,
+ virDomainObjListFilter filter,
+ virConnectPtr conn);
typedef int (*virDomainObjListIterator)(virDomainObjPtr dom,
void *opaque);
int virDomainObjListExport(virDomainObjListPtr doms,
virConnectPtr conn,
virDomainPtr **domains,
+ virDomainObjListFilter filter,
unsigned int flags);
virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def,
return -1;
libxlDriverLock(driver);
- n = virDomainObjListGetActiveIDs(driver->domains, ids, nids);
+ n = virDomainObjListGetActiveIDs(driver->domains, ids, nids,
+ virConnectListDomainsCheckACL, conn);
libxlDriverUnlock(driver);
return n;
return -1;
libxlDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true,
+ virConnectNumOfDomainsCheckACL, conn);
libxlDriverUnlock(driver);
return n;
return -1;
libxlDriverLock(driver);
- n = virDomainObjListGetInactiveNames(driver->domains, names, nnames);
+ n = virDomainObjListGetInactiveNames(driver->domains, names, nnames,
+ virConnectListDefinedDomainsCheckACL, conn);
libxlDriverUnlock(driver);
return n;
}
return -1;
libxlDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 0);
+ n = virDomainObjListNumOfDomains(driver->domains, false,
+ virConnectNumOfDefinedDomainsCheckACL, NULL);
libxlDriverUnlock(driver);
return n;
return -1;
libxlDriverLock(driver);
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ virConnectListAllDomainsCheckACL, flags);
libxlDriverUnlock(driver);
return ret;
return -1;
lxcDriverLock(driver);
- n = virDomainObjListGetActiveIDs(driver->domains, ids, nids);
+ n = virDomainObjListGetActiveIDs(driver->domains, ids, nids,
+ virConnectListDomainsCheckACL, conn);
lxcDriverUnlock(driver);
return n;
return -1;
lxcDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true,
+ virConnectNumOfDomainsCheckACL, conn);
lxcDriverUnlock(driver);
return n;
return -1;
lxcDriverLock(driver);
- n = virDomainObjListGetInactiveNames(driver->domains, names, nnames);
+ n = virDomainObjListGetInactiveNames(driver->domains, names, nnames,
+ virConnectListDefinedDomainsCheckACL, conn);
lxcDriverUnlock(driver);
return n;
return -1;
lxcDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 0);
+ n = virDomainObjListNumOfDomains(driver->domains, false,
+ virConnectNumOfDefinedDomainsCheckACL, conn);
lxcDriverUnlock(driver);
return n;
return -1;
lxcDriverLock(driver);
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ virConnectListAllDomainsCheckACL, flags);
lxcDriverUnlock(driver);
return ret;
int n;
openvzDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true, NULL, NULL);
openvzDriverUnlock(driver);
return n;
int n;
openvzDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 0);
+ n = virDomainObjListNumOfDomains(driver->domains, false, NULL, NULL);
openvzDriverUnlock(driver);
return n;
virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
openvzDriverLock(driver);
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ NULL, flags);
openvzDriverUnlock(driver);
return ret;
int n;
parallelsDriverLock(privconn);
- n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids);
+ n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids,
+ NULL, NULL);
parallelsDriverUnlock(privconn);
return n;
int count;
parallelsDriverLock(privconn);
- count = virDomainObjListNumOfDomains(privconn->domains, 1);
+ count = virDomainObjListNumOfDomains(privconn->domains, true,
+ NULL, NULL);
parallelsDriverUnlock(privconn);
return count;
parallelsDriverLock(privconn);
memset(names, 0, sizeof(*names) * maxnames);
n = virDomainObjListGetInactiveNames(privconn->domains, names,
- maxnames);
+ maxnames, NULL, NULL);
parallelsDriverUnlock(privconn);
return n;
int count;
parallelsDriverLock(privconn);
- count = virDomainObjListNumOfDomains(privconn->domains, 0);
+ count = virDomainObjListNumOfDomains(privconn->domains, false,
+ NULL, NULL);
parallelsDriverUnlock(privconn);
return count;
virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
parallelsDriverLock(privconn);
- ret = virDomainObjListExport(privconn->domains, conn, domains, flags);
+ ret = virDomainObjListExport(privconn->domains, conn, domains,
+ NULL, flags);
parallelsDriverUnlock(privconn);
return ret;
if (virConnectListDomainsEnsureACL(conn) < 0)
return -1;
- n = virDomainObjListGetActiveIDs(driver->domains, ids, nids);
+ n = virDomainObjListGetActiveIDs(driver->domains, ids, nids,
+ virConnectListDomainsCheckACL, conn);
return n;
}
if (virConnectNumOfDomainsEnsureACL(conn) < 0)
return -1;
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true,
+ virConnectNumOfDomainsCheckACL, conn);
return n;
}
if (virConnectListDefinedDomainsEnsureACL(conn) < 0)
goto cleanup;
- ret = virDomainObjListGetInactiveNames(driver->domains, names, nnames);
+ ret = virDomainObjListGetInactiveNames(driver->domains, names, nnames,
+ virConnectListDefinedDomainsCheckACL, NULL);
cleanup:
return ret;
if (virConnectNumOfDefinedDomainsEnsureACL(conn) < 0)
goto cleanup;
- ret = virDomainObjListNumOfDomains(driver->domains, 0);
+ ret = virDomainObjListNumOfDomains(driver->domains, false,
+ virConnectNumOfDefinedDomainsCheckACL, NULL);
cleanup:
return ret;
if (virConnectListAllDomainsEnsureACL(conn) < 0)
goto cleanup;
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ virConnectListAllDomainsCheckACL, flags);
cleanup:
return ret;
int count;
testDriverLock(privconn);
- count = virDomainObjListNumOfDomains(privconn->domains, 1);
+ count = virDomainObjListNumOfDomains(privconn->domains, true, NULL, NULL);
testDriverUnlock(privconn);
return count;
int n;
testDriverLock(privconn);
- n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids);
+ n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids, NULL, NULL);
testDriverUnlock(privconn);
return n;
int count;
testDriverLock(privconn);
- count = virDomainObjListNumOfDomains(privconn->domains, 0);
+ count = virDomainObjListNumOfDomains(privconn->domains, false, NULL, NULL);
testDriverUnlock(privconn);
return count;
testDriverLock(privconn);
memset(names, 0, sizeof(*names)*maxnames);
- n = virDomainObjListGetInactiveNames(privconn->domains, names, maxnames);
+ n = virDomainObjListGetInactiveNames(privconn->domains, names, maxnames,
+ NULL, NULL);
testDriverUnlock(privconn);
return n;
return 0;
}
+
static int testConnectListAllDomains(virConnectPtr conn,
virDomainPtr **domains,
unsigned int flags)
virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
testDriverLock(privconn);
- ret = virDomainObjListExport(privconn->domains, conn, domains, flags);
+ ret = virDomainObjListExport(privconn->domains, conn, domains,
+ NULL, flags);
testDriverUnlock(privconn);
return ret;
return -1;
umlDriverLock(driver);
- n = virDomainObjListGetActiveIDs(driver->domains, ids, nids);
+ n = virDomainObjListGetActiveIDs(driver->domains, ids, nids,
+ virConnectListDomainsCheckACL, conn);
umlDriverUnlock(driver);
return n;
return -1;
umlDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true,
+ virConnectNumOfDomainsCheckACL, conn);
umlDriverUnlock(driver);
return n;
return -1;
umlDriverLock(driver);
- n = virDomainObjListGetInactiveNames(driver->domains, names, nnames);
+ n = virDomainObjListGetInactiveNames(driver->domains, names, nnames,
+ virConnectListDefinedDomainsCheckACL, conn);
umlDriverUnlock(driver);
return n;
return -1;
umlDriverLock(driver);
- n = virDomainObjListNumOfDomains(driver->domains, 0);
+ n = virDomainObjListNumOfDomains(driver->domains, false,
+ virConnectNumOfDefinedDomainsCheckACL, conn);
umlDriverUnlock(driver);
return n;
return -1;
umlDriverLock(driver);
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ virConnectListAllDomainsCheckACL, flags);
umlDriverUnlock(driver);
return ret;
vmwareDriverLock(driver);
vmwareDomainObjListUpdateAll(driver->domains, driver);
- n = virDomainObjListNumOfDomains(driver->domains, 0);
+ n = virDomainObjListNumOfDomains(driver->domains, false, NULL, NULL);
vmwareDriverUnlock(driver);
return n;
vmwareDriverLock(driver);
vmwareDomainObjListUpdateAll(driver->domains, driver);
- n = virDomainObjListNumOfDomains(driver->domains, 1);
+ n = virDomainObjListNumOfDomains(driver->domains, true, NULL, NULL);
vmwareDriverUnlock(driver);
return n;
vmwareDriverLock(driver);
vmwareDomainObjListUpdateAll(driver->domains, driver);
- n = virDomainObjListGetActiveIDs(driver->domains, ids, nids);
+ n = virDomainObjListGetActiveIDs(driver->domains, ids, nids, NULL, NULL);
vmwareDriverUnlock(driver);
return n;
vmwareDriverLock(driver);
vmwareDomainObjListUpdateAll(driver->domains, driver);
- n = virDomainObjListGetInactiveNames(driver->domains, names, nnames);
+ n = virDomainObjListGetInactiveNames(driver->domains, names, nnames,
+ NULL, NULL);
vmwareDriverUnlock(driver);
return n;
}
vmwareDriverLock(driver);
vmwareDomainObjListUpdateAll(driver->domains, driver);
- ret = virDomainObjListExport(driver->domains, conn, domains, flags);
+ ret = virDomainObjListExport(driver->domains, conn, domains,
+ NULL, flags);
vmwareDriverUnlock(driver);
return ret;
}