VIR_LOG_INIT("conf.virnodedeviceobj");
-int
+static int
virNodeDeviceObjHasCap(const virNodeDeviceObj *dev,
const char *cap)
{
}
+int
+virNodeDeviceObjGetNames(virNodeDeviceObjListPtr devs,
+ virConnectPtr conn,
+ virNodeDeviceObjListFilter aclfilter,
+ const char *cap,
+ char **const names,
+ int maxnames)
+{
+ int nnames = 0;
+ size_t i;
+
+ for (i = 0; i < devs->count && nnames < maxnames; i++) {
+ virNodeDeviceObjPtr obj = devs->objs[i];
+ virNodeDeviceObjLock(obj);
+ if (aclfilter && aclfilter(conn, obj->def) &&
+ (!cap || virNodeDeviceObjHasCap(obj, cap))) {
+ if (VIR_STRDUP(names[nnames++], obj->def->name) < 0) {
+ virNodeDeviceObjUnlock(obj);
+ goto failure;
+ }
+ }
+ virNodeDeviceObjUnlock(obj);
+ }
+
+ return nnames;
+
+ failure:
+ while (--nnames >= 0)
+ VIR_FREE(names[nnames]);
+ return -1;
+}
+
+
#define MATCH(FLAG) ((flags & (VIR_CONNECT_LIST_NODE_DEVICES_CAP_ ## FLAG)) && \
virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_ ## FLAG))
static bool
};
-int
-virNodeDeviceObjHasCap(const virNodeDeviceObj *dev,
- const char *cap);
-
virNodeDeviceObjPtr
virNodeDeviceObjFindByName(virNodeDeviceObjListPtr devs,
const char *name);
const char *cap,
virNodeDeviceObjListFilter aclfilter);
+int
+virNodeDeviceObjGetNames(virNodeDeviceObjListPtr devs,
+ virConnectPtr conn,
+ virNodeDeviceObjListFilter aclfilter,
+ const char *cap,
+ char **const names,
+ int maxnames);
+
int
virNodeDeviceObjListExport(virConnectPtr conn,
virNodeDeviceObjList devobjs,
virNodeDeviceObjAssignDef;
virNodeDeviceObjFindByName;
virNodeDeviceObjFindBySysfsPath;
+virNodeDeviceObjGetNames;
virNodeDeviceObjGetParentHost;
-virNodeDeviceObjHasCap;
virNodeDeviceObjListExport;
virNodeDeviceObjListFree;
virNodeDeviceObjLock;
return ndevs;
}
+
int
nodeListDevices(virConnectPtr conn,
const char *cap,
- char **const names, int maxnames,
+ char **const names,
+ int maxnames,
unsigned int flags)
{
- int ndevs = 0;
- size_t i;
+ int nnames;
if (virNodeListDevicesEnsureACL(conn) < 0)
return -1;
virCheckFlags(0, -1);
nodeDeviceLock();
- for (i = 0; i < driver->devs.count && ndevs < maxnames; i++) {
- virNodeDeviceObjPtr obj = driver->devs.objs[i];
- virNodeDeviceObjLock(obj);
- if (virNodeListDevicesCheckACL(conn, obj->def) &&
- (cap == NULL ||
- virNodeDeviceObjHasCap(obj, cap))) {
- if (VIR_STRDUP(names[ndevs++], obj->def->name) < 0) {
- virNodeDeviceObjUnlock(obj);
- goto failure;
- }
- }
- virNodeDeviceObjUnlock(obj);
- }
+ nnames = virNodeDeviceObjGetNames(&driver->devs, conn,
+ virNodeListDevicesCheckACL,
+ cap, names, maxnames);
nodeDeviceUnlock();
- return ndevs;
-
- failure:
- nodeDeviceUnlock();
- --ndevs;
- while (--ndevs >= 0)
- VIR_FREE(names[ndevs]);
- return -1;
+ return nnames;
}
int
return ndevs;
}
+
static int
testNodeListDevices(virConnectPtr conn,
const char *cap,
unsigned int flags)
{
testDriverPtr driver = conn->privateData;
- int ndevs = 0;
- size_t i;
+ int nnames = 0;
virCheckFlags(0, -1);
testDriverLock(driver);
- for (i = 0; i < driver->devs.count && ndevs < maxnames; i++) {
- virNodeDeviceObjLock(driver->devs.objs[i]);
- if (cap == NULL ||
- virNodeDeviceObjHasCap(driver->devs.objs[i], cap)) {
- if (VIR_STRDUP(names[ndevs++], driver->devs.objs[i]->def->name) < 0) {
- virNodeDeviceObjUnlock(driver->devs.objs[i]);
- goto failure;
- }
- }
- virNodeDeviceObjUnlock(driver->devs.objs[i]);
- }
+ nnames = virNodeDeviceObjGetNames(&driver->devs, conn, NULL,
+ cap, names, maxnames);
testDriverUnlock(driver);
- return ndevs;
-
- failure:
- testDriverUnlock(driver);
- --ndevs;
- while (--ndevs >= 0)
- VIR_FREE(names[ndevs]);
- return -1;
+ return nnames;
}
+
static virNodeDevicePtr
testNodeDeviceLookupByName(virConnectPtr conn, const char *name)
{