+Wed Oct 10 13:13:53 EST 2007 Daniel P. Berrange <berrange@redhat.com>
+
+ * src/xm_internal.c: Fix XML -> XM config file conversion to
+ include bridge name for virtual networks
+ * src/xml.c: Fix memory leak handling XML -> SEXPR conversion
+ of virtual network bridge devices
+
Mon Oct 8 17:01:53 CEST 2007 Daniel Veillard <veillard@redhat.com>
* src/xend_internal.c: applied patch from Beth Kon to fix
return (ret);
}
-static char *xenXMParseXMLVif(xmlNodePtr node, int hvm) {
+static char *xenXMParseXMLVif(virConnectPtr conn, xmlNodePtr node, int hvm) {
xmlNodePtr cur;
xmlChar *type = NULL;
xmlChar *source = NULL;
int typ = 0;
char *buf = NULL;
int buflen = 0;
+ char *bridge = NULL;
type = xmlGetProp(node, BAD_CAST "type");
if (type != NULL) {
typ = 0;
else if (xmlStrEqual(type, BAD_CAST "ethernet"))
typ = 1;
+ else if (xmlStrEqual(type, BAD_CAST "network"))
+ typ = 2;
xmlFree(type);
}
cur = node->children;
if (typ == 0)
source = xmlGetProp(cur, BAD_CAST "bridge");
- else
+ else if (typ == 1)
source = xmlGetProp(cur, BAD_CAST "dev");
+ else
+ source = xmlGetProp(cur, BAD_CAST "network");
} else if ((mac == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "mac"))) {
mac = xmlGetProp(cur, BAD_CAST "address");
if (source) {
if (typ == 0) {
buflen += 8 + strlen((const char *)source);
- } else {
+ } else if (typ == 1) {
buflen += 5 + strlen((const char *)source);
+ } else {
+ virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
+ if (!network || !(bridge = virNetworkGetBridgeName(network))) {
+ if (network)
+ virNetworkFree(network);
+ goto cleanup;
+ }
+ virNetworkFree(network);
+ buflen += 8 + strlen(bridge);
}
}
if (hvm)
if (typ == 0) {
strcat(buf, ",bridge=");
strcat(buf, (const char*)source);
- } else {
- strcat(buf, ",mac=");
+ } else if (typ == 1) {
+ strcat(buf, ",dev=");
strcat(buf, (const char*)source);
+ } else {
+ strcat(buf, ",bridge=");
+ strcat(buf, bridge);
}
}
if (hvm) {
}
cleanup:
+ if (bridge != NULL)
+ free(bridge);
if (mac != NULL)
xmlFree(mac);
if (source != NULL)
vifs->list = NULL;
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
virConfValuePtr thisVif;
- char *vif = xenXMParseXMLVif(obj->nodesetval->nodeTab[i], hvm);
+ char *vif = xenXMParseXMLVif(conn, obj->nodesetval->nodeTab[i], hvm);
if (!vif)
goto error;
if (!(thisVif = malloc(sizeof(virConfValue)))) {
virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
char *bridge;
if (!network || !(bridge = virNetworkGetBridgeName(network))) {
+ if (network)
+ virNetworkFree(network);
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source, 0);
goto error;
}
+ virNetworkFree(network);
virBufferVSprintf(buf, "(bridge '%s')", bridge);
free(bridge);
}