From: Yu Watanabe Date: Sun, 2 Feb 2025 03:35:38 +0000 (+0900) Subject: udev: introduce UDEV_BUILTIN_DESTRUCTOR macro X-Git-Tag: v258-rc1~1414^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1a85468768d7e7499321bb2d69dc8308c1f5e8b6;p=thirdparty%2Fsystemd.git udev: introduce UDEV_BUILTIN_DESTRUCTOR macro --- diff --git a/src/udev/udev-builtin.h b/src/udev/udev-builtin.h index 83cf103ab5d..826308c9708 100644 --- a/src/udev/udev-builtin.h +++ b/src/udev/udev-builtin.h @@ -54,6 +54,15 @@ extern const UdevBuiltin udev_builtin_usb_id; void udev_builtin_init(void); void udev_builtin_exit(void); +static inline void udev_builtin_exitp(bool *p) { + if (*ASSERT_PTR(p)) + udev_builtin_exit(); +} +#define _UDEV_BUILTIN_DESTRUCTOR(u) \ + _unused_ _cleanup_(udev_builtin_exitp) bool v = true; +#define UDEV_BUILTIN_DESTRUCTOR \ + _UDEV_BUILTIN_DESTRUCTOR(UNIQ_T(builtin_destructor, UNIQ)) + UdevBuiltinCommand udev_builtin_lookup(const char *command); const char* udev_builtin_name(UdevBuiltinCommand cmd); bool udev_builtin_run_once(UdevBuiltinCommand cmd); diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c index 382897efd46..fa6520df1e2 100644 --- a/src/udev/udevadm-test-builtin.c +++ b/src/udev/udevadm-test-builtin.c @@ -87,42 +87,30 @@ int builtin_main(int argc, char *argv[], void *userdata) { return r; udev_builtin_init(); + UDEV_BUILTIN_DESTRUCTOR; cmd = udev_builtin_lookup(arg_command); - if (cmd < 0) { - r = log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown command '%s'", arg_command); - goto finish; - } + if (cmd < 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown command '%s'", arg_command); r = find_device_with_action(arg_syspath, arg_action, &dev); - if (r < 0) { - log_error_errno(r, "Failed to open device '%s': %m", arg_syspath); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to open device '%s': %m", arg_syspath); event = udev_event_new(dev, NULL, EVENT_UDEVADM_TEST_BUILTIN); - if (!event) { - r = log_oom(); - goto finish; - } + if (!event) + return log_oom(); if (arg_action != SD_DEVICE_REMOVE) { /* For net_setup_link */ r = device_clone_with_db(dev, &event->dev_db_clone); - if (r < 0) { - log_device_error_errno(dev, r, "Failed to clone device: %m"); - goto finish; - } + if (r < 0) + return log_device_error_errno(dev, r, "Failed to clone device: %m"); } r = udev_builtin_run(event, cmd, arg_command); - if (r < 0) { - log_debug_errno(r, "Builtin command '%s' fails: %m", arg_command); - goto finish; - } + if (r < 0) + return log_debug_errno(r, "Builtin command '%s' fails: %m", arg_command); - r = 0; -finish: - udev_builtin_exit(); - return r; + return 0; } diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index c3f56d2d81b..39314c04397 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -125,30 +125,25 @@ int test_main(int argc, char *argv[], void *userdata) { puts("\nLoading builtins..."); udev_builtin_init(); + UDEV_BUILTIN_DESTRUCTOR; puts("Loading builtins done."); puts("\nLoading udev rules files..."); r = udev_rules_load(&rules, arg_resolve_name_timing, arg_extra_rules_dir); - if (r < 0) { - log_error_errno(r, "Failed to read udev rules: %m"); - goto out; - } + if (r < 0) + return log_error_errno(r, "Failed to read udev rules: %m"); puts("Loading udev rules files done."); r = find_device_with_action(arg_syspath, arg_action, &dev); - if (r < 0) { - log_error_errno(r, "Failed to open device '%s': %m", arg_syspath); - goto out; - } + if (r < 0) + return log_error_errno(r, "Failed to open device '%s': %m", arg_syspath); /* don't read info from the db */ device_seal(dev); event = udev_event_new(dev, NULL, EVENT_UDEVADM_TEST); - if (!event) { - log_oom(); - goto out; - } + if (!event) + return log_oom(); event->trace = arg_verbose; assert_se(sigfillset(&mask) >= 0); @@ -161,8 +156,5 @@ int test_main(int argc, char *argv[], void *userdata) { puts(""); dump_event(event, NULL); - r = 0; -out: - udev_builtin_exit(); - return r; + return 0; }