[libvirt] [PATCH 2/3] interface: Introduce virInterfaceObjGetNames
John Ferlan
jferlan at redhat.com
Mon Apr 10 10:46:52 UTC 2017
On 04/10/2017 04:11 AM, Michal Privoznik wrote:
> On 04/06/2017 04:08 PM, John Ferlan wrote:
>> Unlike other drivers, this is a test driver only API. Still combining
>> the logic of testConnectListInterfaces and
>> testConnectListDefinedInterfaces
>> makes things a bit easier in the long run.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>> src/conf/virinterfaceobj.c | 34 +++++++++++++++++++++++++++++
>> src/conf/virinterfaceobj.h | 6 ++++++
>> src/libvirt_private.syms | 1 +
>> src/test/test_driver.c | 54
>> +++++++++++-----------------------------------
>> 4 files changed, 53 insertions(+), 42 deletions(-)
>>
>> diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
>> index 0407c1f..229226a 100644
>> --- a/src/conf/virinterfaceobj.c
>> +++ b/src/conf/virinterfaceobj.c
>> @@ -235,3 +235,37 @@
>> virInterfaceObjNumOfInterfaces(virInterfaceObjListPtr interfaces,
>>
>> return ninterfaces;
>> }
>> +
>> +
>> +int
>> +virInterfaceObjGetNames(virInterfaceObjListPtr interfaces,
>> + bool wantActive,
>> + char **const names,
>> + int maxnames)
>> +{
>> + int nnames = 0;
>> + size_t i;
>> +
>> + for (i = 0; i < interfaces->count && nnames < maxnames; i++) {
>> + virInterfaceObjPtr obj = interfaces->objs[i];
>> + virInterfaceObjLock(obj);
>> + if ((wantActive && virInterfaceObjIsActive(obj)) ||
>> + (!wantActive && !virInterfaceObjIsActive(obj))) {
>
> Again. if (wantActive == virInterfaceObjIsActive()) ...
>
>> + if (VIR_STRDUP(names[nnames], obj->def->name) < 0) {
>> + virInterfaceObjUnlock(obj);
>> + goto failure;
>> + }
>> + nnames++;
>> + }
>> + virInterfaceObjUnlock(obj);
>> + }
>> +
>> + return nnames;
>> +
>> + failure:
>> + while (--nnames >= 0)
>> + VIR_FREE(names[nnames]);
>> + memset(names, 0, maxnames * sizeof(*names));
>
> This isn't necessary. Firstly, VIR_FREE() already sets all those items
> in the array we've touched to zero. Secondly, the callers already clear
> our the array (even those items we haven't touched). But mostly, in
> general, if an error is returned, callers should not rely on anything
> else that is returned. For instance, should virStrToLong_*(s, &ret,
> base, &result) return -1, the @result is undefined.
>
OK - that's fine... While going through this exercise of convergence I
have found some places that did this (nwfilter, storage pool/volume) and
others that don't. The "goal" was to be consistent for all.
I will remove it -
>> +
>> + return -1;
>> +}
>> diff --git a/src/conf/virinterfaceobj.h b/src/conf/virinterfaceobj.h
>> index 2f07174..5b0527d 100644
>> --- a/src/conf/virinterfaceobj.h
>> +++ b/src/conf/virinterfaceobj.h
>> @@ -85,4 +85,10 @@ int
>> virInterfaceObjNumOfInterfaces(virInterfaceObjListPtr interfaces,
>> bool wantActive);
>>
>> +int
>> +virInterfaceObjGetNames(virInterfaceObjListPtr interfaces,
>> + bool wantActive,
>> + char **const names,
>> + int maxnames);
>> +
>> #endif /* __VIRINTERFACEOBJ_H__ */
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 96aacaa..88e530c 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -935,6 +935,7 @@ virDomainObjListRename;
>> virInterfaceObjAssignDef;
>> virInterfaceObjFindByMACString;
>> virInterfaceObjFindByName;
>> +virInterfaceObjGetNames;
>> virInterfaceObjListClone;
>> virInterfaceObjListFree;
>> virInterfaceObjLock;
>> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
>> index 6910681..4e10eb2 100644
>> --- a/src/test/test_driver.c
>> +++ b/src/test/test_driver.c
>> @@ -3657,33 +3657,18 @@ static int
>> testConnectNumOfInterfaces(virConnectPtr conn)
>> return ninterfaces;
>> }
>>
>> -static int testConnectListInterfaces(virConnectPtr conn, char **const
>> names, int nnames)
>> +static int testConnectListInterfaces(virConnectPtr conn, char **const
>> names, int maxnames)
>> {
>> testDriverPtr privconn = conn->privateData;
>> - int n = 0;
>> - size_t i;
>> + int nnames;
>> +
>> + memset(names, 0, maxnames * sizeof(*names));
>
> I don't think this is necessary either, but I don't care that much.
>
True, but similar to above it's more of a try to be consistent. In the
long run - all the driver specific functions would use a single common
function withe the details of driver data (e.g. ->def and 'filter'
checks) being handled by specific code.
Similarly I will remove it.
tks -
John
>>
>> testDriverLock(privconn);
>> - memset(names, 0, sizeof(*names)*nnames);
>> - for (i = 0; (i < privconn->ifaces.count) && (n < nnames); i++) {
>> - virInterfaceObjLock(privconn->ifaces.objs[i]);
>> - if (virInterfaceObjIsActive(privconn->ifaces.objs[i])) {
>> - if (VIR_STRDUP(names[n++],
>> privconn->ifaces.objs[i]->def->name) < 0) {
>> - virInterfaceObjUnlock(privconn->ifaces.objs[i]);
>> - goto error;
>> - }
>> - }
>> - virInterfaceObjUnlock(privconn->ifaces.objs[i]);
>> - }
>> + nnames = virInterfaceObjGetNames(&privconn->ifaces, true, names,
>> maxnames);
>> testDriverUnlock(privconn);
>>
>> - return n;
>> -
>> - error:
>> - for (n = 0; n < nnames; n++)
>> - VIR_FREE(names[n]);
>> - testDriverUnlock(privconn);
>> - return -1;
>> + return nnames;
>
> ACK
>
> Michal
More information about the libvir-list
mailing list