Networking definitions. Fixing this involved some refactoring of common code out of domain_conf and nwfilter_conf into nwfilter_params. * src/conf/nwfilter_params.h (virNWFilterFormatParamAttributes): Adjust signature. * src/conf/nwfilter_params.c (_formatParameterAttrs) (virNWFilterFormatParamAttributes): Adjust indentation. * src/conf/domain_conf.c (virDomainNetDefFormat) (virDomainActualNetDefFormat): Add parameter. (virDomainDefFormatInternal): Adjust caller. * src/conf/nwfilter_conf.c (virNWFilterIncludeDefFormat): Likewise. --- src/conf/domain_conf.c | 127 +++++++++++++++++++++---------------------- src/conf/nwfilter_conf.c | 16 ++---- src/conf/nwfilter_params.c | 41 ++++++++------ src/conf/nwfilter_params.h | 8 ++- 4 files changed, 97 insertions(+), 95 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a9d274b..64bb337 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9367,7 +9367,8 @@ virDomainFSDefFormat(virBufferPtr buf, static int virDomainActualNetDefFormat(virBufferPtr buf, - virDomainActualNetDefPtr def) + virDomainActualNetDefPtr def, + int indent) { int ret = -1; const char *type; @@ -9389,18 +9390,17 @@ virDomainActualNetDefFormat(virBufferPtr buf, _("unexpected net type %s"), type); goto error; } - virBufferAsprintf(buf, " <actual type='%s'>\n", type); + virBufferAsprintf(buf, "%*s<actual type='%s'>\n", indent, "", type); switch (def->type) { case VIR_DOMAIN_NET_TYPE_BRIDGE: - if (def->data.bridge.brname) { - virBufferEscapeString(buf, " <source bridge='%s'/>\n", - def->data.bridge.brname); - } + virBufferIndentEscapeString(buf, indent + 2, + "<source bridge='%s'/>\n", + def->data.bridge.brname); break; case VIR_DOMAIN_NET_TYPE_DIRECT: - virBufferAddLit(buf, " <source"); + virBufferIndentAddLit(buf, indent + 2, "<source"); if (def->data.direct.linkdev) virBufferEscapeString(buf, " dev='%s'", def->data.direct.linkdev); @@ -9413,16 +9413,17 @@ virDomainActualNetDefFormat(virBufferPtr buf, return ret; } virBufferAsprintf(buf, " mode='%s'/>\n", mode); - virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile, 8); + virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile, + indent + 2); break; default: break; } - if (virBandwidthDefFormat(buf, def->bandwidth, 6) < 0) + if (virBandwidthDefFormat(buf, def->bandwidth, indent + 2) < 0) goto error; - virBufferAddLit(buf, " </actual>\n"); + virBufferIndentAddLit(buf, indent, "</actual>\n"); ret = 0; error: @@ -9432,10 +9433,10 @@ error: static int virDomainNetDefFormat(virBufferPtr buf, virDomainNetDefPtr def, + int indent, unsigned int flags) { const char *type = virDomainNetTypeToString(def->type); - char *attrs; if (!type) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -9443,74 +9444,74 @@ virDomainNetDefFormat(virBufferPtr buf, return -1; } - virBufferAsprintf(buf, " <interface type='%s'>\n", type); + virBufferAsprintf(buf, "%*s<interface type='%s'>\n", indent, "", type); virBufferAsprintf(buf, - " <mac address='%02x:%02x:%02x:%02x:%02x:%02x'/>\n", + "%*s<mac address='%02x:%02x:%02x:%02x:%02x:%02x'/>\n", + indent + 2, "", def->mac[0], def->mac[1], def->mac[2], def->mac[3], def->mac[4], def->mac[5]); switch (def->type) { case VIR_DOMAIN_NET_TYPE_NETWORK: - virBufferEscapeString(buf, " <source network='%s'", - def->data.network.name); - if (def->data.network.portgroup) { - virBufferEscapeString(buf, " portgroup='%s'", - def->data.network.portgroup); - } + virBufferIndentEscapeString(buf, indent + 2, "<source network='%s'", + def->data.network.name); + virBufferEscapeString(buf, " portgroup='%s'", + def->data.network.portgroup); virBufferAddLit(buf, "/>\n"); - virVirtualPortProfileFormat(buf, def->data.network.virtPortProfile, 6); + virVirtualPortProfileFormat(buf, def->data.network.virtPortProfile, + indent + 2); if ((flags & VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET) && - (virDomainActualNetDefFormat(buf, def->data.network.actual) < 0)) + (virDomainActualNetDefFormat(buf, def->data.network.actual, + indent + 2) < 0)) return -1; break; case VIR_DOMAIN_NET_TYPE_ETHERNET: - if (def->data.ethernet.dev) - virBufferEscapeString(buf, " <source dev='%s'/>\n", - def->data.ethernet.dev); + virBufferIndentEscapeString(buf, indent + 2, "<source dev='%s'/>\n", + def->data.ethernet.dev); if (def->data.ethernet.ipaddr) - virBufferAsprintf(buf, " <ip address='%s'/>\n", + virBufferAsprintf(buf, "%*s<ip address='%s'/>\n", indent + 2, "", def->data.ethernet.ipaddr); - if (def->data.ethernet.script) - virBufferEscapeString(buf, " <script path='%s'/>\n", - def->data.ethernet.script); + virBufferIndentEscapeString(buf, indent + 2, "<script path='%s'/>\n", + def->data.ethernet.script); break; case VIR_DOMAIN_NET_TYPE_BRIDGE: - virBufferEscapeString(buf, " <source bridge='%s'/>\n", - def->data.bridge.brname); + virBufferIndentEscapeString(buf, indent + 2, "<source bridge='%s'/>\n", + def->data.bridge.brname); if (def->data.bridge.ipaddr) - virBufferAsprintf(buf, " <ip address='%s'/>\n", + virBufferAsprintf(buf, "%*s<ip address='%s'/>\n", indent + 2, "", def->data.bridge.ipaddr); - if (def->data.bridge.script) - virBufferEscapeString(buf, " <script path='%s'/>\n", - def->data.bridge.script); + virBufferIndentEscapeString(buf, indent + 2, "<script path='%s'/>\n", + def->data.bridge.script); break; case VIR_DOMAIN_NET_TYPE_SERVER: case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_MCAST: if (def->data.socket.address) - virBufferAsprintf(buf, " <source address='%s' port='%d'/>\n", + virBufferAsprintf(buf, "%*s<source address='%s' port='%d'/>\n", + indent + 2, "", def->data.socket.address, def->data.socket.port); else - virBufferAsprintf(buf, " <source port='%d'/>\n", + virBufferAsprintf(buf, "%*s<source port='%d'/>\n", indent + 2, "", def->data.socket.port); break; case VIR_DOMAIN_NET_TYPE_INTERNAL: - virBufferEscapeString(buf, " <source name='%s'/>\n", - def->data.internal.name); + virBufferIndentEscapeString(buf, indent + 2, "<source name='%s'/>\n", + def->data.internal.name); break; case VIR_DOMAIN_NET_TYPE_DIRECT: - virBufferEscapeString(buf, " <source dev='%s'", - def->data.direct.linkdev); + virBufferIndentEscapeString(buf, indent + 2, "<source dev='%s'", + def->data.direct.linkdev); virBufferAsprintf(buf, " mode='%s'", - virMacvtapModeTypeToString(def->data.direct.mode)); + virMacvtapModeTypeToString(def->data.direct.mode)); virBufferAddLit(buf, "/>\n"); - virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile, 6); + virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile, + indent + 2); break; case VIR_DOMAIN_NET_TYPE_USER: @@ -9523,15 +9524,15 @@ virDomainNetDefFormat(virBufferPtr buf, !((flags & VIR_DOMAIN_XML_INACTIVE) && (STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX)))) { /* Skip auto-generated target names for inactive config. */ - virBufferEscapeString(buf, " <target dev='%s'/>\n", - def->ifname); + virBufferIndentEscapeString(buf, indent + 2, "<target dev='%s'/>\n", + def->ifname); } if (def->model) { - virBufferEscapeString(buf, " <model type='%s'/>\n", - def->model); + virBufferIndentEscapeString(buf, indent + 2, "<model type='%s'/>\n", + def->model); if (STREQ(def->model, "virtio") && (def->driver.virtio.name || def->driver.virtio.txmode)) { - virBufferAddLit(buf, " <driver"); + virBufferIndentAddLit(buf, indent + 2, "<driver"); if (def->driver.virtio.name) { virBufferAsprintf(buf, " name='%s'", virDomainNetBackendTypeToString(def->driver.virtio.name)); @@ -9552,36 +9553,32 @@ virDomainNetDefFormat(virBufferPtr buf, } } if (def->filter) { - virBufferEscapeString(buf, " <filterref filter='%s'", - def->filter); - attrs = virNWFilterFormatParamAttributes(def->filterparams, - " "); - if (!attrs || strlen(attrs) <= 1) - virBufferAddLit(buf, "/>\n"); - else - virBufferAsprintf(buf, ">\n%s </filterref>\n", attrs); - VIR_FREE(attrs); + if (virNWFilterFormatParamAttributes(buf, def->filterparams, + def->filter, indent + 4) < 0) + return -1; } if (def->bootIndex) - virBufferAsprintf(buf, " <boot order='%d'/>\n", def->bootIndex); + virBufferAsprintf(buf, "%*s<boot order='%d'/>\n", indent + 2, "", + def->bootIndex); if (def->tune.sndbuf_specified) { - virBufferAddLit(buf, " <tune>\n"); - virBufferAsprintf(buf, " <sndbuf>%lu</sndbuf>\n", def->tune.sndbuf); - virBufferAddLit(buf, " </tune>\n"); + virBufferIndentAddLit(buf, indent + 2, "<tune>\n"); + virBufferAsprintf(buf, "%*s<sndbuf>%lu</sndbuf>\n", indent + 4, "", + def->tune.sndbuf); + virBufferIndentAddLit(buf, indent + 2, "</tune>\n"); } if (def->linkstate) - virBufferAsprintf(buf, " <link state='%s'/>\n", + virBufferAsprintf(buf, "%*s<link state='%s'/>\n", indent + 2, "", virDomainNetInterfaceLinkStateTypeToString(def->linkstate)); - if (virBandwidthDefFormat(buf, def->bandwidth, 6) < 0) + if (virBandwidthDefFormat(buf, def->bandwidth, indent + 2) < 0) return -1; - if (virDomainDeviceInfoFormat(buf, &def->info, 6, flags) < 0) + if (virDomainDeviceInfoFormat(buf, &def->info, indent + 2, flags) < 0) return -1; - virBufferAddLit(buf, " </interface>\n"); + virBufferIndentAddLit(buf, indent, "</interface>\n"); return 0; } @@ -10804,7 +10801,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, for (n = 0 ; n < def->nnets ; n++) - if (virDomainNetDefFormat(buf, def->nets[n], flags) < 0) /* XXX indent */ + if (virDomainNetDefFormat(buf, def->nets[n], indent, flags) < 0) goto cleanup; for (n = 0 ; n < def->nsmartcards ; n++) diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index 08ede48..20f97f2 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2849,19 +2849,13 @@ no_memory: static char * virNWFilterIncludeDefFormat(virNWFilterIncludeDefPtr inc) { - char *attrs; virBuffer buf = VIR_BUFFER_INITIALIZER; - virBufferAsprintf(&buf," <filterref filter='%s'", - inc->filterref); - - attrs = virNWFilterFormatParamAttributes(inc->params, " "); - - if (!attrs || strlen(attrs) <= 1) - virBufferAddLit(&buf, "/>\n"); - else - virBufferAsprintf(&buf, ">\n%s </filterref>\n", attrs); - + if (virNWFilterFormatParamAttributes(&buf, inc->params, inc->filterref, + 2) < 0) { + virBufferFreeAndReset(&buf); + return NULL; + } if (virBufferError(&buf)) { virReportOOMError(); virBufferFreeAndReset(&buf); diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index ee10b21..601a61c 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -260,7 +260,7 @@ skip_entry: struct formatterParam { virBufferPtr buf; - const char *indent; + int indent; }; @@ -269,30 +269,37 @@ _formatParameterAttrs(void *payload, const void *name, void *data) { struct formatterParam *fp = (struct formatterParam *)data; - virBufferAsprintf(fp->buf, "%s<parameter name='%s' value='%s'/>\n", - fp->indent, + virBufferAsprintf(fp->buf, "%*s<parameter name='%s' value='%s'/>\n", + fp->indent, "", (const char *)name, (char *)payload); } -char * -virNWFilterFormatParamAttributes(virNWFilterHashTablePtr table, - const char *indent) +int +virNWFilterFormatParamAttributes(virBufferPtr buf, + virNWFilterHashTablePtr table, + const char *filterref, + int indent) { - virBuffer buf = VIR_BUFFER_INITIALIZER; struct formatterParam fp = { - .buf = &buf, - .indent = indent, + .buf = buf, + .indent = indent + 2, }; + int count = virHashSize(table->hashTable); - virHashForEach(table->hashTable, _formatParameterAttrs, &fp); - - if (virBufferError(&buf)) { - virReportOOMError(); - virBufferFreeAndReset(&buf); - return NULL; + if (count < 0) { + virNWFilterReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing filter parameter table")); + return -1; } - - return virBufferContentAndReset(&buf); + virBufferAsprintf(buf, "%*s<filterref filter='%s'", indent, "", filterref); + if (count) { + virBufferAddLit(buf, ">\n"); + virHashForEach(table->hashTable, _formatParameterAttrs, &fp); + virBufferIndentAddLit(buf, indent, "</filterref>\n"); + } else { + virBufferAddLit(buf, "/>\n"); + } + return 0; } diff --git a/src/conf/nwfilter_params.h b/src/conf/nwfilter_params.h index 012d6a1..889c351 100644 --- a/src/conf/nwfilter_params.h +++ b/src/conf/nwfilter_params.h @@ -1,6 +1,7 @@ /* * nwfilter_params.h: parsing and data maintenance of filter parameters * + * Copyright (C) 2011 Red Hat, Inc. * Copyright (C) 2010 IBM Corporation * * This library is free software; you can redistribute it and/or @@ -23,6 +24,7 @@ # define NWFILTER_PARAMS_H # include "hash.h" +# include "buf.h" typedef struct _virNWFilterHashTable virNWFilterHashTable; typedef virNWFilterHashTable *virNWFilterHashTablePtr; @@ -35,8 +37,10 @@ struct _virNWFilterHashTable { virNWFilterHashTablePtr virNWFilterParseParamAttributes(xmlNodePtr cur); -char * virNWFilterFormatParamAttributes(virNWFilterHashTablePtr table, - const char *indent); +int virNWFilterFormatParamAttributes(virBufferPtr buf, + virNWFilterHashTablePtr table, + const char *filterref, + int indent); virNWFilterHashTablePtr virNWFilterHashTableCreate(int n); void virNWFilterHashTableFree(virNWFilterHashTablePtr table); -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list