[libvirt] [PATCH V4 3/4] Extend NWFilter parameter parser to cope with lists of values
Stefan Berger
stefanb at linux.vnet.ibm.com
Mon Oct 31 12:14:49 UTC 2011
On 10/28/2011 05:38 PM, Eric Blake wrote:
> 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.
Ditched now.
>
>>
>> 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()?
>
Yes, since only these here are allowed:
# define VALID_VARVALUE \
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.:"
Stefan
More information about the libvir-list
mailing list