From nobody Sat Feb 7 10:14:53 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1507576892212332.42762195087175; Mon, 9 Oct 2017 12:21:32 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DFC4D4A6FB; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BA6A167CE0; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7878C18355C5; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ivhw5005116 for ; Mon, 9 Oct 2017 14:57:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id DCD4C53; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-17.phx2.redhat.com [10.3.116.17]) by smtp.corp.redhat.com (Postfix) with ESMTP id A64C060464 for ; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DFC4D4A6FB Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 14:57:39 -0400 Message-Id: <20171009185739.26188-3-jferlan@redhat.com> In-Reply-To: <20171009185739.26188-1-jferlan@redhat.com> References: <20171009185739.26188-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/2] secrets: Introduce virSecretObjListForEachCb X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Oct 2017 19:21:31 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rather than separate functions for NumOfSecrets, GetUUIDs, and ListExport - let's converge the code into one handler. Signed-off-by: John Ferlan --- src/conf/virsecretobj.c | 167 ++++++++++++++++----------------------------= ---- 1 file changed, 54 insertions(+), 113 deletions(-) diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index 47e0b28968..6046547875 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -410,64 +410,41 @@ virSecretObjListAdd(virSecretObjListPtr secrets, } =20 =20 -struct virSecretCountData { +typedef bool +(*virSecretObjListMatchFilter)(virSecretObjPtr obj, unsigned int flags); +struct _virSecretForEachData { virConnectPtr conn; virSecretObjListACLFilter filter; - int count; -}; - -static int -virSecretObjListNumOfSecretsCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) -{ - struct virSecretCountData *data =3D opaque; - virSecretObjPtr obj =3D payload; - virSecretDefPtr def; - - virObjectLock(obj); - def =3D obj->def; - - if (data->filter && !data->filter(data->conn, def)) - goto cleanup; - - data->count++; - - cleanup: - virObjectUnlock(obj); - return 0; -} - - -struct virSecretListData { - virConnectPtr conn; - virSecretObjListACLFilter filter; - int nuuids; - char **uuids; - int maxuuids; + virSecretObjListMatchFilter match; + unsigned int flags; bool error; + int nElems; + int maxElems; + char **uuids; + virSecretPtr *secrets; }; =20 - static int -virSecretObjListGetUUIDsCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) +virSecretObjListForEachCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) { - struct virSecretListData *data =3D opaque; + struct _virSecretForEachData *data =3D opaque; virSecretObjPtr obj =3D payload; - virSecretDefPtr def; + virSecretPtr secret =3D NULL; =20 if (data->error) return 0; =20 - if (data->maxuuids >=3D 0 && data->nuuids =3D=3D data->maxuuids) + if (data->maxElems >=3D 0 && data->nElems =3D=3D data->maxElems) return 0; =20 virObjectLock(obj); - def =3D obj->def; =20 - if (data->filter && !data->filter(data->conn, def)) + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + if (data->match && !data->match(obj, data->flags)) goto cleanup; =20 if (data->uuids) { @@ -478,10 +455,20 @@ virSecretObjListGetUUIDsCallback(void *payload, goto cleanup; } =20 - virUUIDFormat(def->uuid, uuidstr); - data->uuids[data->nuuids++] =3D uuidstr; + virUUIDFormat(obj->def->uuid, uuidstr); + data->uuids[data->nElems] =3D uuidstr; + } else if (data->secrets) { + if (!(secret =3D virGetSecret(data->conn, obj->def->uuid, + obj->def->usage_type, + obj->def->usage_id))) { + data->error =3D true; + goto cleanup; + } + data->secrets[data->nElems] =3D secret; } =20 + data->nElems++; + cleanup: virObjectUnlock(obj); return 0; @@ -493,14 +480,16 @@ virSecretObjListNumOfSecrets(virSecretObjListPtr secr= ets, virSecretObjListACLFilter filter, virConnectPtr conn) { - struct virSecretCountData data =3D { - .conn =3D conn, .filter =3D filter, .count =3D 0 }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .error =3D false, .nElems =3D 0, .maxElems =3D -1, + .uuids =3D NULL, .secrets =3D NULL }; =20 virObjectRWLockRead(secrets); - virHashForEach(secrets->objs, virSecretObjListNumOfSecretsCallback, &d= ata); + virHashForEach(secrets->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secrets); =20 - return data.count; + return data.nElems; } =20 =20 @@ -532,57 +521,6 @@ virSecretObjMatchFlags(virSecretObjPtr obj, #undef MATCH =20 =20 -struct virSecretObjListData { - virConnectPtr conn; - virSecretPtr *secrets; - virSecretObjListACLFilter filter; - unsigned int flags; - int nsecrets; - bool error; -}; - -static int -virSecretObjListExportCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) -{ - struct virSecretObjListData *data =3D opaque; - virSecretObjPtr obj =3D payload; - virSecretDefPtr def; - virSecretPtr secret =3D NULL; - - if (data->error) - return 0; - - virObjectLock(obj); - def =3D obj->def; - - if (data->filter && !data->filter(data->conn, def)) - goto cleanup; - - if (!virSecretObjMatchFlags(obj, data->flags)) - goto cleanup; - - if (!data->secrets) { - data->nsecrets++; - goto cleanup; - } - - if (!(secret =3D virGetSecret(data->conn, def->uuid, - def->usage_type, - def->usage_id))) { - data->error =3D true; - goto cleanup; - } - - data->secrets[data->nsecrets++] =3D secret; - - cleanup: - virObjectUnlock(obj); - return 0; -} - - int virSecretObjListExport(virConnectPtr conn, virSecretObjListPtr secretobjs, @@ -590,10 +528,10 @@ virSecretObjListExport(virConnectPtr conn, virSecretObjListACLFilter filter, unsigned int flags) { - struct virSecretObjListData data =3D { - .conn =3D conn, .secrets =3D NULL, - .filter =3D filter, .flags =3D flags, - .nsecrets =3D 0, .error =3D false }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D virSecretObjMatchFl= ags, + .flags =3D flags, .error =3D false, .nElems =3D 0, .maxElems =3D -= 1, + .uuids =3D NULL, .secrets =3D NULL }; =20 virObjectRWLockRead(secretobjs); if (secrets && @@ -601,8 +539,10 @@ virSecretObjListExport(virConnectPtr conn, virObjectRWUnlock(secretobjs); return -1; } + if (data.secrets) + data.maxElems =3D virHashSize(secretobjs->objs) + 1; =20 - virHashForEach(secretobjs->objs, virSecretObjListExportCallback, &data= ); + virHashForEach(secretobjs->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secretobjs); =20 if (data.error) @@ -610,11 +550,11 @@ virSecretObjListExport(virConnectPtr conn, =20 if (data.secrets) { /* trim the array to the final size */ - ignore_value(VIR_REALLOC_N(data.secrets, data.nsecrets + 1)); + ignore_value(VIR_REALLOC_N(data.secrets, data.nElems + 1)); *secrets =3D data.secrets; } =20 - return data.nsecrets; + return data.nElems; =20 error: virObjectListFree(data.secrets); @@ -629,22 +569,23 @@ virSecretObjListGetUUIDs(virSecretObjListPtr secrets, virSecretObjListACLFilter filter, virConnectPtr conn) { - struct virSecretListData data =3D { - .conn =3D conn, .filter =3D filter, .uuids =3D uuids, .nuuids =3D = 0, - .maxuuids =3D maxuuids, .error =3D false }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .error =3D false, .nElems =3D 0, .maxElems =3D maxuu= ids, + .uuids =3D uuids, .secrets =3D NULL }; =20 virObjectRWLockRead(secrets); - virHashForEach(secrets->objs, virSecretObjListGetUUIDsCallback, &data); + virHashForEach(secrets->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secrets); =20 if (data.error) goto error; =20 - return data.nuuids; + return data.nElems; =20 error: - while (--data.nuuids) - VIR_FREE(data.uuids[data.nuuids]); + while (--data.nElems) + VIR_FREE(data.uuids[data.nElems]); return -1; } =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list