diff --git a/src/shared/varlink-io.systemd.Udev.c b/src/shared/varlink-io.systemd.Udev.c index fb34036b426..09c1ca70ce1 100644 --- a/src/shared/varlink-io.systemd.Udev.c +++ b/src/shared/varlink-io.systemd.Udev.c @@ -2,6 +2,11 @@ #include "varlink-io.systemd.Udev.h" +static SD_VARLINK_DEFINE_METHOD( + SetTrace, + SD_VARLINK_FIELD_COMMENT("Enable/disable."), + SD_VARLINK_DEFINE_INPUT(enable, SD_VARLINK_BOOL, 0)); + static SD_VARLINK_DEFINE_METHOD( SetChildrenMax, SD_VARLINK_FIELD_COMMENT("The maximum number of child processes. When 0 is specified, the maximum is determined based on the system resources."), @@ -22,6 +27,8 @@ SD_VARLINK_DEFINE_INTERFACE( io_systemd_Udev, "io.systemd.Udev", SD_VARLINK_INTERFACE_COMMENT("An interface for controlling systemd-udevd."), + SD_VARLINK_SYMBOL_COMMENT("Enable/disable trace logging."), + &vl_method_SetTrace, SD_VARLINK_SYMBOL_COMMENT("Sets the maximum number of child processes."), &vl_method_SetChildrenMax, SD_VARLINK_SYMBOL_COMMENT("Sets the global udev properties."), diff --git a/src/udev/udev-config.c b/src/udev/udev-config.c index 19d57526db0..6f02d25f455 100644 --- a/src/udev/udev-config.c +++ b/src/udev/udev-config.c @@ -345,6 +345,21 @@ void manager_set_log_level(Manager *manager, int log_level) { manager_kill_workers(manager, /* force = */ false); } +void manager_set_trace(Manager *manager, bool enable) { + assert(manager); + + bool old = manager->config.trace; + + manager->config_by_control.trace = enable; + manager_merge_config_log_level(manager); + + if (manager->config.trace == old) + return; + + log_set_max_level(manager->config.log_level); + manager_kill_workers(manager, /* force = */ false); +} + static void manager_adjust_config(UdevConfig *config) { assert(config); diff --git a/src/udev/udev-config.h b/src/udev/udev-config.h index 9e8a48dae2a..fd31979f6d7 100644 --- a/src/udev/udev-config.h +++ b/src/udev/udev-config.h @@ -29,6 +29,7 @@ typedef struct UdevConfig { void manager_set_children_max(Manager *manager, unsigned n); void manager_set_log_level(Manager *manager, int log_level); +void manager_set_trace(Manager *manager, bool enable); void manager_set_environment(Manager *manager, char * const *v); int manager_load(Manager *manager, int argc, char *argv[]); diff --git a/src/udev/udev-varlink.c b/src/udev/udev-varlink.c index 5d1a27219f5..41f7fe08f93 100644 --- a/src/udev/udev-varlink.c +++ b/src/udev/udev-varlink.c @@ -43,6 +43,26 @@ static int vl_method_set_log_level(sd_varlink *link, sd_json_variant *parameters return sd_varlink_reply(link, NULL); } +static int vl_method_set_trace(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) { + bool enable; + int r; + + static const sd_json_dispatch_field dispatch_table[] = { + { "enable", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, 0, SD_JSON_MANDATORY }, + {} + }; + + assert(link); + + r = sd_varlink_dispatch(link, parameters, dispatch_table, &enable); + if (r != 0) + return r; + + log_debug("Received io.systemd.service.SetTrace(%s)", yes_no(enable)); + manager_set_trace(userdata, enable); + return sd_varlink_reply(link, NULL); +} + static int vl_method_set_children_max(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) { unsigned n; int r; @@ -160,6 +180,7 @@ int manager_start_varlink_server(Manager *manager) { "io.systemd.service.Reload", vl_method_reload, "io.systemd.service.SetLogLevel", vl_method_set_log_level, "io.systemd.service.GetEnvironment", varlink_method_get_environment, + "io.systemd.Udev.SetTrace", vl_method_set_trace, "io.systemd.Udev.SetChildrenMax", vl_method_set_children_max, "io.systemd.Udev.SetEnvironment", vl_method_set_environment, "io.systemd.Udev.StartExecQueue", vl_method_start_stop_exec_queue,