void virInterfaceDefFree(virInterfaceDefPtr def) { size_t i; int pp; if (def == NULL) return; VIR_FREE(def->name); VIR_FREE(def->mac); switch (def->type) { case VIR_INTERFACE_TYPE_BRIDGE: VIR_FREE(def->data.bridge.delay); for (i = 0; i < def->data.bridge.nbItf; i++) { if (def->data.bridge.itf[i] == NULL) break; /* to cope with half parsed data on errors */ virInterfaceDefFree(def->data.bridge.itf[i]); } VIR_FREE(def->data.bridge.itf); break; case VIR_INTERFACE_TYPE_BOND: VIR_FREE(def->data.bond.target); for (i = 0; i < def->data.bond.nbItf; i++) { if (def->data.bond.itf[i] == NULL) break; /* to cope with half parsed data on errors */ virInterfaceDefFree(def->data.bond.itf[i]); } VIR_FREE(def->data.bond.itf); break; case VIR_INTERFACE_TYPE_VLAN: VIR_FREE(def->data.vlan.tag); VIR_FREE(def->data.vlan.devname); break; } /* free all protos */ for (pp = 0; pp < def->nprotos; pp++) { virInterfaceProtocolDefFree(def->protos[pp]); } VIR_FREE(def->protos); VIR_FREE(def); }
static int virInterfaceDefParseIfAdressing(virInterfaceDefPtr def, xmlXPathContextPtr ctxt) { xmlNodePtr save; xmlNodePtr *protoNodes = NULL; int nProtoNodes, pp, ret = -1; char *tmp; save = ctxt->node; nProtoNodes = virXPathNodeSet("./protocol", ctxt, &protoNodes); if (nProtoNodes < 0) goto error; if (nProtoNodes == 0) { /* no protocols is an acceptable outcome */ return 0; } if (VIR_ALLOC_N(def->protos, nProtoNodes) < 0) { virReportOOMError(); goto error; } def->nprotos = 0; for (pp = 0; pp < nProtoNodes; pp++) { virInterfaceProtocolDefPtr proto; if (VIR_ALLOC(proto) < 0) { virReportOOMError(); goto error; } ctxt->node = protoNodes[pp]; tmp = virXPathString("string(./@family)", ctxt); if (tmp == NULL) { virInterfaceReportError(VIR_ERR_XML_ERROR, "%s", _("protocol misses the family attribute")); virInterfaceProtocolDefFree(proto); goto error; } proto->family = tmp; if (STREQ(tmp, "ipv4")) { ret = virInterfaceDefParseProtoIPv4(proto, ctxt); if (ret != 0) { virInterfaceProtocolDefFree(proto); goto error; } } else if (STREQ(tmp, "ipv6")) { ret = virInterfaceDefParseProtoIPv6(proto, ctxt); if (ret != 0) { virInterfaceProtocolDefFree(proto); goto error; } } else { virInterfaceReportError(VIR_ERR_XML_ERROR, _("unsupported protocol family '%s'"), tmp); virInterfaceProtocolDefFree(proto); goto error; } def->protos[def->nprotos++] = proto; } ret = 0; error: VIR_FREE(protoNodes); ctxt->node = save; return ret; }