On 03/05/2018 09:43 AM, Erik Skultety wrote: > When commit 3545cbef moved the sysfs attribute reading logic from > _udev.c module to virmdev.c, it had to replace our udev read wrappers > with the ones available from virfile.c. The problem is that the original > logic worked correctly with udev read wrappers which don't return an > error code for a missing attribute, virfile.c readers however - not so > much. Therefore add another parameter to the macro, so we can again > accept the fact that optional attributes may be missing. > > Signed-off-by: Erik Skultety <eskultet@xxxxxxxxxx> > --- > src/util/virmdev.c | 17 +++++++++++------ > 1 file changed, 11 insertions(+), 6 deletions(-) > The virFileReadValue* API's return -2 for non existing file, so instead of messing with errno, you should be able to rc = cb(); if (rc == -2 && optional) rc = 0; if (rc < 0) goto cleanup; As it seems to be the more common way to use the functions. John > diff --git a/src/util/virmdev.c b/src/util/virmdev.c > index 124933506..688f2efb5 100644 > --- a/src/util/virmdev.c > +++ b/src/util/virmdev.c > @@ -505,10 +505,13 @@ virMediatedDeviceTypeReadAttrs(const char *sysfspath, > int ret = -1; > virMediatedDeviceTypePtr tmp = NULL; > > -#define MDEV_GET_SYSFS_ATTR(attr, dst, cb) \ > +#define MDEV_GET_SYSFS_ATTR(attr, dst, cb, optional) \ > do { \ > - if (cb(dst, "%s/%s", sysfspath, attr) < 0) \ > - goto cleanup; \ > + errno = 0; \ > + if (cb(dst, "%s/%s", sysfspath, attr) < 0) { \ > + if (errno != ENOENT || !optional) \ > + goto cleanup; \ > + } \ > } while (0) > > if (VIR_ALLOC(tmp) < 0) > @@ -517,10 +520,12 @@ virMediatedDeviceTypeReadAttrs(const char *sysfspath, > 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); > + /* @name sysfs attribute is optional, so getting ENOENT is fine */ > + MDEV_GET_SYSFS_ATTR("name", &tmp->name, virFileReadValueString, true); > + MDEV_GET_SYSFS_ATTR("device_api", &tmp->device_api, > + virFileReadValueString, false); > MDEV_GET_SYSFS_ATTR("available_instances", &tmp->available_instances, > - virFileReadValueUint); > + virFileReadValueUint, false); > > #undef MDEV_GET_SYSFS_ATTR > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list