src/conf/virobjectlist.h:
* New macro VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP
* Declare virNodeDeviceList
src/conf/virobjectlist.c:
* New helpers virNodeDeviceCapMatch, virNodeDeviceMatch.
virNodeDeviceCapMatch looks up the list of all the caps the device
support, to see if the device support the cap type.
* Implement virNodeDeviceList
src/libvirt_private.syms:
* Export virNodeDeviceList
---
src/conf/virobjectlist.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++
src/conf/virobjectlist.h | 17 ++++++++
src/libvirt_private.syms | 2 +
3 files changed, 122 insertions(+), 0 deletions(-)
diff --git a/src/conf/virobjectlist.c b/src/conf/virobjectlist.c
index 83b0d9c..55c236c 100644
--- a/src/conf/virobjectlist.c
+++ b/src/conf/virobjectlist.c
@@ -30,6 +30,7 @@
#include "virhash.h"
#include "domain_conf.h"
#include "storage_conf.h"
+#include "node_device_conf.h"
#include "memory.h"
#include "datatypes.h"
#include "virterror_internal.h"
@@ -135,6 +136,20 @@ cleanup:
}
#undef MATCH
+static bool
+virNodeDeviceCapMatch(virNodeDeviceObjPtr devobj,
+ int type)
+{
+ virNodeDevCapsDefPtr cap = NULL;
+
+ for (cap = devobj->def->caps; cap; cap = cap->next) {
+ if (type == cap->type)
+ return true;
+ }
+
+ return false;
+}
+
#define MATCH(FLAG) (flags & (FLAG))
static bool
virStoragePoolMatch (virStoragePoolObjPtr poolobj,
@@ -222,6 +237,36 @@ virNetworkMatch (virNetworkObjPtr netobj,
return true;
}
+
+static bool
+virNodeDeviceMatch (virNodeDeviceObjPtr devobj,
+ unsigned int flags)
+{
+ /* filter by cap type */
+ if (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP)) {
+ if (!((MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SYSTEM) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SYSTEM)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_PCI_DEV)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_USB_DEV)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_INTERFACE) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_USB_INTERFACE)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_NET)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI_HOST)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_TARGET) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI_TARGET)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI)) ||
+ (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_STORAGE) &&
+ virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_STORAGE))))
+ return false;
+ }
+
+ return true;
+}
#undef MATCH
int
@@ -430,3 +475,61 @@ cleanup:
VIR_FREE(tmp_nets);
return ret;
}
+
+int
+virNodeDeviceList(virConnectPtr conn,
+ virNodeDeviceObjList devobjs,
+ virNodeDevicePtr **devices,
+ unsigned int flags)
+{
+ virNodeDevicePtr *tmp_devices = NULL;
+ virNodeDevicePtr device = NULL;
+ int ndevices = 0;
+ int ret = -1;
+ int i;
+
+ if (devices) {
+ if (VIR_ALLOC_N(tmp_devices, devobjs.count + 1) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+
+ for (i = 0; i < devobjs.count; i++) {
+ virNodeDeviceObjPtr devobj = devobjs.objs[i];
+ virNodeDeviceObjLock(devobj);
+ if (virNodeDeviceMatch(devobj, flags)) {
+ if (devices) {
+ if (!(device = virGetNodeDevice(conn,
+ devobj->def->name))) {
+ virNodeDeviceObjUnlock(devobj);
+ goto cleanup;
+ }
+ tmp_devices[ndevices++] = device;
+ } else {
+ ndevices++;
+ }
+ }
+ virNodeDeviceObjUnlock(devobj);
+ }
+
+ if (tmp_devices) {
+ /* trim the array to the final size */
+ ignore_value(VIR_REALLOC_N(tmp_devices, ndevices + 1));
+ *devices = tmp_devices;
+ tmp_devices = NULL;
+ }
+
+ ret = ndevices;
+
+cleanup:
+ if (tmp_devices) {
+ for (i = 0; i < devobjs.count; i++) {
+ if (tmp_devices[i])
+ virNodeDeviceFree(tmp_devices[i]);
+ }
+ }
+
+ VIR_FREE(tmp_devices);
+ return ret;
+}
diff --git a/src/conf/virobjectlist.h b/src/conf/virobjectlist.h
index 431635e..e62d454 100644
--- a/src/conf/virobjectlist.h
+++ b/src/conf/virobjectlist.h
@@ -29,6 +29,7 @@
# include "domain_conf.h"
# include "storage_conf.h"
# include "network_conf.h"
+# include "node_device_conf.h"
# define VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE \
(VIR_CONNECT_LIST_DOMAINS_ACTIVE | \
@@ -123,6 +124,17 @@
VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \
VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART)
+# define VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP \
+ (VIR_CONNECT_LIST_NODE_DEVICES_CAP_SYSTEM | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_INTERFACE | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_TARGET | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI | \
+ VIR_CONNECT_LIST_NODE_DEVICES_CAP_STORAGE)
+
int virDomainList(virConnectPtr conn, virHashTablePtr domobjs,
virDomainPtr **domains, unsigned int flags);
@@ -142,4 +154,9 @@ int virNetworkList(virConnectPtr conn,
virNetworkPtr **nets,
unsigned int flags);
+int virNodeDeviceList(virConnectPtr conn,
+ virNodeDeviceObjList devobjs,
+ virNodeDevicePtr **devices,
+ unsigned int flags);
+
#endif /* __VIR_OBJECT_LIST_H__ */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 647ecf0..43557d9 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -817,6 +817,7 @@ virPortGroupFindByName;
# node_device_conf.h
+virNodeDevCapTypeFromString;
virNodeDevCapTypeToString;
virNodeDevCapsDefFree;
virNodeDeviceAssignDef;
@@ -1247,6 +1248,7 @@ virDBusGetSystemBus;
virDomainList;
virDomainListSnapshots;
virNetworkList;
+virNodeDeviceList;
virStoragePoolList;
--
1.7.7.3