]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: introduce UDEV_BUILTIN_DESTRUCTOR macro
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 2 Feb 2025 03:35:38 +0000 (12:35 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 2 Feb 2025 03:36:31 +0000 (12:36 +0900)
src/udev/udev-builtin.h
src/udev/udevadm-test-builtin.c
src/udev/udevadm-test.c

index 83cf103ab5d862b03914ccedf469b4ff41ddce92..826308c9708136fa52ddfb0ee48d9a6f630eca04 100644 (file)
@@ -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);
index 382897efd46e4fcde85bbf188a0b441a4cc9d03f..fa6520df1e27dd3ee9024e5e905fd4ae096e1ce8 100644 (file)
@@ -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;
 }
index c3f56d2d81b769aa1e4e90846256eb2dd6d76576..39314c0439758ab384418303bdd5b19810b68b58 100644 (file)
@@ -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;
 }