On 09/04/2012 12:10 PM, Osier Yang wrote: > This is to list the interface objects, supported filtering flags > are: active|inactive. > > include/libvirt/libvirt.h.in: Declare enum virConnectListAllInterfaceFlags > and virConnectListAllInterfaces. > python/generator.py: Skip auto-generating > src/driver.h: (virDrvConnectListAllInterfaces) > src/libvirt.c: Implement the public API > src/libvirt_public.syms: Export the symbol to public > --- > include/libvirt/libvirt.h.in | 13 +++++++ > python/generator.py | 1 + > src/driver.h | 5 +++ > src/libvirt.c | 77 ++++++++++++++++++++++++++++++++++++++++- > src/libvirt_public.syms | 1 + > 5 files changed, 95 insertions(+), 2 deletions(-) > > diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in > index 50d865c..9226f3e 100644 > --- a/include/libvirt/libvirt.h.in > +++ b/include/libvirt/libvirt.h.in > @@ -2386,6 +2386,19 @@ int virConnectNumOfDefinedInterfaces (virConnectPtr conn); > int virConnectListDefinedInterfaces (virConnectPtr conn, > char **const names, > int maxnames); > +/* > + * virConnectListAllInterfaces: > + * > + * Flags used to filter the returned interfaces. > + */ > +typedef enum { > + VIR_CONNECT_LIST_INTERFACES_INACTIVE = 1 << 0, > + VIR_CONNECT_LIST_INTERFACES_ACTIVE = 1 << 1, > +} virConnectListAllInterfacesFlags; > + > +int virConnectListAllInterfaces (virConnectPtr conn, > + virInterfacePtr **ifaces, > + unsigned int flags); > > virInterfacePtr virInterfaceLookupByName (virConnectPtr conn, > const char *name); > diff --git a/python/generator.py b/python/generator.py > index a9a401b..8f6e455 100755 > --- a/python/generator.py > +++ b/python/generator.py > @@ -463,6 +463,7 @@ skip_function = ( > 'virConnectListAllStoragePools', # overridden in virConnect.py > 'virStoragePoolListAllVolumes', # overridden in virStoragePool.py > 'virConnectListAllNetworks', # overridden in virConnect.py > + 'virConnectListAllInterfaces', # overridden in virConnect.py > > 'virStreamRecvAll', # Pure python libvirt-override-virStream.py > 'virStreamSendAll', # Pure python libvirt-override-virStream.py > diff --git a/src/driver.h b/src/driver.h > index 534da05..518e9d4 100644 > --- a/src/driver.h > +++ b/src/driver.h > @@ -1173,6 +1173,10 @@ typedef int > (*virDrvListDefinedInterfaces) (virConnectPtr conn, > char **const names, > int maxnames); > +typedef int > + (*virDrvListAllInterfaces) (virConnectPtr conn, > + virInterfacePtr **ifaces, > + unsigned int flags); > typedef virInterfacePtr > (*virDrvInterfaceLookupByName) (virConnectPtr conn, > const char *name); > @@ -1231,6 +1235,7 @@ struct _virInterfaceDriver { > virDrvListInterfaces listInterfaces; > virDrvNumOfDefinedInterfaces numOfDefinedInterfaces; > virDrvListDefinedInterfaces listDefinedInterfaces; > + virDrvListAllInterfaces listAllInterfaces; > virDrvInterfaceLookupByName interfaceLookupByName; > virDrvInterfaceLookupByMACString interfaceLookupByMACString; > virDrvInterfaceGetXMLDesc interfaceGetXMLDesc; > diff --git a/src/libvirt.c b/src/libvirt.c > index 686af8a..90ed7ff 100644 > --- a/src/libvirt.c > +++ b/src/libvirt.c > @@ -10727,6 +10727,67 @@ virInterfaceGetConnect (virInterfacePtr iface) > } > > /** > + * virConnectListAllInterfaces: > + * @conn: Pointer to the hypervisor connection. > + * @ifaces: Pointer to a variable to store the array containing the interface > + * objects or NULL if the list is not required (just returns number > + * of interfaces). > + * @flags: bitwise-OR of virConnectListAllInterfacesFlags. > + * > + * Collect the list of interfaces, and allocate an array to store those > + * objects. This API solves the race inherent between virConnectListInterfaces > + * and virConnectListDefinedInterfaces. > + * > + * Normally, all interfaces are returned; however, @flags can be used to > + * filter the results for a smaller list of targeted interfaces. The valid > + * flags are divided into groups, where each group contains bits that > + * describe mutually exclusive attributes of a interface, and where all bits > + * within a group describe all possible interfaces. > + * > + * The only one group of @flags s/only one/only/ > is VIR_CONNECT_LIST_INTERFACES_ACTIVE (up) and > + * VIR_CONNECT_LIST_INTERFACES_INACTIVE (down) to fitler the interfaces by state. s/fitler/filter/ > + * > + * Returns the number of interfaces found or -1 and sets @ifaces to NULL in case > + * of error. On success, the array stored into @ifaces is guaranteed to have an > + * extra allocated element set to NULL but not included in the return count, > + * to make iteration easier. The caller is responsible for calling > + * virStorageInterfaceFree() on each array element, then calling free() on @ifaces. > + */ > +int > +virConnectListAllInterfaces(virConnectPtr conn, > + virInterfacePtr **ifaces, > + unsigned int flags) > +{ > + VIR_DEBUG("conn=%p, ifaces=%p, flags=%x", conn, ifaces, flags); > + > + virResetLastError(); > + > + if (ifaces) > + *ifaces = NULL; > + > + if (!VIR_IS_CONNECT(conn)) { > + virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__); > + virDispatchError(NULL); > + return -1; > + } > + > + if (conn->interfaceDriver && > + conn->interfaceDriver->listAllInterfaces) { > + int ret; > + ret = conn->interfaceDriver->listAllInterfaces(conn, ifaces, flags); > + if (ret < 0) > + goto error; > + return ret; > + } > + > + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); > + > +error: > + virDispatchError(conn); > + return -1; > +} > + > +/** > * virConnectNumOfInterfaces: > * @conn: pointer to the hypervisor connection > * > @@ -10771,7 +10832,13 @@ error: > * Collect the list of active physical host interfaces, > * and store their names in @names > * > - * Returns the number of interfaces found or -1 in case of error > + * For more control over the results, see virConnectListAllInterfaces(). > + * > + * Returns the number of interfaces found or -1 in case of error. Note that > + * this command is inherently racy; a interface can be started between a call > + * to virConnectNumOfInterfaces() and this call; you are only guaranteed that > + * all currently active interfaces were listed if the return is less than > + * @maxnames. > */ > int > virConnectListInterfaces(virConnectPtr conn, char **const names, int maxnames) > @@ -10849,7 +10916,13 @@ error: > * Collect the list of defined (inactive) physical host interfaces, > * and store their names in @names. > * > - * Returns the number of interfaces found or -1 in case of error > + * For more control over the results, see virConnectListAllInterfaces(). > + * > + * Returns the number of names provided in the array or -1 in case of error. > + * Note that this command is inherently racy; a interface can be defined between > + * a call to virConnectNumOfDefinedInterfaces() and this call; you are only > + * guaranteed that all currently defined interfaces were listed if the return > + * is less than @maxnames. The client must call free() on each returned name. > */ > int > virConnectListDefinedInterfaces(virConnectPtr conn, > diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms > index 6ff5a77..8dda48b 100644 > --- a/src/libvirt_public.syms > +++ b/src/libvirt_public.syms > @@ -556,6 +556,7 @@ LIBVIRT_0.10.0 { > > LIBVIRT_0.10.2 { > global: > + virConnectListAllInterfaces; > virConnectListAllNetworks; > virConnectListAllStoragePools; > virStoragePoolListAllVolumes; > ACK with the spelling/grammar nits fixed. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list