]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: split out device_broadcast_on_error()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 May 2025 17:32:56 +0000 (02:32 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 9 May 2025 15:26:32 +0000 (00:26 +0900)
src/udev/udev-error.c
src/udev/udev-error.h
src/udev/udev-manager.c

index bc438dfaf8d038d7558b795e8326ad63ff4a4c23..ad3a03384a5b096c1dbb1bef3066499f1c9cb105 100644 (file)
@@ -1,8 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
-#include <stdlib.h>
-
+#include "device-monitor-private.h"
 #include "device-private.h"
+#include "device-util.h"
 #include "errno-list.h"
 #include "errno-util.h"
 #include "signal-util.h"
@@ -54,3 +54,24 @@ int device_add_signal(sd_device *dev, int signo) {
 
         return r;
 }
+
+int device_broadcast_on_error(sd_device *dev, sd_device_monitor *monitor) {
+        int r;
+
+        assert(dev);
+        assert(monitor);
+
+        /* delete state from disk */
+        (void) device_delete_db(dev);
+        (void) device_tag_index(dev, /* device_old = */ NULL, /* add = */ false);
+
+        r = device_monitor_send(monitor, /* destination = */ NULL, dev);
+        if (r < 0) {
+                uint64_t seqnum = 0;
+
+                (void) sd_device_get_seqnum(dev, &seqnum);
+                return log_device_warning_errno(dev, r, "Failed to broadcast event (SEQNUM=%"PRIu64") to libudev listeners: %m", seqnum);
+        }
+
+        return 0;
+}
index c55b443d43ba7bcd9de269c56b6b0f42e1b232fd..bc38004ea18a777fd9c46ca551e24030d13e0ee3 100644 (file)
@@ -6,3 +6,4 @@
 int device_add_errno(sd_device *dev, int error);
 int device_add_exit_status(sd_device *dev, int status);
 int device_add_signal(sd_device *dev, int signo);
+int device_broadcast_on_error(sd_device *dev, sd_device_monitor *monitor);
index d883e0f67208dc5335ad2b48c26f128cee6c278a..e01eef0aeb0574f57d35148cf4c2db2cac273c4e 100644 (file)
@@ -353,7 +353,6 @@ void manager_revert(Manager *manager) {
 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 r;
 
         assert(si);
 
@@ -386,14 +385,7 @@ static int on_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) {
                 assert_not_reached();
         }
 
-        /* delete state from disk */
-        device_delete_db(dev);
-        device_tag_index(dev, NULL, false);
-
-        r = device_monitor_send(worker->manager->monitor, NULL, dev);
-        if (r < 0)
-                log_device_warning_errno(dev, r, "Failed to broadcast event to libudev listeners, ignoring: %m");
-
+        (void) device_broadcast_on_error(dev, worker->manager->monitor);
         return 0;
 }