int nodeListDevices(virConnectPtr conn, const char *cap, char **const names, int maxnames, unsigned int flags) { virNodeDeviceDriverStatePtr driver = conn->nodeDevicePrivateData; int ndevs = 0; size_t i; if (virNodeListDevicesEnsureACL(conn) < 0) return -1; virCheckFlags(0, -1); nodeDeviceLock(driver); 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 || virNodeDeviceHasCap(obj, cap))) { if (VIR_STRDUP(names[ndevs++], obj->def->name) < 0) { virNodeDeviceObjUnlock(obj); goto failure; } } virNodeDeviceObjUnlock(obj); } nodeDeviceUnlock(driver); return ndevs; failure: nodeDeviceUnlock(driver); --ndevs; while (--ndevs >= 0) VIR_FREE(names[ndevs]); return -1; }
int nodeListDevices(virConnectPtr conn, const char *cap, char **const names, int maxnames, unsigned int flags) { int nnames; if (virNodeListDevicesEnsureACL(conn) < 0) return -1; virCheckFlags(0, -1); nodeDeviceLock(); nnames = virNodeDeviceObjGetNames(&driver->devs, conn, virNodeListDevicesCheckACL, cap, names, maxnames); nodeDeviceUnlock(); return nnames; }