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);
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;
}
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);
puts("");
dump_event(event, NULL);
- r = 0;
-out:
- udev_builtin_exit();
- return r;
+ return 0;
}