[libvirt] [PATCH V4 3/4] Extend NWFilter parameter parser to cope with lists of values
Eric Blake
eblake at redhat.com
Fri Oct 28 21:38:56 UTC 2011
On 10/27/2011 03:07 PM, Stefan Berger wrote:
> This patch modifies the NWFilter parameter parser to support multiple
> elements with the same name and to internally build a list of items.
> An example of the XML looks like this:
>
> <parameter name='TEST' value='10.1.2.3'/>
> <parameter name='TEST' value='10.2.3.4'/>
> <parameter name='TEST' value='10.1.1.1'/>
Oh, I see - you fixed parsing to allow multiple, more or less replacing
the part of patch 1/4 that was trying to do [a,b,c] formatting. We
might as well ditch that part of the earlier patch, rather than
introducing it just to pull it back out.
>
> The list of values is then stored in the newly introduced data type
> virNWFilterVarValue.
>
> The XML formatter is also adapted to print out all items in alphabetical
> order sorted by 'name'.
>
> This patch als fixes a bug in the XML schema on the way.
s/als/also/
>
> -static void
> -_formatParameterAttrs(void *payload, const void *name, void *data)
> +static int
> +virNWFilterFormatParameterNameSorter(const virHashKeyValuePairPtr a,
> + const virHashKeyValuePairPtr b)
> {
> - struct formatterParam *fp = (struct formatterParam *)data;
> - virNWFilterVarValuePtr value = payload;
> -
> - virBufferAsprintf(fp->buf, "%s<parameter name='%s' value='",
> - fp->indent,
> - (const char *)name);
> - virNWFilterVarValuePrint(value, fp->buf);
> - virBufferAddLit(fp->buf, "'/>\n");
> + return strcmp((const char *)a->key, (const char *)b->key);
> }
>
> -
> char *
> virNWFilterFormatParamAttributes(virNWFilterHashTablePtr table,
> const char *indent)
> {
> virBuffer buf = VIR_BUFFER_INITIALIZER;
> - struct formatterParam fp = {
> - .buf =&buf,
> - .indent = indent,
> - };
> + char **keys, *key;
> + int i, j, card, numKeys;
> + virNWFilterVarValuePtr value;
> +
> + if (!table)
> + return NULL;
> +
> + keys = (char **)virHashGetKeys(table->hashTable,
> + virNWFilterFormatParameterNameSorter);
> + if (!keys)
> + return NULL;
> +
> + numKeys = virHashSize(table->hashTable);
> +
> + for (i = 0; i< numKeys; i++) {
> + value = virHashLookup(table->hashTable, keys[i]);
> + card = virNWFilterVarValueGetCardinality(value);
> +
> + for (j = 0; j< card; j++) {
> + virBufferAsprintf(&buf,
> + "%s<parameter name='%s' value='%s'/>\n",
> + indent, keys[i],
> + virNWFilterVarValueGetNthValue(value, j));
Are the parameter values guaranteed to be safe to print, or do you need
virBufferEscapeString()?
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list