[libvirt] [PATCH 3/3] Support for IPv6 / multiple addresses per interface in virInterface

Daniel P. Berrange berrange at redhat.com
Fri Oct 23 16:27:20 UTC 2009


On Fri, Oct 16, 2009 at 10:56:19AM -0400, laine at laine.org wrote:
>  static int
> -virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceDefPtr def,
> +virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceProtocolDefPtr def,
>                                xmlXPathContextPtr ctxt) {
> -    xmlNodePtr dhcp, ip;
> -    int ret = 0;
> +    xmlNodePtr dhcp;
> +    xmlNodePtr *ipNodes = NULL;
> +    int nIpNodes, ii, ret = 0;
> +    char *tmp;
> +
> +    tmp = virXPathString(conn, "string(./route[1]/@gateway)", ctxt);
> +    def->gateway = tmp;
>  
>      dhcp = virXPathNode(conn, "./dhcp", ctxt);
>      if (dhcp != NULL)
>          ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt);
> +    if (ret != 0)
> +        return(ret);
> +
> +    nIpNodes = virXPathNodeSet(conn, "./ip", ctxt, &ipNodes);
> +    if (ipNodes == NULL)
> +        return 0;
> +
> +    if (VIR_ALLOC_N(def->ips, nIpNodes) < 0) {
> +        virReportOOMError(conn);
> +        ret = -1;
> +        goto error;
> +    }
> +
> +    def->nips = 0;
> +    for (ii = 0; ii < nIpNodes; ii++) {
>  
> +        virInterfaceIpDefPtr ip;
> +
> +        if (VIR_ALLOC(ip) < 0) {
> +            virReportOOMError(conn);
> +            break;
> +        }
> +
> +        ctxt->node = ipNodes[ii];
> +        ret = virInterfaceDefParseIp(conn, ip, ctxt);
> +        if (ret != 0) {
> +            virInterfaceIpDefFree(ip);
> +            break;
> +        }
> +        def->ips[def->nips++] = ip;
> +    }
> +
> +error:
> +    VIR_FREE(ipNodes);
> +    return(ret);
> +}

I don't think the error reporting is quite right here. At the time of
declaration you  initialize 'ret = 0', so those two error cases inside
the for loop which break out will end up returning 0. I think it is
better to initialize 'ret = -1', change the 'break' to 'goto error',
and after the for loop put 'ret = 0' to mark success. 

> +
> +static int
> +virInterfaceDefParseProtoIPv6(virConnectPtr conn, virInterfaceProtocolDefPtr def,
> +                              xmlXPathContextPtr ctxt) {
> +    xmlNodePtr dhcp, autoconf;
> +    xmlNodePtr *ipNodes = NULL;
> +    int nIpNodes, ii, ret = 0;
> +    char *tmp;
> +
> +    tmp = virXPathString(conn, "string(./route[1]/@gateway)", ctxt);
> +    def->gateway = tmp;
> +
> +    autoconf = virXPathNode(conn, "./autoconf", ctxt);
> +    if (autoconf != NULL)
> +        def->autoconf = 1;
> +
> +    dhcp = virXPathNode(conn, "./dhcp", ctxt);
> +    if (dhcp != NULL)
> +        ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt);
>      if (ret != 0)
>          return(ret);
>  
> -    ip = virXPathNode(conn, "./ip", ctxt);
> -    if (ip != NULL)
> -        ret = virInterfaceDefParseIp(conn, def, ip, ctxt);
> +    nIpNodes = virXPathNodeSet(conn, "./ip", ctxt, &ipNodes);
> +    if (ipNodes == NULL)
> +        return 0;
> +
> +    if (VIR_ALLOC_N(def->ips, nIpNodes) < 0) {
> +        virReportOOMError(conn);
> +        ret = -1;
> +        goto error;
> +    }
> +
> +    def->nips = 0;
> +    for (ii = 0; ii < nIpNodes; ii++) {
> +
> +        virInterfaceIpDefPtr ip;
> +
> +        if (VIR_ALLOC(ip) < 0) {
> +            virReportOOMError(conn);
> +            break;
> +        }
> +
> +        ctxt->node = ipNodes[ii];
> +        ret = virInterfaceDefParseIp(conn, ip, ctxt);
> +        if (ret != 0) {
> +            virInterfaceIpDefFree(ip);
> +            break;
> +        }
> +        def->ips[def->nips++] = ip;
> +    }
> +
> +error:
> +    VIR_FREE(ipNodes);
>      return(ret);
>  }

Same here - that looks like it'll return 0 for several error
cases.


Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list