1 /* SPDX-License-Identifier: LGPL-2.1+ */
8 #include "alloc-util.h"
9 #include "device-monitor-private.h"
10 #include "device-private.h"
11 #include "device-util.h"
12 #include "libudev-device-internal.h"
13 #include "libudev-private.h"
14 #include "string-util.h"
17 * SECTION:libudev-monitor
18 * @short_description: device event source
20 * Connects to a device event source.
26 * Opaque object handling an event source.
31 sd_device_monitor
*monitor
;
34 static MonitorNetlinkGroup
monitor_netlink_group_from_string(const char *name
) {
36 return MONITOR_GROUP_NONE
;
37 if (streq(name
, "udev"))
38 return MONITOR_GROUP_UDEV
;
39 if (streq(name
, "kernel"))
40 return MONITOR_GROUP_KERNEL
;
41 return _MONITOR_NETLINK_GROUP_INVALID
;
44 struct udev_monitor
*udev_monitor_new_from_netlink_fd(struct udev
*udev
, const char *name
, int fd
) {
45 _cleanup_(sd_device_monitor_unrefp
) sd_device_monitor
*m
= NULL
;
46 _cleanup_(udev_monitor_unrefp
) struct udev_monitor
*udev_monitor
= NULL
;
47 MonitorNetlinkGroup g
;
50 g
= monitor_netlink_group_from_string(name
);
56 r
= device_monitor_new_full(&m
, g
, fd
);
62 udev_monitor
= new(struct udev_monitor
, 1);
68 *udev_monitor
= (struct udev_monitor
) {
71 .monitor
= TAKE_PTR(m
),
74 return TAKE_PTR(udev_monitor
);
78 * udev_monitor_new_from_netlink:
79 * @udev: udev library context
80 * @name: name of event source
82 * Create new udev monitor and connect to a specified event
83 * source. Valid sources identifiers are "udev" and "kernel".
85 * Applications should usually not connect directly to the
86 * "kernel" events, because the devices might not be useable
87 * at that time, before udev has configured them, and created
88 * device nodes. Accessing devices at the same time as udev,
89 * might result in unpredictable behavior. The "udev" events
90 * are sent out after udev has finished its event processing,
91 * all rules have been processed, and needed device nodes are
94 * The initial refcount is 1, and needs to be decremented to
95 * release the resources of the udev monitor.
97 * Returns: a new udev monitor, or #NULL, in case of an error
99 _public_
struct udev_monitor
*udev_monitor_new_from_netlink(struct udev
*udev
, const char *name
) {
100 return udev_monitor_new_from_netlink_fd(udev
, name
, -1);
104 * udev_monitor_filter_update:
105 * @udev_monitor: monitor
107 * Update the installed socket filter. This is only needed,
108 * if the filter was removed or changed.
110 * Returns: 0 on success, otherwise a negative error value.
112 _public_
int udev_monitor_filter_update(struct udev_monitor
*udev_monitor
) {
113 assert_return(udev_monitor
, -EINVAL
);
115 return sd_device_monitor_filter_update(udev_monitor
->monitor
);
118 int udev_monitor_allow_unicast_sender(struct udev_monitor
*udev_monitor
, struct udev_monitor
*sender
) {
119 assert_return(udev_monitor
, -EINVAL
);
120 assert_return(sender
, -EINVAL
);
122 return device_monitor_allow_unicast_sender(udev_monitor
->monitor
, sender
->monitor
);
126 * udev_monitor_enable_receiving:
127 * @udev_monitor: the monitor which should receive events
129 * Binds the @udev_monitor socket to the event source.
131 * Returns: 0 on success, otherwise a negative error value.
133 _public_
int udev_monitor_enable_receiving(struct udev_monitor
*udev_monitor
) {
134 assert_return(udev_monitor
, -EINVAL
);
136 return device_monitor_enable_receiving(udev_monitor
->monitor
);
140 * udev_monitor_set_receive_buffer_size:
141 * @udev_monitor: the monitor which should receive events
142 * @size: the size in bytes
144 * Set the size of the kernel socket buffer. This call needs the
145 * appropriate privileges to succeed.
147 * Returns: 0 on success, otherwise -1 on error.
149 _public_
int udev_monitor_set_receive_buffer_size(struct udev_monitor
*udev_monitor
, int size
) {
150 assert_return(udev_monitor
, -EINVAL
);
152 return sd_device_monitor_set_receive_buffer_size(udev_monitor
->monitor
, (size_t) size
);
155 int udev_monitor_disconnect(struct udev_monitor
*udev_monitor
) {
156 assert(udev_monitor
);
158 return device_monitor_disconnect(udev_monitor
->monitor
);
161 static struct udev_monitor
*udev_monitor_free(struct udev_monitor
*udev_monitor
) {
162 assert(udev_monitor
);
164 sd_device_monitor_unref(udev_monitor
->monitor
);
165 return mfree(udev_monitor
);
170 * @udev_monitor: udev monitor
172 * Take a reference of a udev monitor.
174 * Returns: the passed udev monitor
178 * udev_monitor_unref:
179 * @udev_monitor: udev monitor
181 * Drop a reference of a udev monitor. If the refcount reaches zero,
182 * the bound socket will be closed, and the resources of the monitor
187 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(struct udev_monitor
, udev_monitor
, udev_monitor_free
);
190 * udev_monitor_get_udev:
191 * @udev_monitor: udev monitor
193 * Retrieve the udev library context the monitor was created with.
195 * Returns: the udev library context
197 _public_
struct udev
*udev_monitor_get_udev(struct udev_monitor
*udev_monitor
) {
198 assert_return(udev_monitor
, NULL
);
200 return udev_monitor
->udev
;
204 * udev_monitor_get_fd:
205 * @udev_monitor: udev monitor
207 * Retrieve the socket file descriptor associated with the monitor.
209 * Returns: the socket file descriptor
211 _public_
int udev_monitor_get_fd(struct udev_monitor
*udev_monitor
) {
212 assert_return(udev_monitor
, -EINVAL
);
214 return device_monitor_get_fd(udev_monitor
->monitor
);
217 int udev_monitor_receive_sd_device(struct udev_monitor
*udev_monitor
, sd_device
**ret
) {
221 assert(udev_monitor
);
224 pfd
= (struct pollfd
) {
225 .fd
= device_monitor_get_fd(udev_monitor
->monitor
),
230 /* r == 0 means a device is received but it does not pass the current filter. */
231 r
= device_monitor_receive_device(udev_monitor
->monitor
, ret
);
236 /* wait next message */
237 r
= poll(&pfd
, 1, 0);
239 if (IN_SET(errno
, EINTR
, EAGAIN
))
246 /* receive next message */
253 * udev_monitor_receive_device:
254 * @udev_monitor: udev monitor
256 * Receive data from the udev monitor socket, allocate a new udev
257 * device, fill in the received data, and return the device.
259 * Only socket connections with uid=0 are accepted.
261 * The monitor socket is by default set to NONBLOCK. A variant of poll() on
262 * the file descriptor returned by udev_monitor_get_fd() should to be used to
263 * wake up when new devices arrive, or alternatively the file descriptor
264 * switched into blocking mode.
266 * The initial refcount is 1, and needs to be decremented to
267 * release the resources of the udev device.
269 * Returns: a new udev device, or #NULL, in case of an error
271 _public_
struct udev_device
*udev_monitor_receive_device(struct udev_monitor
*udev_monitor
) {
272 _cleanup_(sd_device_unrefp
) sd_device
*device
= NULL
;
275 assert_return(udev_monitor
, NULL
);
277 r
= udev_monitor_receive_sd_device(udev_monitor
, &device
);
283 return udev_device_new(udev_monitor
->udev
, device
);
286 int udev_monitor_send_device(
287 struct udev_monitor
*udev_monitor
,
288 struct udev_monitor
*destination
,
289 struct udev_device
*udev_device
) {
290 assert(udev_monitor
);
293 return device_monitor_send_device(udev_monitor
->monitor
,
294 destination
? destination
->monitor
: NULL
,
295 udev_device
->device
);
299 * udev_monitor_filter_add_match_subsystem_devtype:
300 * @udev_monitor: the monitor
301 * @subsystem: the subsystem value to match the incoming devices against
302 * @devtype: the devtype value to match the incoming devices against
304 * This filter is efficiently executed inside the kernel, and libudev subscribers
305 * will usually not be woken up for devices which do not match.
307 * The filter must be installed before the monitor is switched to listening mode.
309 * Returns: 0 on success, otherwise a negative error value.
311 _public_
int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor
*udev_monitor
, const char *subsystem
, const char *devtype
) {
312 assert_return(udev_monitor
, -EINVAL
);
314 return sd_device_monitor_filter_add_match_subsystem_devtype(udev_monitor
->monitor
, subsystem
, devtype
);
318 * udev_monitor_filter_add_match_tag:
319 * @udev_monitor: the monitor
320 * @tag: the name of a tag
322 * This filter is efficiently executed inside the kernel, and libudev subscribers
323 * will usually not be woken up for devices which do not match.
325 * The filter must be installed before the monitor is switched to listening mode.
327 * Returns: 0 on success, otherwise a negative error value.
329 _public_
int udev_monitor_filter_add_match_tag(struct udev_monitor
*udev_monitor
, const char *tag
) {
330 assert_return(udev_monitor
, -EINVAL
);
332 return sd_device_monitor_filter_add_match_tag(udev_monitor
->monitor
, tag
);
336 * udev_monitor_filter_remove:
337 * @udev_monitor: monitor
339 * Remove all filters from monitor.
341 * Returns: 0 on success, otherwise a negative error value.
343 _public_
int udev_monitor_filter_remove(struct udev_monitor
*udev_monitor
) {
344 assert_return(udev_monitor
, -EINVAL
);
346 return sd_device_monitor_filter_remove(udev_monitor
->monitor
);