diff options
Diffstat (limited to 'src/libudev/libudev-enumerate.c')
-rw-r--r-- | src/libudev/libudev-enumerate.c | 75 |
1 files changed, 32 insertions, 43 deletions
diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c index c9d54dc72c..e54ee572c5 100644 --- a/src/libudev/libudev-enumerate.c +++ b/src/libudev/libudev-enumerate.c @@ -33,7 +33,7 @@ */ struct udev_enumerate { struct udev *udev; - int refcount; + unsigned n_ref; struct udev_list devices_list; bool devices_uptodate:1; @@ -49,35 +49,39 @@ struct udev_enumerate { * Returns: an enumeration context. **/ _public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev) { - _cleanup_free_ struct udev_enumerate *udev_enumerate = NULL; + _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL; + struct udev_enumerate *udev_enumerate; int r; - assert_return_errno(udev, NULL, EINVAL); + r = sd_device_enumerator_new(&e); + if (r < 0) + return_with_errno(NULL, r); - udev_enumerate = new0(struct udev_enumerate, 1); - if (!udev_enumerate) { - errno = ENOMEM; - return NULL; - } + r = sd_device_enumerator_allow_uninitialized(e); + if (r < 0) + return_with_errno(NULL, r); - r = sd_device_enumerator_new(&udev_enumerate->enumerator); - if (r < 0) { - errno = -r; - return NULL; - } + udev_enumerate = new(struct udev_enumerate, 1); + if (!udev_enumerate) + return_with_errno(NULL, ENOMEM); - r = sd_device_enumerator_allow_uninitialized(udev_enumerate->enumerator); - if (r < 0) { - errno = -r; - return NULL; - } + *udev_enumerate = (struct udev_enumerate) { + .udev = udev, + .n_ref = 1, + .enumerator = TAKE_PTR(e), + }; + + udev_list_init(&udev_enumerate->devices_list, false); - udev_enumerate->refcount = 1; - udev_enumerate->udev = udev; + return udev_enumerate; +} - udev_list_init(udev, &udev_enumerate->devices_list, false); +static struct udev_enumerate *udev_enumerate_free(struct udev_enumerate *udev_enumerate) { + assert(udev_enumerate); - return TAKE_PTR(udev_enumerate); + udev_list_cleanup(&udev_enumerate->devices_list); + sd_device_enumerator_unref(udev_enumerate->enumerator); + return mfree(udev_enumerate); } /** @@ -88,12 +92,6 @@ _public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev) { * * Returns: the passed enumeration context **/ -_public_ struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate) { - if (udev_enumerate) - udev_enumerate->refcount++; - - return udev_enumerate; -} /** * udev_enumerate_unref: @@ -104,15 +102,7 @@ _public_ struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_e * * Returns: #NULL **/ -_public_ struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate) { - if (udev_enumerate && (-- udev_enumerate->refcount) == 0) { - udev_list_cleanup(&udev_enumerate->devices_list); - sd_device_enumerator_unref(udev_enumerate->enumerator); - free(udev_enumerate); - } - - return NULL; -} +DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(struct udev_enumerate, udev_enumerate, udev_enumerate_free); /** * udev_enumerate_get_udev: @@ -151,12 +141,11 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume int r; r = sd_device_get_syspath(device, &syspath); - if (r < 0) { - errno = -r; - return NULL; - } + if (r < 0) + return_with_errno(NULL, r); - udev_list_entry_add(&udev_enumerate->devices_list, syspath, NULL); + if (!udev_list_entry_add(&udev_enumerate->devices_list, syspath, NULL)) + return_with_errno(NULL, ENOMEM); } udev_enumerate->devices_uptodate = true; @@ -164,7 +153,7 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume e = udev_list_get_entry(&udev_enumerate->devices_list); if (!e) - errno = ENODATA; + return_with_errno(NULL, ENODATA); return e; } |