diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fb7635499ff64d9889fbd2aa2683395b7ce3db8d..c52c3ec385c1586873fb57880998ce838a6e3010 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2182,6 +2182,7 @@ virMediatedDeviceModelTypeToString; virMediatedDeviceNew; virMediatedDeviceSetUsedBy; virMediatedDeviceTypeFree; +virMediatedDeviceTypeReadAttrs; diff --git a/src/util/virmdev.c b/src/util/virmdev.c index db679b8a6db93ae0102dc2bb4a2fecafe88509e0..1249335067430912a68582762994a21db005be81 100644 --- a/src/util/virmdev.c +++ b/src/util/virmdev.c @@ -496,3 +496,37 @@ virMediatedDeviceTypeFree(virMediatedDeviceTypePtr type) VIR_FREE(type->device_api); VIR_FREE(type); } + + +int +virMediatedDeviceTypeReadAttrs(const char *sysfspath, + virMediatedDeviceTypePtr *type) +{ + int ret = -1; + virMediatedDeviceTypePtr tmp = NULL; + +#define MDEV_GET_SYSFS_ATTR(attr, dst, cb) \ + do { \ + if (cb(dst, "%s/%s", sysfspath, attr) < 0) \ + goto cleanup; \ + } while (0) + + if (VIR_ALLOC(tmp) < 0) + goto cleanup; + + if (VIR_STRDUP(tmp->id, last_component(sysfspath)) < 0) + goto cleanup; + + MDEV_GET_SYSFS_ATTR("name", &tmp->name, virFileReadValueString); + MDEV_GET_SYSFS_ATTR("device_api", &tmp->device_api, virFileReadValueString); + MDEV_GET_SYSFS_ATTR("available_instances", &tmp->available_instances, + virFileReadValueUint); + +#undef MDEV_GET_SYSFS_ATTR + + VIR_STEAL_PTR(*type, tmp); + ret = 0; + cleanup: + virMediatedDeviceTypeFree(tmp); + return ret; +} diff --git a/src/util/virmdev.h b/src/util/virmdev.h index 320610ab97326a5ed5c293a3b196ca513a209792..01ab02e751b933bdb005014a3455b9e5800dfec6 100644 --- a/src/util/virmdev.h +++ b/src/util/virmdev.h @@ -129,4 +129,9 @@ virMediatedDeviceListMarkDevices(virMediatedDeviceListPtr dst, void virMediatedDeviceTypeFree(virMediatedDeviceTypePtr type); + +int +virMediatedDeviceTypeReadAttrs(const char *sysfspath, + virMediatedDeviceTypePtr *type); + #endif /* __VIR_MDEV_H__ */