[libvirt] [PATCH 4/6 v5] list: Implement listAllInterfaces
Osier Yang
jyang at redhat.com
Wed Sep 12 07:38:35 UTC 2012
On 2012年09月12日 14:09, Laine Stump wrote:
> On 09/11/2012 11:37 PM, Osier Yang wrote:
>> This is not that ideal as API for other objects, as it's still
>> O(n). Because interface driver uses netcf APIs to manage the
>> stuffs, instead of by itself. And netcf APIs don't return a object.
>> It provides APIs like old libvirt APIs:
>>
>> ncf_number_of_interfaces
>> ncf_list_interfaces
>> ncf_lookup_by_name
>> ......
>>
>> Perhaps we should further improve netcf to let it provide an API
>> to return the object, but it could be a later patch. And anyway,
>> we will still benefit from the new API for the simplification,
>> and no race like the old APIs.
>>
>> src/interface/netcf_driver.c: Implement listAllInterfaces
>>
>> v4 - v5:
>> * Ignore the NETCF_NOERROR, in case of the iface could be deleted
>> by other management apps as a race.
>>
>> * Fix the memory leak caught by Laine.
>>
>> * The version number fix.
>>
>> ---
>> src/interface/netcf_driver.c | 143 ++++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 143 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c
>> index 935be66..26d25d7 100644
>> --- a/src/interface/netcf_driver.c
>> +++ b/src/interface/netcf_driver.c
>> @@ -30,6 +30,7 @@
>> #include "netcf_driver.h"
>> #include "interface_conf.h"
>> #include "memory.h"
>> +#include "logging.h"
>>
>> #define VIR_FROM_THIS VIR_FROM_INTERFACE
>>
>> @@ -259,6 +260,147 @@ static int interfaceListDefinedInterfaces(virConnectPtr conn, char **const names
>>
>> }
>>
>> +static int
>> +interfaceListAllInterfaces(virConnectPtr conn,
>> + virInterfacePtr **ifaces,
>> + unsigned int flags)
>> +{
>> + struct interface_driver *driver = conn->interfacePrivateData;
>> + int count;
>> + int i;
>> + struct netcf_if *iface = NULL;
>> + virInterfacePtr *tmp_iface_objs = NULL;
>> + virInterfacePtr iface_obj = NULL;
>> + unsigned int status;
>> + int niface_objs = 0;
>> + int ret = -1;
>> + char **names;
>> +
>> + virCheckFlags(VIR_CONNECT_LIST_INTERFACES_ACTIVE |
>> + VIR_CONNECT_LIST_INTERFACES_INACTIVE, -1);
>> +
>> + interfaceDriverLock(driver);
>> +
>> + /* List all interfaces, in case of we might support new filter flags
>> + * except active|inactive in future.
>> + */
>> + count = ncf_num_of_interfaces(driver->netcf, NETCF_IFACE_ACTIVE |
>> + NETCF_IFACE_INACTIVE);
>> + if (count< 0) {
>> + const char *errmsg, *details;
>> + int errcode = ncf_error(driver->netcf,&errmsg,&details);
>> + virReportError(netcf_to_vir_err(errcode),
>> + _("failed to get number of host interfaces: %s%s%s"),
>> + errmsg, details ? " - " : "",
>> + details ? details : "");
>> + return -1;
>
>
> Ooh! I just noticed that you have several return paths here that don't
> call interfaceDriverUnlock()!!
>
> If you initialize names = NULL, then qualify the loop to free names with
> "if (names) { ... }", you should be able to just to "ret = X; goto
> cleanup;" instead of return.
>
Oops, now pushed the whole set with this fixed. Thanks for the
quick reviewing!
Regards,
Osier
More information about the libvir-list
mailing list