[...]
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(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list