static int udevGenerateDeviceName(struct udev_device *device, virNodeDeviceDefPtr def, const char *s) { int ret = 0, i = 0; virBuffer buf = VIR_BUFFER_INITIALIZER; virBufferVSprintf(&buf, "%s_%s", udev_device_get_subsystem(device), udev_device_get_sysname(device)); if (s != NULL) { virBufferVSprintf(&buf, "_%s", s); } if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); VIR_ERROR(_("Buffer error when generating device name for device " "with sysname '%s'"), udev_device_get_sysname(device)); ret = -1; } def->name = virBufferContentAndReset(&buf); for (i = 0; i < strlen(def->name) ; i++) { if (!(c_isalnum(*(def->name + i)))) { *(def->name + i) = '_'; } } return ret; }
/* converts bitmap to string of the form '1,2...' */ char * mapDomainPinVcpu(unsigned char *cpumap, int maplen) { virBuffer buf = VIR_BUFFER_INITIALIZER; size_t len; char *ret = NULL; int i, j; for (i = 0; i < maplen; i++) { for (j = 0; j < 8; j++) { if (cpumap[i] & (1 << j)) { virBufferVSprintf(&buf, "%d,", (8*i)+j); } } } if (virBufferError(&buf)) { virReportOOMError(); virBufferFreeAndReset(&buf); return NULL; } ret = virBufferContentAndReset(&buf); len = strlen(ret); if (len > 0 && ret[len - 1] == ',') ret[len - 1] = 0; return ret; }
static int virInterfaceStartmodeDefFormat(virBufferPtr buf, enum virInterfaceStartMode startmode, int level) { const char *mode; switch (startmode) { case VIR_INTERFACE_START_UNSPECIFIED: return 0; case VIR_INTERFACE_START_NONE: mode = "none"; break; case VIR_INTERFACE_START_ONBOOT: mode = "onboot"; break; case VIR_INTERFACE_START_HOTPLUG: mode = "hotplug"; break; default: virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virInterfaceDefFormat unknown startmode")); return -1; } virBufferVSprintf(buf, "%*s <start mode='%s'/>\n", level*2, "", mode); return(0); }
/** * sexpr2string: * @sexpr: an S-Expression pointer * @buffer: the output buffer * * Serialize the S-Expression in the buffer. * * Returns 0 on success, -1 on error. */ int sexpr2string(const struct sexpr *sexpr, virBufferPtr buffer) { if ((sexpr == NULL) || (buffer == NULL)) return -1; switch (sexpr->kind) { case SEXPR_CONS: virBufferAddChar(buffer, '('); if (sexpr2string(sexpr->u.s.car, buffer) < 0) goto error; while (sexpr->u.s.cdr->kind != SEXPR_NIL) { sexpr = sexpr->u.s.cdr; virBufferAddChar(buffer, ' '); if (sexpr2string(sexpr->u.s.car, buffer) < 0) goto error; } virBufferAddChar(buffer, ')'); break; case SEXPR_VALUE: if (strchr(sexpr->u.value, ' ') || strchr(sexpr->u.value, ')') || strchr(sexpr->u.value, '(')) virBufferVSprintf(buffer, "'%s'", sexpr->u.value); else virBufferVSprintf(buffer, "%s", sexpr->u.value); break; case SEXPR_NIL: virBufferAddLit(buffer, "()"); break; default: goto error; } return 0; error: virSexprError(VIR_ERR_SEXPR_SERIAL, NULL); return -1; }
/** * virBufferEscapeSexpr: * @buf: the buffer to dump * @format: a printf like format string but with only one %s parameter * @str: the string argument which need to be escaped * * Do a formatted print with a single string to an sexpr buffer. The string * is escaped to avoid generating a sexpr that xen will choke on. This * doesn't fully escape the sexpr, just enough for our code to work. */ void virBufferEscapeSexpr(const virBufferPtr buf, const char *format, const char *str) { int len; char *escaped, *out; const char *cur; if ((format == NULL) || (buf == NULL) || (str == NULL)) return; if (buf->error) return; len = strlen(str); if (strcspn(str, "\\'") == len) { virBufferVSprintf(buf, format, str); return; } if (VIR_ALLOC_N(escaped, 2 * len + 1) < 0) { virBufferNoMemory(buf); return; } cur = str; out = escaped; while (*cur != 0) { switch (*cur) { case '\\': case '\'': *out++ = '\\'; /* fallthrough */ default: *out++ = *cur; } cur++; } *out = 0; virBufferVSprintf(buf, format, escaped); VIR_FREE(escaped); }
static int virInterfaceVlanDefFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { if (def->data.vlan.tag == NULL) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("vlan misses the tag name")); return(-1); } virBufferVSprintf(buf, "%*s <vlan tag='%s'", level*2, "", def->data.vlan.tag); if (def->data.vlan.devname != NULL) { virBufferAddLit(buf, ">\n"); virBufferVSprintf(buf, "%*s <interface name='%s'/>\n", level*2, "", def->data.vlan.devname); virBufferVSprintf(buf, "%*s </vlan>\n", level*2, ""); } else virBufferAddLit(buf, "/>\n"); return(0); }
static int virInterfaceProtocolDefFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { int pp, ii; for (pp = 0; pp < def->nprotos; pp++) { virBufferVSprintf(buf, "%*s <protocol family='%s'>\n", level*2, "", def->protos[pp]->family); if (def->protos[pp]->autoconf) { virBufferVSprintf(buf, "%*s <autoconf/>\n", level*2, ""); } if (def->protos[pp]->dhcp) { if (def->protos[pp]->peerdns == 0) virBufferVSprintf(buf, "%*s <dhcp peerdns='no'/>\n", level*2, ""); else if (def->protos[pp]->peerdns == 1) virBufferVSprintf(buf, "%*s <dhcp peerdns='yes'/>\n", level*2, ""); else virBufferVSprintf(buf, "%*s <dhcp/>\n", level*2, ""); } for (ii = 0; ii < def->protos[pp]->nips; ii++) { if (def->protos[pp]->ips[ii]->address != NULL) { virBufferVSprintf(buf, "%*s <ip address='%s'", level*2, "", def->protos[pp]->ips[ii]->address); if (def->protos[pp]->ips[ii]->prefix != 0) { virBufferVSprintf(buf, " prefix='%d'", def->protos[pp]->ips[ii]->prefix); } virBufferAddLit(buf, "/>\n"); } } if (def->protos[pp]->gateway != NULL) { virBufferVSprintf(buf, "%*s <route gateway='%s'/>\n", level*2, "", def->protos[pp]->gateway); } virBufferVSprintf(buf, "%*s </protocol>\n", level*2, ""); } return(0); }
static int virInterfaceBondDefFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { int i; int ret = 0; virBufferVSprintf(buf, "%*s <bond", level*2, ""); if (def->data.bond.mode == VIR_INTERFACE_BOND_BALRR) virBufferAddLit(buf, " mode='balance-rr'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_ABACKUP) virBufferAddLit(buf, " mode='active-backup'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_BALXOR) virBufferAddLit(buf, " mode='balance-xor'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_BCAST) virBufferAddLit(buf, " mode='broadcast'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_8023AD) virBufferAddLit(buf, " mode='802.3ad'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_BALTLB) virBufferAddLit(buf, " mode='balance-tlb'"); else if (def->data.bond.mode == VIR_INTERFACE_BOND_BALALB) virBufferAddLit(buf, " mode='balance-alb'"); virBufferAddLit(buf, ">\n"); if (def->data.bond.monit == VIR_INTERFACE_BOND_MONIT_MII) { virBufferVSprintf(buf, "%*s <miimon freq='%d'", level*2, "", def->data.bond.frequency); if (def->data.bond.downdelay > 0) virBufferVSprintf(buf, " downdelay='%d'", def->data.bond.downdelay); if (def->data.bond.updelay > 0) virBufferVSprintf(buf, " updelay='%d'", def->data.bond.updelay); if (def->data.bond.carrier == VIR_INTERFACE_BOND_MII_IOCTL) virBufferAddLit(buf, " carrier='ioctl'"); else if (def->data.bond.carrier == VIR_INTERFACE_BOND_MII_NETIF) virBufferAddLit(buf, " carrier='netif'"); virBufferAddLit(buf, "/>\n"); } else if (def->data.bond.monit == VIR_INTERFACE_BOND_MONIT_ARP) { if (def->data.bond.target == NULL) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("bond arp monitoring has no target")); return(-1); } virBufferVSprintf(buf, "%*s <arpmon interval='%d' target='%s'", level*2, "", def->data.bond.interval, def->data.bond.target); if (def->data.bond.validate == VIR_INTERFACE_BOND_ARP_ACTIVE) virBufferAddLit(buf, " validate='active'"); else if (def->data.bond.validate == VIR_INTERFACE_BOND_ARP_BACKUP) virBufferAddLit(buf, " validate='backup'"); else if (def->data.bond.validate == VIR_INTERFACE_BOND_ARP_ALL) virBufferAddLit(buf, " validate='all'"); virBufferAddLit(buf, "/>\n"); } for (i = 0;i < def->data.bond.nbItf;i++) { if (virInterfaceDefDevFormat(buf, def->data.bond.itf[i], level+2) < 0) ret = -1; } virBufferVSprintf(buf, "%*s </bond>\n", level*2, ""); return(ret); }
static int virInterfaceBridgeDefFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { int i; int ret = 0; virBufferVSprintf(buf, "%*s <bridge", level*2, ""); if (def->data.bridge.stp == 1) virBufferAddLit(buf, " stp='on'"); else if (def->data.bridge.stp == 0) virBufferAddLit(buf, " stp='off'"); if (def->data.bridge.delay != NULL) virBufferVSprintf(buf, " delay='%s'", def->data.bridge.delay); virBufferAddLit(buf, ">\n"); for (i = 0;i < def->data.bridge.nbItf;i++) { if (virInterfaceDefDevFormat(buf, def->data.bridge.itf[i], level+2) < 0) ret = -1; } virBufferVSprintf(buf, "%*s </bridge>\n", level*2, ""); return(ret); }
char *virNodeDeviceDefFormat(const virNodeDeviceDefPtr def) { virBuffer buf = VIR_BUFFER_INITIALIZER; virNodeDevCapsDefPtr caps; unsigned int i = 0; virBufferAddLit(&buf, "<device>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->name); if (def->parent) { virBufferEscapeString(&buf, " <parent>%s</parent>\n", def->parent); } if (def->driver) { virBufferAddLit(&buf, " <driver>\n"); virBufferEscapeString(&buf, " <name>%s</name>\n", def->driver); virBufferAddLit(&buf, " </driver>\n"); } for (caps = def->caps; caps; caps = caps->next) { char uuidstr[VIR_UUID_STRING_BUFLEN]; union _virNodeDevCapData *data = &caps->data; virBufferVSprintf(&buf, " <capability type='%s'>\n", virNodeDevCapTypeToString(caps->type)); switch (caps->type) { case VIR_NODE_DEV_CAP_SYSTEM: if (data->system.product_name) virBufferEscapeString(&buf, " <product>%s</product>\n", data->system.product_name); virBufferAddLit(&buf, " <hardware>\n"); if (data->system.hardware.vendor_name) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->system.hardware.vendor_name); if (data->system.hardware.version) virBufferEscapeString(&buf, " <version>%s</version>\n", data->system.hardware.version); if (data->system.hardware.serial) virBufferEscapeString(&buf, " <serial>%s</serial>\n", data->system.hardware.serial); virUUIDFormat(data->system.hardware.uuid, uuidstr); virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); virBufferAddLit(&buf, " </hardware>\n"); virBufferAddLit(&buf, " <firmware>\n"); if (data->system.firmware.vendor_name) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->system.firmware.vendor_name); if (data->system.firmware.version) virBufferEscapeString(&buf, " <version>%s</version>\n", data->system.firmware.version); if (data->system.firmware.release_date) virBufferEscapeString(&buf, " <release_date>%s</release_date>\n", data->system.firmware.release_date); virBufferAddLit(&buf, " </firmware>\n"); break; case VIR_NODE_DEV_CAP_PCI_DEV: virBufferVSprintf(&buf, " <domain>%d</domain>\n", data->pci_dev.domain); virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->pci_dev.bus); virBufferVSprintf(&buf, " <slot>%d</slot>\n", data->pci_dev.slot); virBufferVSprintf(&buf, " <function>%d</function>\n", data->pci_dev.function); virBufferVSprintf(&buf, " <product id='0x%04x'", data->pci_dev.product); if (data->pci_dev.product_name) virBufferEscapeString(&buf, ">%s</product>\n", data->pci_dev.product_name); else virBufferAddLit(&buf, " />\n"); virBufferVSprintf(&buf, " <vendor id='0x%04x'", data->pci_dev.vendor); if (data->pci_dev.vendor_name) virBufferEscapeString(&buf, ">%s</vendor>\n", data->pci_dev.vendor_name); else virBufferAddLit(&buf, " />\n"); if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION) { virBufferAddLit(&buf, " <capability type='phys_function'>\n"); virBufferVSprintf(&buf, " <address domain='0x%.4x' bus='0x%.2x' " "slot='0x%.2x' function='0x%.1x'/>\n", data->pci_dev.physical_function->domain, data->pci_dev.physical_function->bus, data->pci_dev.physical_function->slot, data->pci_dev.physical_function->function); virBufferAddLit(&buf, " </capability>\n"); } if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION) { virBufferAddLit(&buf, " <capability type='virt_functions'>\n"); for (i = 0 ; i < data->pci_dev.num_virtual_functions ; i++) { virBufferVSprintf(&buf, " <address domain='0x%.4x' bus='0x%.2x' " "slot='0x%.2x' function='0x%.1x'/>\n", data->pci_dev.virtual_functions[i]->domain, data->pci_dev.virtual_functions[i]->bus, data->pci_dev.virtual_functions[i]->slot, data->pci_dev.virtual_functions[i]->function); } virBufferAddLit(&buf, " </capability>\n"); } break; case VIR_NODE_DEV_CAP_USB_DEV: virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->usb_dev.bus); virBufferVSprintf(&buf, " <device>%d</device>\n", data->usb_dev.device); virBufferVSprintf(&buf, " <product id='0x%04x'", data->usb_dev.product); if (data->usb_dev.product_name) virBufferEscapeString(&buf, ">%s</product>\n", data->usb_dev.product_name); else virBufferAddLit(&buf, " />\n"); virBufferVSprintf(&buf, " <vendor id='0x%04x'", data->usb_dev.vendor); if (data->usb_dev.vendor_name) virBufferEscapeString(&buf, ">%s</vendor>\n", data->usb_dev.vendor_name); else virBufferAddLit(&buf, " />\n"); break; case VIR_NODE_DEV_CAP_USB_INTERFACE: virBufferVSprintf(&buf, " <number>%d</number>\n", data->usb_if.number); virBufferVSprintf(&buf, " <class>%d</class>\n", data->usb_if._class); virBufferVSprintf(&buf, " <subclass>%d</subclass>\n", data->usb_if.subclass); virBufferVSprintf(&buf, " <protocol>%d</protocol>\n", data->usb_if.protocol); if (data->usb_if.description) virBufferEscapeString(&buf, " <description>%s</description>\n", data->usb_if.description); break; case VIR_NODE_DEV_CAP_NET: virBufferEscapeString(&buf, " <interface>%s</interface>\n", data->net.ifname); if (data->net.address) virBufferEscapeString(&buf, " <address>%s</address>\n", data->net.address); if (data->net.subtype != VIR_NODE_DEV_CAP_NET_LAST) { const char *subtyp = virNodeDevNetCapTypeToString(data->net.subtype); virBufferEscapeString(&buf, " <capability type='%s'/>\n", subtyp); } break; case VIR_NODE_DEV_CAP_SCSI_HOST: virBufferVSprintf(&buf, " <host>%d</host>\n", data->scsi_host.host); if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) { virBufferAddLit(&buf, " <capability type='fc_host'>\n"); virBufferEscapeString(&buf, " <wwnn>%s</wwnn>\n", data->scsi_host.wwnn); virBufferEscapeString(&buf, " <wwpn>%s</wwpn>\n", data->scsi_host.wwpn); virBufferAddLit(&buf, " </capability>\n"); } if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) { virBufferAddLit(&buf, " <capability type='vport_ops' />\n"); } break; case VIR_NODE_DEV_CAP_SCSI_TARGET: virBufferEscapeString(&buf, " <target>%s</target>\n", data->scsi_target.name); break; case VIR_NODE_DEV_CAP_SCSI: virBufferVSprintf(&buf, " <host>%d</host>\n", data->scsi.host); virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->scsi.bus); virBufferVSprintf(&buf, " <target>%d</target>\n", data->scsi.target); virBufferVSprintf(&buf, " <lun>%d</lun>\n", data->scsi.lun); if (data->scsi.type) virBufferEscapeString(&buf, " <type>%s</type>\n", data->scsi.type); break; case VIR_NODE_DEV_CAP_STORAGE: virBufferEscapeString(&buf, " <block>%s</block>\n", data->storage.block); if (data->storage.bus) virBufferEscapeString(&buf, " <bus>%s</bus>\n", data->storage.bus); if (data->storage.drive_type) virBufferEscapeString(&buf, " <drive_type>%s</drive_type>\n", data->storage.drive_type); if (data->storage.model) virBufferEscapeString(&buf, " <model>%s</model>\n", data->storage.model); if (data->storage.vendor) virBufferEscapeString(&buf, " <vendor>%s</vendor>\n", data->storage.vendor); if (data->storage.serial) virBufferVSprintf(&buf, " <serial>%s</serial>\n", data->storage.serial); if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) { int avl = data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; virBufferAddLit(&buf, " <capability type='removable'>\n"); virBufferVSprintf(&buf, " <media_available>%d" "</media_available>\n", avl ? 1 : 0); virBufferVSprintf(&buf, " <media_size>%llu</media_size>\n", data->storage.removable_media_size); if (data->storage.media_label) virBufferEscapeString(&buf, " <media_label>%s</media_label>\n", data->storage.media_label); if (data->storage.logical_block_size > 0) virBufferVSprintf(&buf, " <logical_block_size>%llu" "</logical_block_size>\n", data->storage.logical_block_size); if (data->storage.num_blocks > 0) virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n", data->storage.num_blocks); virBufferAddLit(&buf, " </capability>\n"); } else { virBufferVSprintf(&buf, " <size>%llu</size>\n", data->storage.size); if (data->storage.logical_block_size > 0) virBufferVSprintf(&buf, " <logical_block_size>%llu" "</logical_block_size>\n", data->storage.logical_block_size); if (data->storage.num_blocks > 0) virBufferVSprintf(&buf, " <num_blocks>%llu</num_blocks>\n", data->storage.num_blocks); } if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE) virBufferAddLit(&buf, " <capability type='hotpluggable' />\n"); break; case VIR_NODE_DEV_CAP_LAST: /* ignore special LAST value */ break; } virBufferAddLit(&buf, " </capability>\n"); } virBufferAddLit(&buf, "</device>\n"); if (virBufferError(&buf)) goto no_memory; return virBufferContentAndReset(&buf); no_memory: virReportOOMError(); virBufferFreeAndReset(&buf); return NULL; }
/** * virBufferEscapeString: * @buf: the buffer to dump * @format: a printf like format string but with only one %s parameter * @str: the string argument which need to be escaped * * Do a formatted print with a single string to an XML buffer. The string * is escaped to avoid generating a not well-formed XML instance. */ void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str) { int len; char *escaped, *out; const char *cur; if ((format == NULL) || (buf == NULL) || (str == NULL)) return; if (buf->error) return; len = strlen(str); if (strcspn(str, "<>&'\"") == len) { virBufferVSprintf(buf, format, str); return; } if (VIR_ALLOC_N(escaped, 6 * len + 1) < 0) { virBufferNoMemory(buf); return; } cur = str; out = escaped; while (*cur != 0) { if (*cur == '<') { *out++ = '&'; *out++ = 'l'; *out++ = 't'; *out++ = ';'; } else if (*cur == '>') { *out++ = '&'; *out++ = 'g'; *out++ = 't'; *out++ = ';'; } else if (*cur == '&') { *out++ = '&'; *out++ = 'a'; *out++ = 'm'; *out++ = 'p'; *out++ = ';'; } else if (*cur == '"') { *out++ = '&'; *out++ = 'q'; *out++ = 'u'; *out++ = 'o'; *out++ = 't'; *out++ = ';'; } else if (*cur == '\'') { *out++ = '&'; *out++ = 'a'; *out++ = 'p'; *out++ = 'o'; *out++ = 's'; *out++ = ';'; } else if (((unsigned char)*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') || (*cur == '\r')) { /* * default case, just copy ! * Note that character over 0x80 are likely to give problem * with UTF-8 XML, but since our string don't have an encoding * it's hard to handle properly we have to assume it's UTF-8 too */ *out++ = *cur; } cur++; } *out = 0; virBufferVSprintf(buf, format, escaped); VIR_FREE(escaped); }
static int virInterfaceDefDevFormat(virBufferPtr buf, const virInterfaceDefPtr def, int level) { const char *type = NULL; if (def == NULL) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virInterfaceDefFormat NULL def")); goto cleanup; } if ((def->name == NULL) && (def->type != VIR_INTERFACE_TYPE_VLAN)) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("virInterfaceDefFormat missing interface name")); goto cleanup; } if (!(type = virInterfaceTypeToString(def->type))) { virInterfaceReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected interface type %d"), def->type); goto cleanup; } virBufferVSprintf(buf, "%*s<interface type='%s' ", level*2, "", type); if (def->name != NULL) virBufferEscapeString(buf, "name='%s'", def->name); virBufferAddLit(buf, ">\n"); switch (def->type) { case VIR_INTERFACE_TYPE_ETHERNET: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mac != NULL) virBufferVSprintf(buf, "%*s <mac address='%s'/>\n", level*2, "", def->mac); if (def->mtu != 0) virBufferVSprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_BRIDGE: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mtu != 0) virBufferVSprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceBridgeDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_BOND: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mtu != 0) virBufferVSprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceBondDefFormat(buf, def, level); break; case VIR_INTERFACE_TYPE_VLAN: virInterfaceStartmodeDefFormat(buf, def->startmode, level); if (def->mac != NULL) virBufferVSprintf(buf, "%*s <mac address='%s'/>\n", level*2, "", def->mac); if (def->mtu != 0) virBufferVSprintf(buf, "%*s <mtu size='%d'/>\n", level*2, "", def->mtu); virInterfaceProtocolDefFormat(buf, def, level); virInterfaceVlanDefFormat(buf, def, level); break; } virBufferVSprintf(buf, "%*s</interface>\n", level*2, ""); if (virBufferError(buf)) goto no_memory; return 0; no_memory: virReportOOMError(); cleanup: return -1; }