]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device-monitor: bind socket in device_monitor_new_full()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 27 May 2024 01:43:54 +0000 (10:43 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Aug 2024 02:16:33 +0000 (11:16 +0900)
Previously, device_monitor_enable_receiving() does
- update filter,
- bind socket.

But, binding socket can be done in when the socket is opened.
Let's remove device_monitor_enable_receiving() and bind the socket in
device_monitor_new_full().

src/libsystemd/sd-device/device-monitor-private.h
src/libsystemd/sd-device/device-monitor.c
src/libudev/libudev-monitor.c
src/udev/udev-manager.c

index 33e2714605255cad545b973ae35b9e61c31d46cd..96513649ff8c778768abb570d5b0d4ea432d5778 100644 (file)
@@ -16,7 +16,6 @@ typedef enum MonitorNetlinkGroup {
 int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group, int fd);
 int device_monitor_disconnect(sd_device_monitor *m);
 int device_monitor_allow_unicast_sender(sd_device_monitor *m, sd_device_monitor *sender);
-int device_monitor_enable_receiving(sd_device_monitor *m);
 int device_monitor_get_fd(sd_device_monitor *m);
 int device_monitor_send_device(sd_device_monitor *m, sd_device_monitor *destination, sd_device *device);
 int device_monitor_receive_device(sd_device_monitor *m, sd_device **ret);
index 5845932188e05e9721b5acdb300f76a646087527..69d6864f0058f473032807bfc4c155c8b252b277 100644 (file)
@@ -45,7 +45,6 @@ struct sd_device_monitor {
         int sock;
         union sockaddr_union snl;
         union sockaddr_union snl_trusted_sender;
-        bool bound;
 
         UIDRange *mapped_userns_uid_range;
 
@@ -170,17 +169,24 @@ int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group,
         *m = (sd_device_monitor) {
                 .n_ref = 1,
                 .sock = fd >= 0 ? fd : TAKE_FD(sock),
-                .bound = fd >= 0,
                 .snl.nl.nl_family = AF_NETLINK,
                 .snl.nl.nl_groups = group,
         };
 
-        if (fd >= 0) {
-                r = monitor_set_nl_address(m);
-                if (r < 0) {
-                        log_monitor_errno(m, r, "Failed to set netlink address: %m");
-                        goto fail;
-                }
+        if (fd < 0) {
+                /* enable receiving of sender credentials */
+                r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true);
+                if (r < 0)
+                        return log_monitor_errno(m, r, "Failed to set socket option SO_PASSCRED: %m");
+
+                if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0)
+                        return log_monitor_errno(m, errno, "Failed to bind monitoring socket: %m");
+        }
+
+        r = monitor_set_nl_address(m);
+        if (r < 0) {
+                log_monitor_errno(m, r, "Failed to set netlink address: %m");
+                goto fail;
         }
 
         if (DEBUG_LOGGING) {
@@ -277,9 +283,9 @@ _public_ int sd_device_monitor_start(sd_device_monitor *m, sd_device_monitor_han
                         return r;
         }
 
-        r = device_monitor_enable_receiving(m);
+        r = sd_device_monitor_filter_update(m);
         if (r < 0)
-                return r;
+                return log_monitor_errno(m, r, "Failed to update filter: %m");
 
         m->callback = callback;
         m->userdata = userdata;
@@ -354,34 +360,6 @@ _public_ int sd_device_monitor_get_description(sd_device_monitor *m, const char
         return 0;
 }
 
-int device_monitor_enable_receiving(sd_device_monitor *m) {
-        int r;
-
-        assert(m);
-
-        r = sd_device_monitor_filter_update(m);
-        if (r < 0)
-                return log_monitor_errno(m, r, "Failed to update filter: %m");
-
-        if (!m->bound) {
-                /* enable receiving of sender credentials */
-                r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true);
-                if (r < 0)
-                        return log_monitor_errno(m, r, "Failed to set socket option SO_PASSCRED: %m");
-
-                if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0)
-                        return log_monitor_errno(m, errno, "Failed to bind monitoring socket: %m");
-
-                m->bound = true;
-
-                r = monitor_set_nl_address(m);
-                if (r < 0)
-                        return log_monitor_errno(m, r, "Failed to set address: %m");
-        }
-
-        return 0;
-}
-
 static sd_device_monitor *device_monitor_free(sd_device_monitor *m) {
         assert(m);
 
index d7c931d9f929d42d47a86b744781fa869d48683c..b283154c40009d993e5aee80517a8d37ba61ef8e 100644 (file)
@@ -109,14 +109,12 @@ _public_ int udev_monitor_filter_update(struct udev_monitor *udev_monitor) {
  * udev_monitor_enable_receiving:
  * @udev_monitor: the monitor which should receive events
  *
- * Binds the @udev_monitor socket to the event source.
+ * Deprecated, and alias of udev_monitor_filter_update().
  *
  * Returns: 0 on success, otherwise a negative error value.
  */
 _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor) {
-        assert_return(udev_monitor, -EINVAL);
-
-        return device_monitor_enable_receiving(udev_monitor->monitor);
+        return udev_monitor_filter_update(udev_monitor);
 }
 
 /**
index bb94478775442a1c727e074ea96fe9a68be9814d..e44b7eb0ceb3e1dcdc438fa6c6466d29fc07edf8 100644 (file)
@@ -398,10 +398,6 @@ static int worker_spawn(Manager *manager, Event *event) {
         if (r < 0)
                 return log_error_errno(r, "Worker: Failed to set unicast sender: %m");
 
-        r = device_monitor_enable_receiving(worker_monitor);
-        if (r < 0)
-                return log_error_errno(r, "Worker: Failed to enable receiving of device: %m");
-
         r = safe_fork("(udev-worker)", FORK_DEATHSIG_SIGTERM, &pid);
         if (r < 0) {
                 event->state = EVENT_QUEUED;
@@ -1262,10 +1258,6 @@ int manager_init(Manager *manager, int fd_ctrl, int fd_uevent) {
 
         (void) sd_device_monitor_set_description(manager->monitor, "manager");
 
-        r = device_monitor_enable_receiving(manager->monitor);
-        if (r < 0)
-                return log_error_errno(r, "Failed to bind netlink socket: %m");
-
         manager->log_level = log_get_max_level();
 
         r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);