
[...] The second cup of caffeine finally started flowing through the veins... and of course I'm on patch 19... use static int ATTRIBUTE_UNUSED virDomainxxx()
+ +/* fill in a virNetDevIPInfoPtr from the <route> and <ip> + * elements found in the given XML context. + * + * return 0 on success (including none found) and -1 on failure. + */ +int +virDomainNetIPInfoParseXML(const char *source, + xmlXPathContextPtr ctxt, + virNetDevIPInfoPtr def);
Why? If it needs to be "higher" to avoid the forward reference for future callers, then so be it.
+int
static int
+virDomainNetIPInfoParseXML(const char *source, + xmlXPathContextPtr ctxt, + virNetDevIPInfoPtr def) + +{ + xmlNodePtr *nodes = NULL; + virNetDevIPAddrPtr ip = NULL; + virNetDevIPRoutePtr route = NULL; + int nnodes; + int ret = -1; + size_t i; + + if ((nnodes = virXPathNodeSet("./ip", ctxt, &nodes)) < 0) + goto cleanup; + + for (i = 0; i < nnodes; i++) { + if (!(ip = virDomainNetIPParseXML(nodes[i])) || + VIR_APPEND_ELEMENT(def->ips, def->nips, ip) < 0) + goto cleanup; + } + VIR_FREE(nodes); + + if ((nnodes = virXPathNodeSet("./route", ctxt, &nodes)) < 0) + goto cleanup; + + for (i = 0; i < nnodes; i++) { + if (!(route = virNetDevIPRouteParseXML(source, nodes[i], ctxt)) || + VIR_APPEND_ELEMENT(def->routes, def->nroutes, route) < 0) + goto cleanup; + } + + ret = 0; + cleanup: + if (ret < 0) + virNetDevIPInfoClear(def); + VIR_FREE(ip);
Seeing just VIR_FREE(ip) made me go look at how it was allocated - guess I was (now) concerned that something would be allocated into ip that wasn't free'd properly (eg. no virNetDevIPFree() API ...
Anyway, the ip->address is written with the result of a getaddrinfo in virSocketAddrParseInternal, which when free'd should be done by freeaddrinfo, right?
I think this is existing, but fixable... at some point in time.
+ virNetDevIPRouteFree(route); + VIR_FREE(nodes); + return ret; +} + static int virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED, xmlXPathContextPtr ctxt, @@ -20311,6 +20363,22 @@ virDomainNetRoutesFormat(virBufferPtr buf, return 0; }
+ +int +virDomainNetIPInfoFormat(virBufferPtr buf, + virNetDevIPInfoPtr def);
Same complaint.
+int
static int
ACK with the forward ref and static int used. I think you need a "new" patch at some point in time to handle the getaddrinfo/freeaddrinfo...
John
+virDomainNetIPInfoFormat(virBufferPtr buf, + virNetDevIPInfoPtr def) +{ + if (virDomainNetIPsFormat(buf, def->ips, def->nips) < 0) + return -1; + if (virDomainNetRoutesFormat(buf, def->routes, def->nroutes) < 0) + return -1; + return 0; +} + + static int virDomainHostdevDefFormatSubsys(virBufferPtr buf, virDomainHostdevDefPtr def, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 151cf9f..f6c3d45 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1925,6 +1925,7 @@ virNetDevBridgeSetVlanFiltering; virNetDevIPAddrAdd; virNetDevIPAddrDel; virNetDevIPAddrGet; +virNetDevIPInfoClear; virNetDevIPRouteAdd; virNetDevIPRouteFree; virNetDevIPRouteGetAddress; diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c index 619f926..376d4ad 100644 --- a/src/util/virnetdevip.c +++ b/src/util/virnetdevip.c @@ -845,3 +845,19 @@ virNetDevIPRouteGetGateway(virNetDevIPRoutePtr def) return &def->gateway; return NULL; } + +/* manipulating the virNetDevIPInfo object */ + +void +virNetDevIPInfoClear(virNetDevIPInfoPtr ip) +{ + size_t i; + + for (i = 0; i < ip->nips; i++) + VIR_FREE(ip->ips[i]); + VIR_FREE(ip->ips); + + for (i = 0; i < ip->nroutes; i++) + virNetDevIPRouteFree(ip->routes[i]); + VIR_FREE(ip->routes); +} diff --git a/src/util/virnetdevip.h b/src/util/virnetdevip.h index 7a07b73..be41636 100644 --- a/src/util/virnetdevip.h +++ b/src/util/virnetdevip.h @@ -47,6 +47,14 @@ typedef struct { virSocketAddr gateway; /* gateway IP address for ip-route */ } virNetDevIPRoute, *virNetDevIPRoutePtr;
+/* A full set of all IP config info for a network device */ +typedef struct { + size_t nips; + virNetDevIPAddrPtr *ips; + size_t nroutes; + virNetDevIPRoutePtr *routes; +} virNetDevIPInfo, *virNetDevIPInfoPtr; + /* manipulating/querying the netdev */ int virNetDevIPAddrAdd(const char *ifname, virSocketAddr *addr, @@ -76,4 +84,7 @@ int virNetDevIPRouteGetPrefix(virNetDevIPRoutePtr def); unsigned int virNetDevIPRouteGetMetric(virNetDevIPRoutePtr def); virSocketAddrPtr virNetDevIPRouteGetGateway(virNetDevIPRoutePtr def);
+/* virNetDevIPInfo object */ +void virNetDevIPInfoClear(virNetDevIPInfoPtr ip); + #endif /* __VIR_NETDEVIP_H__ */
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list