diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index b808902f296e9d9e1d9fd980b4d77291514cd8cd..7f103e3bd2e2d39041c4d7faa1e2c9b8c35ee2e3 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -430,3 +430,47 @@ virSecretObjListAdd(virSecretObjListPtr secrets, virObjectUnlock(secrets); return ret; } + + +struct virSecretObjListGetHelperData { + virConnectPtr conn; + virSecretObjListACLFilter filter; + int got; +}; + + +static int +virSecretObjListGetHelper(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + struct virSecretObjListGetHelperData *data = opaque; + virSecretObjPtr obj = payload; + + virObjectLock(obj); + + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + data->got++; + + cleanup: + virObjectUnlock(obj); + return 0; +} + + +int +virSecretObjListNumOfSecrets(virSecretObjListPtr secrets, + virSecretObjListACLFilter filter, + virConnectPtr conn) +{ + struct virSecretObjListGetHelperData data = { + .conn = conn, .filter = filter, .got = 0 }; + + virObjectLock(secrets); + virHashForEach(secrets->objs, virSecretObjListGetHelper, &data); + virObjectUnlock(secrets); + + return data.got; +} diff --git a/src/conf/virsecretobj.h b/src/conf/virsecretobj.h index 290e91b84a4ad29442eead54e5eebaa159fca993..7f0d40a25656ae724456bc0d05522186263a42d0 100644 --- a/src/conf/virsecretobj.h +++ b/src/conf/virsecretobj.h @@ -73,4 +73,11 @@ virSecretObjPtr virSecretObjListAdd(virSecretObjListPtr secrets, const char *configDir, virSecretDefPtr *oldDef); +typedef bool (*virSecretObjListACLFilter)(virConnectPtr conn, + virSecretDefPtr def); + +int virSecretObjListNumOfSecrets(virSecretObjListPtr secrets, + virSecretObjListACLFilter filter, + virConnectPtr conn); + #endif /* __VIRSECRETOBJ_H__ */