]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-varlink: introduce io.systemd.Udev.Revert method
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Apr 2025 19:58:01 +0000 (04:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 11 Apr 2025 19:55:03 +0000 (04:55 +0900)
It reverts dynamically set configurations.

src/shared/varlink-io.systemd.Udev.c
src/udev/udev-config.c
src/udev/udev-config.h
src/udev/udev-manager.c
src/udev/udev-manager.h
src/udev/udev-varlink.c

index 09c1ca70ce1dac1ab9c01e4077925b09bebbd5ba..b6cfbd3bf3bdf7b22d823d303229ce5b2db409c1 100644 (file)
@@ -17,6 +17,8 @@ static SD_VARLINK_DEFINE_METHOD(
                 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);
@@ -34,6 +36,8 @@ SD_VARLINK_DEFINE_INTERFACE(
                 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,
index 142f19e1b14aa326b58e2b02e1e71c0a9efd8a0a..d88c18ba15dcc28ba2877731988466b32b38f735 100644 (file)
@@ -463,6 +463,24 @@ int manager_load(Manager *manager, int argc, char *argv[]) {
         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);
 
@@ -473,18 +491,25 @@ UdevReloadFlags manager_reload_config(Manager *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) {
index 339d426a0f85536c945a3a89c93e94d3e299eedb..72ac3920ab411ad9a0cc690647b73cbab7d02866 100644 (file)
@@ -34,5 +34,6 @@ void manager_set_environment(Manager *manager, char * const *v);
 
 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);
index 8d27373b4522578c28200586b8919ae87c92a176..919314b54682167005dedf034b7ff03a536d1e6b 100644 (file)
@@ -311,6 +311,17 @@ void manager_reload(Manager *manager, bool force) {
         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;
index fc2df313e2582bf75196c61b45cdcf8ad266d8e2..806adb3ef801ee0ba151241a1dc3372092fa9005 100644 (file)
@@ -70,6 +70,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 
 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);
index 41f7fe08f936e51d809b091d2bcea4e219ead7bd..d0e85c263351f8ff25bf48cba403e83aeb73a2f3 100644 (file)
@@ -103,6 +103,21 @@ static int vl_method_set_environment(sd_varlink *link, sd_json_variant *paramete
         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;
@@ -183,6 +198,7 @@ int manager_start_varlink_server(Manager *manager) {
                         "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);