diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index d7821e7def..8a17ed6261 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -39,20 +39,17 @@ VIR_ENUM_IMPL(virInterface,
VIR_INTERFACE_TYPE_LAST,
"ethernet", "bridge", "bond", "vlan" )
+static virInterfaceDefPtr
+virInterfaceDefParseXML(virConnectPtr conn,
+ xmlXPathContextPtr ctxt, int parentIfType);
+static int
+virInterfaceDefDevFormat(virConnectPtr conn, virBufferPtr buf,
+ const virInterfaceDefPtr def, int level);
+
#define virInterfaceReportError(conn, code, fmt...) \
virReportErrorHelper(conn, VIR_FROM_INTERFACE, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
-static
-void virInterfaceBareDefFree(virInterfaceBareDefPtr def) {
- if (def == NULL)
- return;
- VIR_FREE(def->name);
- VIR_FREE(def->mac_or_tag);
- VIR_FREE(def->devname);
- VIR_FREE(def);
-}
-
static
void virInterfaceIpDefFree(virInterfaceIpDefPtr def) {
if (def == NULL)
@@ -90,7 +87,7 @@ void virInterfaceDefFree(virInterfaceDefPtr def)
case VIR_INTERFACE_TYPE_BRIDGE:
for (i = 0;i < def->data.bridge.nbItf;i++) {
if (def->data.bridge.itf[i] != NULL)
- virInterfaceBareDefFree(def->data.bridge.itf[i]);
+ virInterfaceDefFree(def->data.bridge.itf[i]);
else
break; /* to cope with half parsed data on errors */
}
@@ -100,7 +97,7 @@ void virInterfaceDefFree(virInterfaceDefPtr def)
VIR_FREE(def->data.bond.target);
for (i = 0;i < def->data.bond.nbItf;i++) {
if (def->data.bond.itf[i] != NULL)
- virInterfaceBareDefFree(def->data.bond.itf[i]);
+ virInterfaceDefFree(def->data.bond.itf[i]);
else
break; /* to cope with half parsed data on errors */
}
@@ -121,11 +118,9 @@ void virInterfaceDefFree(virInterfaceDefPtr def)
}
static int
-virInterfaceDefParseBasicAttrs(virConnectPtr conn, virInterfaceDefPtr def,
- xmlXPathContextPtr ctxt) {
+virInterfaceDefParseName(virConnectPtr conn, virInterfaceDefPtr def,
+ xmlXPathContextPtr ctxt) {
char *tmp;
- unsigned long mtu;
- int ret;
tmp = virXPathString(conn, "string(./@name)", ctxt);
if (tmp == NULL) {
@@ -134,6 +129,14 @@ virInterfaceDefParseBasicAttrs(virConnectPtr conn, virInterfaceDefPtr def,
return(-1);
}
def->name = tmp;
+ return(0);
+}
+
+static int
+virInterfaceDefParseMtu(virConnectPtr conn, virInterfaceDefPtr def,
+ xmlXPathContextPtr ctxt) {
+ unsigned long mtu;
+ int ret;
ret = virXPathULong(conn, "string(./mtu/@size)", ctxt, &mtu);
if ((ret == -2) || ((ret == 0) && (mtu > 100000))) {
@@ -478,80 +481,12 @@ error:
}
-static virInterfaceBareDefPtr
-virInterfaceDefParseBareInterface(virConnectPtr conn, xmlXPathContextPtr ctxt,
- int ethernet_only) {
- int t;
- char *name = NULL;
- char *type = NULL;
- char *mac_or_tag = NULL;
- char *devname = NULL;
- virInterfaceBareDefPtr ret = NULL;
-
- type = virXPathString(conn, "string(./@type)", ctxt);
- if (type == NULL) {
- virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
- "%s", _("interface has no type"));
- goto error;
- }
- if (STREQ(type, "ethernet")) {
- t = VIR_INTERFACE_TYPE_ETHERNET;
- name = virXPathString(conn, "string(./@name)", ctxt);
- mac_or_tag = virXPathString(conn, "string(./mac/@address)", ctxt);
- } else if ((STREQ(type, "vlan")) && (ethernet_only == 0)) {
- t = VIR_INTERFACE_TYPE_VLAN;
- name = virXPathString(conn, "string(./@name)", ctxt);
- mac_or_tag = virXPathString(conn, "string(./vlan/@tag)", ctxt);
- devname = virXPathString(conn, "string(./vlan/interface/@name)", ctxt);
- } else {
- virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
- _("interface has unsupported type '%s'"), type);
- VIR_FREE(type);
- goto error;
- }
- VIR_FREE(type);
- if (name == NULL) {
- virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
- "%s", _("interface has no name"));
- goto error;
- }
- if (t == VIR_INTERFACE_TYPE_VLAN) {
- if (mac_or_tag == NULL) {
- virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
- _("vlan %s has no tag"), name);
- goto error;
- }
- if (devname == NULL) {
- virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
- _("vlan %s has interface name"), name);
- goto error;
- }
- }
- if (VIR_ALLOC(ret) < 0) {
- virReportOOMError(conn);
- goto error;
- }
- ret->type = t;
- ret->name = name;
- ret->mac_or_tag = mac_or_tag;
- ret->devname = devname;
- return(ret);
-
-error:
- VIR_FREE(name);
- VIR_FREE(type);
- VIR_FREE(name);
- VIR_FREE(name);
- VIR_FREE(ret);
- return(NULL);
-}
-
static int
virInterfaceDefParseBridge(virConnectPtr conn, virInterfaceDefPtr def,
xmlXPathContextPtr ctxt) {
xmlNodePtr *interfaces = NULL;
xmlNodePtr bridge;
- virInterfaceBareDefPtr itf;
+ virInterfaceDefPtr itf;
int nbItf, i;
int ret = 0;
@@ -573,7 +508,7 @@ virInterfaceDefParseBridge(virConnectPtr conn, virInterfaceDefPtr def,
for (i = 0; i < nbItf;i++) {
ctxt->node = interfaces[i];
- itf = virInterfaceDefParseBareInterface(conn, ctxt, 0);
+ itf = virInterfaceDefParseXML(conn, ctxt, VIR_INTERFACE_TYPE_BRIDGE);
if (itf == NULL) {
ret = -1;
def->data.bridge.nbItf = i;
@@ -594,7 +529,7 @@ virInterfaceDefParseBondItfs(virConnectPtr conn, virInterfaceDefPtr def,
xmlXPathContextPtr ctxt) {
xmlNodePtr *interfaces = NULL;
xmlNodePtr bond = ctxt->node;
- virInterfaceBareDefPtr itf;
+ virInterfaceDefPtr itf;
int nbItf, i;
int ret = 0;
@@ -614,7 +549,7 @@ virInterfaceDefParseBondItfs(virConnectPtr conn, virInterfaceDefPtr def,
for (i = 0; i < nbItf;i++) {
ctxt->node = interfaces[i];
- itf = virInterfaceDefParseBareInterface(conn, ctxt, 1);
+ itf = virInterfaceDefParseXML(conn, ctxt, VIR_INTERFACE_TYPE_BOND);
if (itf == NULL) {
ret = -1;
def->data.bond.nbItf = i;
@@ -732,7 +667,8 @@ virInterfaceDefParseVlan(virConnectPtr conn, virInterfaceDefPtr def,
}
static virInterfaceDefPtr
-virInterfaceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt) {
+virInterfaceDefParseXML(virConnectPtr conn,
+ xmlXPathContextPtr ctxt, int parentIfType) {
virInterfaceDefPtr def;
int type;
char *tmp;
@@ -758,25 +694,47 @@ virInterfaceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt) {
virReportOOMError(conn);
return NULL;
}
+
+ if (((parentIfType == VIR_INTERFACE_TYPE_BOND)
+ && (type != VIR_INTERFACE_TYPE_ETHERNET))
+ || ((parentIfType == VIR_INTERFACE_TYPE_BRIDGE)
+ && (type != VIR_INTERFACE_TYPE_ETHERNET)
+ && (type != VIR_INTERFACE_TYPE_BOND)
+ && (type != VIR_INTERFACE_TYPE_VLAN))
+ || (parentIfType == VIR_INTERFACE_TYPE_ETHERNET)
+ || (parentIfType == VIR_INTERFACE_TYPE_VLAN))
+ {
+ virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
+ _("interface has unsupported type '%s'"),
+ virInterfaceTypeToString(type));
+ goto error;
+ }
def->type = type;
switch (type) {
case VIR_INTERFACE_TYPE_ETHERNET:
- if (virInterfaceDefParseBasicAttrs(conn, def, ctxt) < 0)
+ if (virInterfaceDefParseName(conn, def, ctxt) < 0)
goto error;
tmp = virXPathString(conn, "string(./mac/@address)", ctxt);
if (tmp != NULL)
def->mac = tmp;
- if (virInterfaceDefParseStartMode(conn, def, ctxt) < 0)
- goto error;
- if (virInterfaceDefParseIfAdressing(conn, def, ctxt) < 0)
- goto error;
+ if (parentIfType == VIR_INTERFACE_TYPE_LAST) {
+ /* only recognize these in toplevel bond interfaces */
+ if (virInterfaceDefParseStartMode(conn, def, ctxt) < 0)
+ goto error;
+ if (virInterfaceDefParseMtu(conn, def, ctxt) < 0)
+ goto error;
+ if (virInterfaceDefParseIfAdressing(conn, def, ctxt) < 0)
+ goto error;
+ }
break;
case VIR_INTERFACE_TYPE_BRIDGE: {
xmlNodePtr bridge;
+ if (virInterfaceDefParseName(conn, def, ctxt) < 0)
+ goto error;
if (virInterfaceDefParseStartMode(conn, def, ctxt) < 0)
goto error;
- if (virInterfaceDefParseBasicAttrs(conn, def, ctxt) < 0)
+ if (virInterfaceDefParseMtu(conn, def, ctxt) < 0)
goto error;
if (virInterfaceDefParseIfAdressing(conn, def, ctxt) < 0)
goto error;
@@ -811,12 +769,18 @@ virInterfaceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt) {
case VIR_INTERFACE_TYPE_BOND: {
xmlNodePtr bond;
- if (virInterfaceDefParseBasicAttrs(conn, def, ctxt) < 0)
- goto error;
- if (virInterfaceDefParseStartMode(conn, def, ctxt) < 0)
- goto error;
- if (virInterfaceDefParseIfAdressing(conn, def, ctxt) < 0)
+ if (virInterfaceDefParseName(conn, def, ctxt) < 0)
goto error;
+ if (parentIfType == VIR_INTERFACE_TYPE_LAST) {
+ /* only recognize these in toplevel bond interfaces */
+ if (virInterfaceDefParseStartMode(conn, def, ctxt) < 0)
+ goto error;
+ if (virInterfaceDefParseMtu(conn, def, ctxt) < 0)
+ goto error;
+ if (virInterfaceDefParseIfAdressing(conn, def, ctxt) < 0)
+ goto error;
+ }
+
bond = virXPathNode(conn, "./bond[1]", ctxt);
if (bond == NULL) {
virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
@@ -881,7 +845,7 @@ virInterfaceDefPtr virInterfaceDefParseNode(virConnectPtr conn,
}
ctxt->node = root;
- def = virInterfaceDefParseXML(conn, ctxt);
+ def = virInterfaceDefParseXML(conn, ctxt, VIR_INTERFACE_TYPE_LAST);
cleanup:
xmlXPathFreeContext(ctxt);
@@ -989,59 +953,13 @@ cleanup:
return def;
}
-static int
-virInterfaceBareDevDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
- virBufferPtr buf,
- const virInterfaceBareDefPtr def) {
- if (def->type == VIR_INTERFACE_TYPE_ETHERNET) {
- if (def->name == NULL) {
- virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("bare ethernet has no name"));
- return(-1);
- }
- virBufferVSprintf(buf, " name);
- if (def->mac_or_tag != NULL) {
- virBufferVSprintf(buf, ">\n \n",
- def->mac_or_tag);
- virBufferAddLit(buf, " \n");
- } else {
- virBufferAddLit(buf, "/>\n");
- }
- } else if (def->type == VIR_INTERFACE_TYPE_VLAN) {
- virBufferAddLit(buf, " name != NULL)
- virBufferVSprintf(buf, " name='%s'", def->name);
- if (def->mac_or_tag != NULL) {
- virBufferAddLit(buf, ">\n");
- virBufferVSprintf(buf, " mac_or_tag);
- if (def->devname != NULL) {
- virBufferAddLit(buf, ">\n");
- virBufferVSprintf(buf, " \n",
- def->devname);
- virBufferAddLit(buf, " \n");
- } else
- virBufferAddLit(buf, "/>\n");
- virBufferAddLit(buf, " \n");
- } else {
- virBufferAddLit(buf, "/>\n");
- }
- } else {
- virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("bare interface type %d unknown"),
- def->type);
- return(-1);
- }
- return(0);
-}
-
static int
virInterfaceBridgeDefFormat(virConnectPtr conn, virBufferPtr buf,
- const virInterfaceDefPtr def) {
+ const virInterfaceDefPtr def, int level) {
int i;
int ret = 0;
- virBufferAddLit(buf, " data.bridge.stp == 1)
virBufferAddLit(buf, " stp='on'");
else if (def->data.bridge.stp == 0)
@@ -1051,22 +969,22 @@ virInterfaceBridgeDefFormat(virConnectPtr conn, virBufferPtr buf,
virBufferAddLit(buf, ">\n");
for (i = 0;i < def->data.bridge.nbItf;i++) {
- if (virInterfaceBareDevDefFormat(conn, buf, def->data.bridge.itf[i])
- < 0)
+ if (virInterfaceDefDevFormat(conn, buf,
+ def->data.bridge.itf[i], level+2) < 0)
ret = -1;
}
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
return(ret);
}
static int
virInterfaceBondDefFormat(virConnectPtr conn, virBufferPtr buf,
- const virInterfaceDefPtr def) {
+ const virInterfaceDefPtr def, int level) {
int i;
int ret = 0;
- virBufferAddLit(buf, " data.bond.mode == VIR_INTERFACE_BOND_BALRR)
virBufferAddLit(buf, " mode='balance-rr'");
else if (def->data.bond.mode == VIR_INTERFACE_BOND_ABACKUP)
@@ -1084,8 +1002,8 @@ virInterfaceBondDefFormat(virConnectPtr conn, virBufferPtr buf,
virBufferAddLit(buf, ">\n");
if (def->data.bond.monit == VIR_INTERFACE_BOND_MONIT_MII) {
- virBufferVSprintf(buf, " data.bond.frequency);
+ virBufferVSprintf(buf, "%*s data.bond.frequency);
if (def->data.bond.downdelay > 0)
virBufferVSprintf(buf, " downdelay='%d'", def->data.bond.downdelay);
if (def->data.bond.updelay > 0)
@@ -1101,7 +1019,8 @@ virInterfaceBondDefFormat(virConnectPtr conn, virBufferPtr buf,
"%s", _("bond arp monitoring has no target"));
return(-1);
}
- virBufferVSprintf(buf, " data.bond.interval, def->data.bond.target);
if (def->data.bond.validate == VIR_INTERFACE_BOND_ARP_ACTIVE)
virBufferAddLit(buf, " validate='active'");
@@ -1112,29 +1031,30 @@ virInterfaceBondDefFormat(virConnectPtr conn, virBufferPtr buf,
virBufferAddLit(buf, "/>\n");
}
for (i = 0;i < def->data.bond.nbItf;i++) {
- if (virInterfaceBareDevDefFormat(conn, buf, def->data.bond.itf[i]) < 0)
+ if (virInterfaceDefDevFormat(conn, buf, def->data.bond.itf[i], level+2) < 0)
ret = -1;
}
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
return(ret);
}
static int
virInterfaceVlanDefFormat(virConnectPtr conn, virBufferPtr buf,
- const virInterfaceDefPtr def) {
+ const virInterfaceDefPtr def, int level) {
if (def->data.vlan.tag == NULL) {
virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("vlan misses the tag name"));
return(-1);
}
- virBufferVSprintf(buf, " data.vlan.tag);
+ virBufferVSprintf(buf, "%*s data.vlan.tag);
if (def->data.vlan.devname != NULL) {
virBufferAddLit(buf, ">\n");
- virBufferVSprintf(buf, " \n",
- def->data.vlan.devname);
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->data.vlan.devname);
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
} else
virBufferAddLit(buf, "/>\n");
return(0);
@@ -1142,30 +1062,34 @@ virInterfaceVlanDefFormat(virConnectPtr conn, virBufferPtr buf,
static int
virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
- virBufferPtr buf, const virInterfaceDefPtr def) {
+ virBufferPtr buf, const virInterfaceDefPtr def,
+ int level) {
int pp, ii;
for (pp = 0; pp < def->nprotos; pp++) {
- virBufferVSprintf(buf, " \n", def->protos[pp]->family);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->protos[pp]->family);
if (def->protos[pp]->autoconf) {
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
}
if (def->protos[pp]->dhcp) {
if (def->protos[pp]->peerdns == 0)
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "");
else if (def->protos[pp]->peerdns == 1)
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "");
else
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
}
for (ii = 0; ii < def->protos[pp]->nips; ii++) {
if (def->protos[pp]->ips[ii]->address != NULL) {
- virBufferVSprintf(buf, " protos[pp]->ips[ii]->address);
if (def->protos[pp]->ips[ii]->prefix != 0) {
virBufferVSprintf(buf, " prefix='%d'",
@@ -1175,18 +1099,19 @@ virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
}
}
if (def->protos[pp]->gateway != NULL) {
- virBufferVSprintf(buf, " \n",
- def->protos[pp]->gateway);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->protos[pp]->gateway);
}
- virBufferAddLit(buf, " \n");
+ virBufferVSprintf(buf, "%*s \n", level*2, "");
}
return(0);
}
static int
virInterfaceStartmodeDefFormat(virConnectPtr conn, virBufferPtr buf,
- enum virInterfaceStartMode startmode) {
+ enum virInterfaceStartMode startmode,
+ int level) {
const char *mode;
switch (startmode) {
case VIR_INTERFACE_START_UNSPECIFIED:
@@ -1205,20 +1130,24 @@ virInterfaceStartmodeDefFormat(virConnectPtr conn, virBufferPtr buf,
"%s", _("virInterfaceDefFormat unknown startmode"));
return -1;
}
- virBufferVSprintf(buf, " \n", mode);
+ virBufferVSprintf(buf, "%*s \n", level*2, "", mode);
return(0);
}
-char *virInterfaceDefFormat(virConnectPtr conn,
- const virInterfaceDefPtr def)
-{
- virBuffer buf = VIR_BUFFER_INITIALIZER;
+static int
+virInterfaceDefDevFormat(virConnectPtr conn, virBufferPtr buf,
+ const virInterfaceDefPtr def, int level) {
const char *type = NULL;
- if ((def == NULL) ||
- ((def->name == NULL) && (def->type != VIR_INTERFACE_TYPE_VLAN))) {
+ if (def == NULL) {
virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("virInterfaceDefFormat argument problems"));
+ "%s", _("virInterfaceDefFormat NULL def"));
+ goto cleanup;
+ }
+
+ if ((def->name == NULL) && (def->type != VIR_INTERFACE_TYPE_VLAN)) {
+ virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("virInterfaceDefFormat missing interface name"));
goto cleanup;
}
@@ -1228,56 +1157,72 @@ char *virInterfaceDefFormat(virConnectPtr conn,
goto cleanup;
}
- virBufferVSprintf(&buf, "name != NULL)
- virBufferEscapeString(&buf, "name='%s'", def->name);
- virBufferAddLit(&buf, ">\n");
+ virBufferEscapeString(buf, "name='%s'", def->name);
+ virBufferAddLit(buf, ">\n");
switch (def->type) {
case VIR_INTERFACE_TYPE_ETHERNET:
- virInterfaceStartmodeDefFormat(conn, &buf, def->startmode);
+ virInterfaceStartmodeDefFormat(conn, buf, def->startmode, level);
if (def->mac != NULL)
- virBufferVSprintf(&buf, " \n", def->mac);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mac);
if (def->mtu != 0)
- virBufferVSprintf(&buf, " \n", def->mtu);
- virInterfaceProtocolDefFormat(conn, &buf, def);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mtu);
+ virInterfaceProtocolDefFormat(conn, buf, def, level);
break;
case VIR_INTERFACE_TYPE_BRIDGE:
- virInterfaceStartmodeDefFormat(conn, &buf, def->startmode);
+ virInterfaceStartmodeDefFormat(conn, buf, def->startmode, level);
if (def->mtu != 0)
- virBufferVSprintf(&buf, " \n", def->mtu);
- virInterfaceProtocolDefFormat(conn, &buf, def);
- virInterfaceBridgeDefFormat(conn, &buf, def);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mtu);
+ virInterfaceProtocolDefFormat(conn, buf, def, level);
+ virInterfaceBridgeDefFormat(conn, buf, def, level);
break;
case VIR_INTERFACE_TYPE_BOND:
- virInterfaceStartmodeDefFormat(conn, &buf, def->startmode);
+ virInterfaceStartmodeDefFormat(conn, buf, def->startmode, level);
if (def->mtu != 0)
- virBufferVSprintf(&buf, " \n", def->mtu);
- virInterfaceProtocolDefFormat(conn, &buf, def);
- virInterfaceBondDefFormat(conn, &buf, def);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mtu);
+ virInterfaceProtocolDefFormat(conn, buf, def, level);
+ virInterfaceBondDefFormat(conn, buf, def, level);
break;
case VIR_INTERFACE_TYPE_VLAN:
- virInterfaceStartmodeDefFormat(conn, &buf, def->startmode);
+ virInterfaceStartmodeDefFormat(conn, buf, def->startmode, level);
if (def->mac != NULL)
- virBufferVSprintf(&buf, " \n", def->mac);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mac);
if (def->mtu != 0)
- virBufferVSprintf(&buf, " \n", def->mtu);
- virInterfaceProtocolDefFormat(conn, &buf, def);
- virInterfaceVlanDefFormat(conn, &buf, def);
+ virBufferVSprintf(buf, "%*s \n",
+ level*2, "", def->mtu);
+ virInterfaceProtocolDefFormat(conn, buf, def, level);
+ virInterfaceVlanDefFormat(conn, buf, def, level);
break;
}
- virBufferAddLit(&buf, "\n");
+ virBufferVSprintf(buf, "%*s\n", level*2, "");
- if (virBufferError(&buf))
+ if (virBufferError(buf))
goto no_memory;
- return virBufferContentAndReset(&buf);
-
+ return 0;
no_memory:
virReportOOMError(conn);
cleanup:
- virBufferFreeAndReset(&buf);
- return NULL;
+ return -1;
+}
+
+char *virInterfaceDefFormat(virConnectPtr conn,
+ const virInterfaceDefPtr def)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ if (virInterfaceDefDevFormat(conn, &buf, def, 0) < 0) {
+ virBufferFreeAndReset(&buf);
+ return NULL;
+ }
+ return virBufferContentAndReset(&buf);
}
/* virInterfaceObj manipulation */
diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
index 4216087721..889ad9457e 100644
--- a/src/conf/interface_conf.h
+++ b/src/conf/interface_conf.h
@@ -84,14 +84,7 @@ enum virInterfaceBondArpValid {
VIR_INTERFACE_BOND_ARP_ALL, /* validate all */
};
-typedef struct _virInterfaceBareDef virInterfaceBareDef;
-typedef virInterfaceBareDef *virInterfaceBareDefPtr;
-struct _virInterfaceBareDef {
- int type; /* should be only ethernet or vlan */
- char *name; /* the interface name */
- char *mac_or_tag; /* MAC address for ethernet, TAG for vlan */
- char *devname; /* device name for vlan */
-};
+struct _virInterfaceDef; /* forward declaration required for bridge/bond */
typedef struct _virInterfaceBridgeDef virInterfaceBridgeDef;
typedef virInterfaceBridgeDef *virInterfaceBridgeDefPtr;
@@ -99,7 +92,7 @@ struct _virInterfaceBridgeDef {
int stp; /* 0, 1 or -1 if undefined */
char *delay;
int nbItf; /* number of defined interfaces */
- virInterfaceBareDefPtr *itf;/* interfaces */
+ struct _virInterfaceDef **itf;/* interfaces */
};
typedef struct _virInterfaceBondDef virInterfaceBondDef;
@@ -115,7 +108,7 @@ struct _virInterfaceBondDef {
char *target; /* arp monitoring target */
int validate; /* virInterfaceBondArpmValid */
int nbItf; /* number of defined interfaces */
- virInterfaceBareDefPtr *itf; /* interfaces ethernet only */
+ struct _virInterfaceDef **itf; /* interfaces ethernet only */
};
typedef struct _virInterfaceVlanDef virInterfaceVlanDef;