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);
int sock;
union sockaddr_union snl;
union sockaddr_union snl_trusted_sender;
- bool bound;
UIDRange *mapped_userns_uid_range;
*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) {
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;
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);
* 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);
}
/**
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;
(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);