[libvirt] [PATCH 5/5] list: Use virConnectListAllNWFilters in virsh

Osier Yang jyang at redhat.com
Mon Sep 17 04:39:17 UTC 2012


On 2012年09月06日 22:41, Peter Krempa wrote:
> On 09/05/12 08:02, Osier Yang wrote:
>> tools/virsh-nwfilter.c:
>> * vshNWFilterSorter to sort network filters by name
>>
>> * vshNWFilterListFree to free the network filter objects list.
>>
>> * vshNWFilterListCollect to collect the network filter objects, trying
>> to use new API first, fall back to older APIs if it's not supported.
>> ---
>> tools/virsh-nwfilter.c | 163
>> +++++++++++++++++++++++++++++++++++++++---------
>> 1 files changed, 134 insertions(+), 29 deletions(-)
>>
>> diff --git a/tools/virsh-nwfilter.c b/tools/virsh-nwfilter.c
>> index 5169d38..57cf2b7 100644
>> --- a/tools/virsh-nwfilter.c
>> +++ b/tools/virsh-nwfilter.c
>> @@ -190,6 +190,134 @@ cmdNWFilterDumpXML(vshControl *ctl, const vshCmd
>> *cmd)
>> return ret;
>> }
>>
>> +static int
>> +vshNWFilterSorter(const void *a, const void *b)
>> +{
>> + virNWFilterPtr *fa = (virNWFilterPtr *) a;
>> + virNWFilterPtr *fb = (virNWFilterPtr *) b;
>> +
>> + if (*fa && !*fb)
>> + return -1;
>> +
>> + if (!*fa)
>> + return *fb != NULL;
>> +
>> + return vshStrcasecmp(virNWFilterGetName(*fa),
>> + virNWFilterGetName(*fb));
>
> Bad indentation.
>
>> +}
>> +
>> +struct vshNWFilterList {
>> + virNWFilterPtr *filters;
>> + size_t nfilters;
>> +};
>> +typedef struct vshNWFilterList *vshNWFilterListPtr;
>> +
>> +static void
>> +vshNWFilterListFree(vshNWFilterListPtr list)
>> +{
>> + int i;
>> +
>> + if (list && list->nfilters) {
>> + for (i = 0; i < list->nfilters; i++) {
>> + if (list->filters[i])
>> + virNWFilterFree(list->filters[i]);
>> + }
>> + VIR_FREE(list->filters);
>> + }
>> + VIR_FREE(list);
>> +}
>> +
>> +static vshNWFilterListPtr
>> +vshNWFilterListCollect(vshControl *ctl,
>> + unsigned int flags)
>> +{
>> + vshNWFilterListPtr list = vshMalloc(ctl, sizeof(*list));
>> + int i;
>> + int ret;
>> + virNWFilterPtr filter;
>> + bool success = false;
>> + size_t deleted = 0;
>> + int nfilters = 0;
>> + char **names = NULL;
>> +
>> + /* try the list with flags support (0.10.2 and later) */
>> + if ((ret = virConnectListAllNWFilters(ctl->conn,
>> + &list->filters,
>> + flags)) >= 0) {
>> + list->nfilters = ret;
>> + goto finished;
>> + }
>> +
>> + /* check if the command is actually supported */
>> + if (last_error && last_error->code == VIR_ERR_NO_SUPPORT) {
>> + vshResetLibvirtError();
>> + goto fallback;
>> + }
>> +
>> + /* there was an error during the call */
>> + vshError(ctl, "%s", _("Failed to list node filters"));
>> + goto cleanup;
>> +
>> +
>> +fallback:
>> + /* fall back to old method (0.9.13 and older) */
>> + vshResetLibvirtError();
>> +
>> + nfilters = virConnectNumOfNWFilters(ctl->conn);
>> + if (nfilters < 0) {
>> + vshError(ctl, "%s", _("Failed to count network filters"));
>> + goto cleanup;
>> + }
>> +
>> + if (nfilters == 0)
>> + return list;
>> +
>> + names = vshMalloc(ctl, sizeof(char *) * nfilters);
>> +
>> + nfilters = virConnectListNWFilters(ctl->conn, names, nfilters);
>> + if (nfilters < 0) {
>> + vshError(ctl, "%s", _("Failed to list network filters"));
>> + goto cleanup;
>> + }
>> +
>> + list->filters = vshMalloc(ctl, sizeof(virNWFilterPtr) * (nfilters));
>
> Brackets are not necessary around nfilters.
>
>> + list->nfilters = 0;
>> +
>> + /* get the network filters */
>> + for (i = 0; i < nfilters ; i++) {
>> + if (!(filter = virNWFilterLookupByName(ctl->conn, names[i])))
>> + continue;
>> + list->filters[list->nfilters++] = filter;
>> + }
>> +
>> + /* truncate network filters that weren't found */
>> + deleted = nfilters - list->nfilters;
>> +
>> +finished:
>> + /* sort the list */
>> + if (list->filters && list->nfilters)
>> + qsort(list->filters, list->nfilters,
>> + sizeof(*list->filters), vshNWFilterSorter);
>> +
>> + /* truncate the list for not found filter objects */
>> + if (deleted)
>> + VIR_SHRINK_N(list->filters, list->nfilters, deleted);
>> +
>> + success = true;
>> +
>> +cleanup:
>> + for (i = 0; i < nfilters; i++)
>> + VIR_FREE(names[i]);
>> + VIR_FREE(names);
>> +
>> + if (!success) {
>> + vshNWFilterListFree(list);
>> + list = NULL;
>> + }
>> +
>> + return list;
>> +}
>> +
>> /*
>> * "nwfilter-list" command
>> */
>
>
> Otherwise looks OK.
>

Pushed with the nits fixed.

Regards,
Osier




More information about the libvir-list mailing list