[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