It reverts dynamically set configurations.
SD_VARLINK_FIELD_COMMENT("An array of global udev property assignments. Each string must be in KEY=VALUE style."),
SD_VARLINK_DEFINE_INPUT(assignments, SD_VARLINK_STRING, SD_VARLINK_ARRAY));
+static SD_VARLINK_DEFINE_METHOD(Revert);
+
static SD_VARLINK_DEFINE_METHOD(StartExecQueue);
static SD_VARLINK_DEFINE_METHOD(StopExecQueue);
SD_VARLINK_SYMBOL_COMMENT("Sets the global udev properties."),
&vl_method_SetEnvironment,
SD_VARLINK_SYMBOL_COMMENT("Starts processing of queued events."),
+ &vl_method_Revert,
+ SD_VARLINK_SYMBOL_COMMENT("Revert previously set configurations."),
&vl_method_StartExecQueue,
SD_VARLINK_SYMBOL_COMMENT("Stops processing of queued events."),
&vl_method_StopExecQueue,
return 1;
}
+static UdevReloadFlags manager_needs_reload(Manager *manager, const UdevConfig *old) {
+ assert(manager);
+ assert(old);
+
+ if (manager->config.resolve_name_timing != old->resolve_name_timing)
+ return UDEV_RELOAD_RULES | UDEV_RELOAD_KILL_WORKERS;
+
+ if (manager->config.log_level != old->log_level ||
+ manager->config.exec_delay_usec != old->exec_delay_usec ||
+ manager->config.timeout_usec != old->timeout_usec ||
+ manager->config.timeout_signal != old->timeout_signal ||
+ manager->config.blockdev_read_only != old->blockdev_read_only ||
+ manager->config.trace != old->trace)
+ return UDEV_RELOAD_KILL_WORKERS;
+
+ return 0;
+}
+
UdevReloadFlags manager_reload_config(Manager *manager) {
assert(manager);
manager_merge_config(manager);
manager_adjust_config(&manager->config);
- if (manager->config.resolve_name_timing != old.resolve_name_timing)
- return UDEV_RELOAD_RULES | UDEV_RELOAD_KILL_WORKERS;
+ return manager_needs_reload(manager, &old);
+}
- if (manager->config.log_level != old.log_level ||
- manager->config.exec_delay_usec != old.exec_delay_usec ||
- manager->config.timeout_usec != old.timeout_usec ||
- manager->config.timeout_signal != old.timeout_signal ||
- manager->config.blockdev_read_only != old.blockdev_read_only ||
- manager->config.trace != old.trace)
- return UDEV_RELOAD_KILL_WORKERS;
+UdevReloadFlags manager_revert_config(Manager *manager) {
+ assert(manager);
- return 0;
+ UdevReloadFlags flags = 0;
+ if (!hashmap_isempty(manager->properties)) {
+ flags |= UDEV_RELOAD_KILL_WORKERS;
+ manager->properties = hashmap_free(manager->properties);
+ }
+
+ UdevConfig old = manager->config;
+
+ manager->config_by_control = UDEV_CONFIG_INIT;
+ manager_merge_config(manager);
+ manager_adjust_config(&manager->config);
+
+ return flags | manager_needs_reload(manager, &old);
}
static usec_t extra_timeout_usec(void) {
int manager_load(Manager *manager, int argc, char *argv[]);
UdevReloadFlags manager_reload_config(Manager *manager);
+UdevReloadFlags manager_revert_config(Manager *manager);
usec_t manager_kill_worker_timeout(Manager *manager);
notify_ready(manager);
}
+void manager_revert(Manager *manager) {
+ assert(manager);
+
+ UdevReloadFlags flags = manager_revert_config(manager);
+ if (flags == 0)
+ return;
+
+ assert(flags == UDEV_RELOAD_KILL_WORKERS);
+ manager_kill_workers(manager, SIGTERM);
+}
+
static int on_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) {
_cleanup_(worker_freep) Worker *worker = ASSERT_PTR(userdata);
sd_device *dev = worker->event ? ASSERT_PTR(worker->event->dev) : NULL;
int manager_main(Manager *manager);
void manager_reload(Manager *manager, bool force);
+void manager_revert(Manager *manager);
void manager_exit(Manager *manager);
void notify_ready(Manager *manager);
return sd_varlink_reply(link, NULL);
}
+static int vl_method_revert(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
+ Manager *manager = ASSERT_PTR(userdata);
+ int r;
+
+ assert(link);
+
+ r = sd_varlink_dispatch(link, parameters, /* dispatch_table = */ NULL, /* userdata = */ NULL);
+ if (r != 0)
+ return r;
+
+ log_debug("Received io.systemd.Udev.Revert()");
+ manager_revert(manager);
+ return sd_varlink_reply(link, NULL);
+}
+
static int vl_method_start_stop_exec_queue(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
Manager *manager = ASSERT_PTR(userdata);
const char *method;
"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.Revert", vl_method_revert,
"io.systemd.Udev.StartExecQueue", vl_method_start_stop_exec_queue,
"io.systemd.Udev.StopExecQueue", vl_method_start_stop_exec_queue,
"io.systemd.Udev.Exit", vl_method_exit);