diff --git a/src/udev/udev-builtin-hwdb.c b/src/udev/udev-builtin-hwdb.c index b499d924793..458ce6968a3 100644 --- a/src/udev/udev-builtin-hwdb.c +++ b/src/udev/udev-builtin-hwdb.c @@ -15,7 +15,7 @@ #include "string-util.h" #include "udev-builtin.h" -static sd_hwdb *hwdb; +static sd_hwdb *hwdb = NULL; int udev_builtin_hwdb_lookup( UdevEvent *event, @@ -199,12 +199,14 @@ static int builtin_hwdb_init(void) { if (r < 0) return r; + log_debug("Loaded hardware database."); return 0; } /* called on udev shutdown and reload request */ static void builtin_hwdb_exit(void) { hwdb = sd_hwdb_unref(hwdb); + log_debug("Unloaded hardware database."); } /* called every couple of seconds during event activity; 'true' if config has changed */ diff --git a/src/udev/udev-builtin-kmod.c b/src/udev/udev-builtin-kmod.c index 96819df9895..e0553ce3e4b 100644 --- a/src/udev/udev-builtin-kmod.c +++ b/src/udev/udev-builtin-kmod.c @@ -57,12 +57,11 @@ static int builtin_kmod_init(void) { if (ctx) return 0; - log_debug("Loading kernel module index."); - r = module_setup_context(&ctx); if (r < 0) return log_error_errno(r, "Failed to initialize libkmod context: %m"); + log_debug("Loaded kernel module index."); return 0; } @@ -71,8 +70,8 @@ static void builtin_kmod_exit(void) { if (!ctx) return; - log_debug("Unload kernel module index."); ctx = sym_kmod_unref(ctx); + log_debug("Unloaded kernel module index."); } /* called every couple of seconds during event activity; 'true' if config has changed */ diff --git a/src/udev/udev-builtin-net_setup_link.c b/src/udev/udev-builtin-net_setup_link.c index 572e171e07a..0062a85db58 100644 --- a/src/udev/udev-builtin-net_setup_link.c +++ b/src/udev/udev-builtin-net_setup_link.c @@ -82,7 +82,7 @@ static int builtin_net_setup_link_init(void) { if (r < 0) return r; - log_debug("Created link configuration context."); + log_debug("Loaded link configuration context."); return 0; } 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/udev-dump.c b/src/udev/udev-dump.c index 918c966c4e1..1dcc1410427 100644 --- a/src/udev/udev-dump.c +++ b/src/udev/udev-dump.c @@ -121,7 +121,7 @@ void dump_event(UdevEvent *event, FILE *f) { ORDERED_HASHMAP_FOREACH_KEY(val, command, event->run_list) { UdevBuiltinCommand builtin_cmd = PTR_TO_UDEV_BUILTIN_CMD(val); - if (builtin_cmd != _UDEV_BUILTIN_INVALID) + if (builtin_cmd >= 0) fprintf(f, " RUN{builtin} : %s\n", command); else fprintf(f, " RUN{program} : %s\n", command); diff --git a/src/udev/udev-spawn.c b/src/udev/udev-spawn.c index 2d0f6455a57..22cb0089a44 100644 --- a/src/udev/udev-spawn.c +++ b/src/udev/udev-spawn.c @@ -343,7 +343,7 @@ void udev_event_execute_run(UdevEvent *event) { ORDERED_HASHMAP_FOREACH_KEY(val, command, event->run_list) { UdevBuiltinCommand builtin_cmd = PTR_TO_UDEV_BUILTIN_CMD(val); - if (builtin_cmd != _UDEV_BUILTIN_INVALID) { + if (builtin_cmd >= 0) { log_device_debug(event->dev, "Running built-in command \"%s\"", command); r = udev_builtin_run(event, builtin_cmd, command); if (r < 0) 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; }