From nobody Thu May 15 23:34:46 2025 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 1503093155203176.0420783800256; Fri, 18 Aug 2017 14:52:35 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7C14C81DF3; Fri, 18 Aug 2017 21:52:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C3145D970; Fri, 18 Aug 2017 21:52:33 +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 2735D3FAD8; Fri, 18 Aug 2017 21:52:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v7ILoo37005104 for ; Fri, 18 Aug 2017 17:50:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5E53F5D962; Fri, 18 Aug 2017 21:50:50 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-120-47.rdu2.redhat.com [10.10.120.47]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1C6FC5D961 for ; Fri, 18 Aug 2017 21:50:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7C14C81DF3 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Fri, 18 Aug 2017 17:50:41 -0400 Message-Id: <20170818215041.8118-18-jferlan@redhat.com> In-Reply-To: <20170818215041.8118-1-jferlan@redhat.com> References: <20170818215041.8118-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v4 17/17] network: Use virObjectLookup{Keys|Hash} 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 18 Aug 2017 21:52:33 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Use the virObjectLookupKeys in _virNetworkObj and use the virObjectLookupHash in _virNetworkObjList. Convert the code to use the LookupHash object and APIs rather than the local code and usage of virHash* calls. Since the _virNetworkObjList only contains the @parent object the virClassNew must be removed from OnceInit because instantiation would fail since the object size would be the same as the parent object size. Usage of HashLookup{Find|Search} API's returns a locked/reffed object so need to remove virObjectLock after FindBy*Locked calls. Use the def->name as a second key to the LookupHash to make for faster lookup's by name (instead of using Search on uuid key and matching the name. Signed-off-by: John Ferlan --- src/conf/virnetworkobj.c | 291 ++++++++++++----------------------------= ---- src/conf/virnetworkobj.h | 3 +- tests/networkxml2conftest.c | 4 +- 3 files changed, 86 insertions(+), 212 deletions(-) diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index 20f846d..d175191 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -40,11 +40,10 @@ VIR_LOG_INIT("conf.virnetworkobj"); #define INIT_CLASS_ID_BITMAP_SIZE (1<<4) =20 struct _virNetworkObj { - virObjectLockable parent; + virObjectLookupKeys parent; =20 pid_t dnsmasqPid; pid_t radvdPid; - bool active; bool autostart; bool persistent; =20 @@ -61,30 +60,21 @@ struct _virNetworkObj { }; =20 struct _virNetworkObjList { - virObjectLockable parent; - - virHashTablePtr objs; + virObjectLookupHash parent; }; =20 static virClassPtr virNetworkObjClass; -static virClassPtr virNetworkObjListClass; static void virNetworkObjDispose(void *obj); -static void virNetworkObjListDispose(void *obj); =20 static int virNetworkObjOnceInit(void) { - if (!(virNetworkObjClass =3D virClassNew(virClassForObjectLockable(), + if (!(virNetworkObjClass =3D virClassNew(virClassForObjectLookupKeys(), "virNetworkObj", sizeof(virNetworkObj), virNetworkObjDispose))) return -1; =20 - if (!(virNetworkObjListClass =3D virClassNew(virClassForObjectLockable= (), - "virNetworkObjList", - sizeof(virNetworkObjList), - virNetworkObjListDispose))) - return -1; return 0; } =20 @@ -92,14 +82,15 @@ virNetworkObjOnceInit(void) VIR_ONCE_GLOBAL_INIT(virNetworkObj) =20 virNetworkObjPtr -virNetworkObjNew(void) +virNetworkObjNew(const char *uuidstr, + const char *name) { virNetworkObjPtr obj; =20 if (virNetworkObjInitialize() < 0) return NULL; =20 - if (!(obj =3D virObjectLockableNew(virNetworkObjClass))) + if (!(obj =3D virObjectLookupKeysNew(virNetworkObjClass, uuidstr, name= ))) return NULL; =20 if (!(obj->classIdMap =3D virBitmapNew(INIT_CLASS_ID_BITMAP_SIZE))) @@ -158,7 +149,7 @@ virNetworkObjGetNewDef(virNetworkObjPtr obj) bool virNetworkObjIsActive(virNetworkObjPtr obj) { - return obj->active; + return virObjectLookupKeysIsActive(obj); } =20 =20 @@ -166,7 +157,7 @@ void virNetworkObjSetActive(virNetworkObjPtr obj, bool active) { - obj->active =3D active; + virObjectLookupKeysSetActive(obj, active); } =20 =20 @@ -332,36 +323,16 @@ virNetworkObjMacMgrDel(virNetworkObjPtr obj, virNetworkObjListPtr virNetworkObjListNew(void) { - virNetworkObjListPtr nets; - - if (virNetworkObjInitialize() < 0) - return NULL; - - if (!(nets =3D virObjectLockableNew(virNetworkObjListClass))) - return NULL; - - if (!(nets->objs =3D virHashCreate(50, virObjectFreeHashData))) { - virObjectUnref(nets); - return NULL; - } - - return nets; + return virObjectLookupHashNew(virClassForObjectLookupHash(), 50, true); } =20 =20 static virNetworkObjPtr virNetworkObjFindByUUIDLocked(virNetworkObjListPtr nets, - const unsigned char *uuid) + const char *uuidstr) { - virNetworkObjPtr obj =3D NULL; - char uuidstr[VIR_UUID_STRING_BUFLEN]; - - virUUIDFormat(uuid, uuidstr); - - obj =3D virHashLookup(nets->objs, uuidstr); - if (obj) - virObjectRef(obj); - return obj; + virObjectLookupKeysPtr obj =3D virObjectLookupHashFindLocked(nets, uui= dstr); + return (virNetworkObjPtr)obj; } =20 =20 @@ -379,30 +350,11 @@ virNetworkObjPtr virNetworkObjFindByUUID(virNetworkObjListPtr nets, const unsigned char *uuid) { - virNetworkObjPtr obj; - - virObjectLock(nets); - obj =3D virNetworkObjFindByUUIDLocked(nets, uuid); - virObjectUnlock(nets); - if (obj) - virObjectLock(obj); - return obj; -} - - -static int -virNetworkObjSearchName(const void *payload, - const void *name ATTRIBUTE_UNUSED, - const void *data) -{ - virNetworkObjPtr obj =3D (virNetworkObjPtr) payload; - int want =3D 0; + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(uuid, uuidstr); =20 - virObjectLock(obj); - if (STREQ(obj->def->name, (const char *)data)) - want =3D 1; - virObjectUnlock(obj); - return want; + virObjectLookupKeysPtr obj =3D virObjectLookupHashFind(nets, uuidstr); + return (virNetworkObjPtr)obj; } =20 =20 @@ -410,12 +362,8 @@ static virNetworkObjPtr virNetworkObjFindByNameLocked(virNetworkObjListPtr nets, const char *name) { - virNetworkObjPtr obj =3D NULL; - - obj =3D virHashSearch(nets->objs, virNetworkObjSearchName, name, NULL); - if (obj) - virObjectRef(obj); - return obj; + virObjectLookupKeysPtr obj =3D virObjectLookupHashFindLocked(nets, nam= e); + return (virNetworkObjPtr)obj; } =20 =20 @@ -433,14 +381,8 @@ virNetworkObjPtr virNetworkObjFindByName(virNetworkObjListPtr nets, const char *name) { - virNetworkObjPtr obj; - - virObjectLock(nets); - obj =3D virNetworkObjFindByNameLocked(nets, name); - virObjectUnlock(nets); - if (obj) - virObjectLock(obj); - return obj; + virObjectLookupKeysPtr obj =3D virObjectLookupHashFind(nets, name); + return (virNetworkObjPtr)obj; } =20 =20 @@ -470,15 +412,6 @@ virNetworkObjDispose(void *opaque) } =20 =20 -static void -virNetworkObjListDispose(void *opaque) -{ - virNetworkObjListPtr nets =3D opaque; - - virHashFree(nets->objs); -} - - /* * virNetworkObjUpdateAssignDef: * @network: the network object to update @@ -560,12 +493,12 @@ virNetworkObjAssignDefLocked(virNetworkObjListPtr net= s, virNetworkObjPtr ret =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 + virUUIDFormat(def->uuid, uuidstr); /* See if a network with matching UUID already exists */ - if ((obj =3D virNetworkObjFindByUUIDLocked(nets, def->uuid))) { + if ((obj =3D virNetworkObjFindByUUIDLocked(nets, uuidstr))) { virObjectLock(obj); /* UUID matches, but if names don't match, refuse it */ if (STRNEQ(obj->def->name, def->name)) { - virUUIDFormat(obj->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("network '%s' is already defined with uuid %s= "), obj->def->name, uuidstr); @@ -588,20 +521,17 @@ virNetworkObjAssignDefLocked(virNetworkObjListPtr net= s, /* UUID does not match, but if a name matches, refuse it */ if ((obj =3D virNetworkObjFindByNameLocked(nets, def->name))) { virObjectLock(obj); - virUUIDFormat(obj->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("network '%s' already exists with uuid %s"), def->name, uuidstr); goto cleanup; } =20 - if (!(obj =3D virNetworkObjNew())) - goto cleanup; + if (!(obj =3D virNetworkObjNew(uuidstr, def->name))) + goto cleanup; =20 - virUUIDFormat(def->uuid, uuidstr); - if (virHashAddEntry(nets->objs, uuidstr, obj) < 0) + if (virObjectLookupHashAdd(nets, (virObjectLookupKeysPtr)obj) < 0) goto cleanup; - virObjectRef(obj); =20 obj->def =3D def; obj->persistent =3D !(flags & VIR_NETWORK_OBJ_LIST_ADD_LIVE); @@ -638,9 +568,9 @@ virNetworkObjAssignDef(virNetworkObjListPtr nets, { virNetworkObjPtr obj; =20 - virObjectLock(nets); + virObjectRWLockWrite(nets); obj =3D virNetworkObjAssignDefLocked(nets, def, flags); - virObjectUnlock(nets); + virObjectRWUnlock(nets); return obj; } =20 @@ -784,16 +714,7 @@ void virNetworkObjRemoveInactive(virNetworkObjListPtr nets, virNetworkObjPtr obj) { - char uuidstr[VIR_UUID_STRING_BUFLEN]; - - virUUIDFormat(obj->def->uuid, uuidstr); - virObjectRef(obj); - virObjectUnlock(obj); - virObjectLock(nets); - virObjectLock(obj); - virHashRemoveEntry(nets->objs, uuidstr); - virObjectUnlock(nets); - virObjectUnref(obj); + virObjectLookupHashRemove(nets, (virObjectLookupKeysPtr)obj); } =20 =20 @@ -968,7 +889,8 @@ virNetworkLoadState(virNetworkObjListPtr nets, obj->floor_sum =3D floor_sum_val; =20 obj->taint =3D taint; - obj->active =3D true; /* network with a state file is by definition ac= tive */ + /* network with a state file is by definition active */ + virNetworkObjSetActive(obj, true); =20 cleanup: VIR_FREE(configFile); @@ -1177,14 +1099,15 @@ virNetworkObjBridgeInUse(virNetworkObjListPtr nets, const char *bridge, const char *skipname) { + bool ret; virNetworkObjPtr obj; struct virNetworkObjBridgeInUseHelperData data =3D {bridge, skipname}; =20 - virObjectLock(nets); - obj =3D virHashSearch(nets->objs, virNetworkObjBridgeInUseHelper, &dat= a, NULL); - virObjectUnlock(nets); + obj =3D (virNetworkObjPtr)virObjectLookupHashSearch(nets, virNetworkOb= jBridgeInUseHelper, &data); =20 - return obj !=3D NULL; + ret =3D obj !=3D NULL; + virNetworkObjEndAPI(&obj); + return ret; } =20 =20 @@ -1309,21 +1232,14 @@ virNetworkMatch(virNetworkObjPtr obj, #undef MATCH =20 =20 -struct virNetworkObjListData { - virConnectPtr conn; - virNetworkPtr *nets; - virNetworkObjListFilter filter; - unsigned int flags; - int nnets; - bool error; -}; - static int -virNetworkObjListPopulate(void *payload, +virNetworkObjListExportCb(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) { - struct virNetworkObjListData *data =3D opaque; + virObjectLookupHashForEachDataPtr data =3D opaque; + virNetworkPtr *nets =3D (virNetworkPtr *)data->elems; + virNetworkObjListFilter filter =3D data->filter; virNetworkObjPtr obj =3D payload; virNetworkPtr net =3D NULL; =20 @@ -1332,15 +1248,14 @@ virNetworkObjListPopulate(void *payload, =20 virObjectLock(obj); =20 - if (data->filter && - !data->filter(data->conn, obj->def)) + if (filter && !filter(data->conn, obj->def)) goto cleanup; =20 if (!virNetworkMatch(obj, data->flags)) goto cleanup; =20 - if (!data->nets) { - data->nnets++; + if (!nets) { + data->nElems++; goto cleanup; } =20 @@ -1349,7 +1264,7 @@ virNetworkObjListPopulate(void *payload, goto cleanup; } =20 - data->nets[data->nnets++] =3D net; + nets[data->nElems++] =3D net; =20 cleanup: virObjectUnlock(obj); @@ -1364,34 +1279,19 @@ virNetworkObjListExport(virConnectPtr conn, virNetworkObjListFilter filter, unsigned int flags) { - int ret =3D -1; - struct virNetworkObjListData data =3D { - .conn =3D conn, .nets =3D NULL, .filter =3D filter, .flags =3D fla= gs, - .nnets =3D 0, .error =3D false }; - - virObjectLock(netobjs); - if (nets && VIR_ALLOC_N(data.nets, virHashSize(netobjs->objs) + 1) < 0) - goto cleanup; - - virHashForEach(netobjs->objs, virNetworkObjListPopulate, &data); + int ret; + virObjectLookupHashForEachData data =3D { + .conn =3D conn, .filter =3D filter, .error =3D false, .nElems =3D = 0, + .elems =3D NULL, .maxElems =3D 0, .flags =3D flags }; =20 - if (data.error) - goto cleanup; + if (nets) + data.maxElems =3D -1; =20 - if (data.nets) { - /* trim the array to the final size */ - ignore_value(VIR_REALLOC_N(data.nets, data.nnets + 1)); - *nets =3D data.nets; - data.nets =3D NULL; - } + ret =3D virObjectLookupHashForEach(netobjs, virNetworkObjListExportCb,= &data); =20 - ret =3D data.nnets; - cleanup: - virObjectUnlock(netobjs); - while (data.nets && data.nnets) - virObjectUnref(data.nets[--data.nnets]); + if (nets) + *nets =3D (virNetworkPtr *)data.elems; =20 - VIR_FREE(data.nets); return ret; } =20 @@ -1407,10 +1307,11 @@ virNetworkObjListForEachHelper(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) { - struct virNetworkObjListForEachHelperData *data =3D opaque; + virObjectLookupHashForEachDataPtr data =3D opaque; + struct virNetworkObjListForEachHelperData *helperData =3D data->opaque; =20 - if (data->callback(payload, data->opaque) < 0) - data->ret =3D -1; + if (helperData->callback(payload, helperData->opaque) < 0) + helperData->ret =3D -1; return 0; } =20 @@ -1433,54 +1334,45 @@ virNetworkObjListForEach(virNetworkObjListPtr nets, virNetworkObjListIterator callback, void *opaque) { - struct virNetworkObjListForEachHelperData data =3D { + struct virNetworkObjListForEachHelperData helperData =3D { .callback =3D callback, .opaque =3D opaque, .ret =3D 0}; - virObjectLock(nets); - virHashForEach(nets->objs, virNetworkObjListForEachHelper, &data); - virObjectUnlock(nets); - return data.ret; -} + virObjectLookupHashForEachData data =3D { + .opaque =3D &helperData, .error =3D false, .maxElems =3D 0 }; =20 + return virObjectLookupHashForEach(nets, virNetworkObjListForEachHelper, + &data); +} =20 -struct virNetworkObjListGetHelperData { - virConnectPtr conn; - virNetworkObjListFilter filter; - char **names; - int nnames; - int maxnames; - bool active; - bool error; -}; =20 static int virNetworkObjListGetHelper(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) { - struct virNetworkObjListGetHelperData *data =3D opaque; virNetworkObjPtr obj =3D payload; + virObjectLookupHashForEachDataPtr data =3D opaque; + virNetworkObjListFilter filter =3D data->filter; + char **names =3D (char **)data->elems; =20 if (data->error) return 0; =20 - if (data->maxnames >=3D 0 && - data->nnames =3D=3D data->maxnames) + if (data->maxElems >=3D 0 && + data->nElems =3D=3D data->maxElems) return 0; =20 virObjectLock(obj); =20 - if (data->filter && - !data->filter(data->conn, obj->def)) + if (filter && !filter(data->conn, obj->def)) goto cleanup; =20 - if ((data->active && virNetworkObjIsActive(obj)) || - (!data->active && !virNetworkObjIsActive(obj))) { - if (data->names && - VIR_STRDUP(data->names[data->nnames], obj->def->name) < 0) { + if ((data->wantActive && virNetworkObjIsActive(obj)) || + (!data->wantActive && !virNetworkObjIsActive(obj))) { + if (names && VIR_STRDUP(names[data->nElems], obj->def->name) < 0) { data->error =3D true; goto cleanup; } - data->nnames++; + data->nElems++; } =20 cleanup: @@ -1497,26 +1389,11 @@ virNetworkObjListGetNames(virNetworkObjListPtr nets, virNetworkObjListFilter filter, virConnectPtr conn) { - int ret =3D -1; - - struct virNetworkObjListGetHelperData data =3D { - .conn =3D conn, .filter =3D filter, .names =3D names, .nnames =3D = 0, - .maxnames =3D maxnames, .active =3D active, .error =3D false}; - - virObjectLock(nets); - virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); - virObjectUnlock(nets); - - if (data.error) - goto cleanup; + virObjectLookupHashForEachData data =3D { + .conn =3D conn, .filter =3D filter, .wantActive =3D active, .error= =3D false, + .nElems =3D 0, .elems =3D (void **)names, .maxElems =3D maxnames }; =20 - ret =3D data.nnames; - cleanup: - if (ret < 0) { - while (data.nnames) - VIR_FREE(data.names[--data.nnames]); - } - return ret; + return virObjectLookupHashForEach(nets, virNetworkObjListGetHelper, &d= ata); } =20 =20 @@ -1526,15 +1403,11 @@ virNetworkObjListNumOfNetworks(virNetworkObjListPtr= nets, virNetworkObjListFilter filter, virConnectPtr conn) { - struct virNetworkObjListGetHelperData data =3D { - .conn =3D conn, .filter =3D filter, .names =3D NULL, .nnames =3D 0, - .maxnames =3D -1, .active =3D active, .error =3D false}; - - virObjectLock(nets); - virHashForEach(nets->objs, virNetworkObjListGetHelper, &data); - virObjectUnlock(nets); + virObjectLookupHashForEachData data =3D { + .conn =3D conn, .filter =3D filter, .wantActive =3D active, .error= =3D false, + .nElems =3D 0, .elems =3D NULL, .maxElems =3D -2 }; =20 - return data.nnames; + return virObjectLookupHashForEach(nets, virNetworkObjListGetHelper, &d= ata); } =20 =20 @@ -1572,7 +1445,5 @@ virNetworkObjListPrune(virNetworkObjListPtr nets, { struct virNetworkObjListPruneHelperData data =3D {flags}; =20 - virObjectLock(nets); - virHashRemoveSet(nets->objs, virNetworkObjListPruneHelper, &data); - virObjectUnlock(nets); + virObjectLookupHashPrune(nets, virNetworkObjListPruneHelper, &data); } diff --git a/src/conf/virnetworkobj.h b/src/conf/virnetworkobj.h index 627277b..050a184 100644 --- a/src/conf/virnetworkobj.h +++ b/src/conf/virnetworkobj.h @@ -28,7 +28,8 @@ typedef struct _virNetworkObj virNetworkObj; typedef virNetworkObj *virNetworkObjPtr; =20 virNetworkObjPtr -virNetworkObjNew(void); +virNetworkObjNew(const char *uuidstr, + const char *name); =20 virNetworkDefPtr virNetworkObjGetDef(virNetworkObjPtr obj); diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c index 4251a22..1a27aab 100644 --- a/tests/networkxml2conftest.c +++ b/tests/networkxml2conftest.c @@ -28,11 +28,13 @@ testCompareXMLToConfFiles(const char *inxml, const char= *outconf, dnsmasqCapsPtr virCommandPtr cmd =3D NULL; char *pidfile =3D NULL; dnsmasqContext *dctx =3D NULL; + char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 if (!(def =3D virNetworkDefParseFile(inxml))) goto fail; =20 - if (!(obj =3D virNetworkObjNew())) + virUUIDFormat(def->uuid, uuidstr); + if (!(obj =3D virNetworkObjNew(uuidstr, def->name))) goto fail; =20 virNetworkObjSetDef(obj, def); --=20 2.9.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list