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 handling, and handle filterref here. (formatterParam): Delete unused struct. * src/conf/domain_conf.c (virDomainNetDefFormat): Adjust caller. * src/conf/nwfilter_conf.c (virNWFilterIncludeDefFormat): Likewise. --- src/conf/domain_conf.c | 15 ++++--------- src/conf/nwfilter_conf.c | 18 ++++++---------- src/conf/nwfilter_params.c | 45 +++++++++++++++++++------------------------ src/conf/nwfilter_params.h | 7 ++++- 4 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 70201af..efdf914 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9441,7 +9441,6 @@ virDomainNetDefFormat(virBufferPtr buf, unsigned int flags) { const char *type = virDomainNetTypeToString(def->type); - char *attrs; if (!type) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -9562,15 +9561,11 @@ 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); + virBufferAdjustIndent(buf, 4); + if (virNWFilterFormatParamAttributes(buf, def->filterparams, + def->filter) < 0) + return -1; + virBufferAdjustIndent(buf, -4); } if (def->bootIndex) virBufferAsprintf(buf, " <boot order='%d'/>\n", def->bootIndex); diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index 08ede48..5ab4c60 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2849,19 +2849,15 @@ 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); - + virBufferAdjustIndent(&buf, 2); + if (virNWFilterFormatParamAttributes(&buf, inc->params, + inc->filterref) < 0) { + virBufferFreeAndReset(&buf); + return NULL; + } + virBufferAdjustIndent(&buf, -2); if (virBufferError(&buf)) { virReportOOMError(); virBufferFreeAndReset(&buf); diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index ee10b21..871aca9 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -258,41 +258,36 @@ skip_entry: } -struct formatterParam { - virBufferPtr buf; - const char *indent; -}; - - static void _formatParameterAttrs(void *payload, const void *name, void *data) { - struct formatterParam *fp = (struct formatterParam *)data; + virBufferPtr buf = data; - virBufferAsprintf(fp->buf, "%s<parameter name='%s' value='%s'/>\n", - fp->indent, + virBufferAsprintf(buf, " <parameter name='%s' value='%s'/>\n", (const char *)name, (char *)payload); } -char * -virNWFilterFormatParamAttributes(virNWFilterHashTablePtr table, - const char *indent) +int +virNWFilterFormatParamAttributes(virBufferPtr buf, + virNWFilterHashTablePtr table, + const char *filterref) { - virBuffer buf = VIR_BUFFER_INITIALIZER; - struct formatterParam fp = { - .buf = &buf, - .indent = indent, - }; - - virHashForEach(table->hashTable, _formatParameterAttrs, &fp); + int count = virHashSize(table->hashTable); - 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, "<filterref filter='%s'", filterref); + if (count) { + virBufferAddLit(buf, ">\n"); + virHashForEach(table->hashTable, _formatParameterAttrs, buf); + virBufferAddLit(buf, "</filterref>\n"); + } else { + virBufferAddLit(buf, "/>\n"); + } + return 0; } diff --git a/src/conf/nwfilter_params.h b/src/conf/nwfilter_params.h index 012d6a1..4345229 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,9 @@ struct _virNWFilterHashTable { virNWFilterHashTablePtr virNWFilterParseParamAttributes(xmlNodePtr cur); -char * virNWFilterFormatParamAttributes(virNWFilterHashTablePtr table, - const char *indent); +int virNWFilterFormatParamAttributes(virBufferPtr buf, + virNWFilterHashTablePtr table, + const char *filterref); 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