1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
8 #include "alloc-util.h"
9 #include "device-monitor-private.h"
10 #include "errno-util.h"
12 #include "libudev-device-internal.h"
13 #include "string-util.h"
16 * SECTION:libudev-monitor
17 * @short_description: device event source
19 * Connects to a device event source.
25 * Opaque object handling an event source.
30 sd_device_monitor
*monitor
;
33 static MonitorNetlinkGroup
monitor_netlink_group_from_string(const char *name
) {
35 return MONITOR_GROUP_NONE
;
36 if (streq(name
, "udev"))
37 return MONITOR_GROUP_UDEV
;
38 if (streq(name
, "kernel"))
39 return MONITOR_GROUP_KERNEL
;
40 return _MONITOR_NETLINK_GROUP_INVALID
;
44 * udev_monitor_new_from_netlink:
45 * @udev: udev library context
46 * @name: name of event source
48 * Create new udev monitor and connect to a specified event
49 * source. Valid sources identifiers are "udev" and "kernel".
51 * Applications should usually not connect directly to the
52 * "kernel" events, because the devices might not be usable
53 * at that time, before udev has configured them, and created
54 * device nodes. Accessing devices at the same time as udev,
55 * might result in unpredictable behavior. The "udev" events
56 * are sent out after udev has finished its event processing,
57 * all rules have been processed, and needed device nodes are
60 * The initial refcount is 1, and needs to be decremented to
61 * release the resources of the udev monitor.
63 * Returns: a new udev monitor, or #NULL, in case of an error
65 _public_
struct udev_monitor
* udev_monitor_new_from_netlink(struct udev
*udev
, const char *name
) {
66 _cleanup_(sd_device_monitor_unrefp
) sd_device_monitor
*m
= NULL
;
67 struct udev_monitor
*udev_monitor
;
68 MonitorNetlinkGroup g
;
71 g
= monitor_netlink_group_from_string(name
);
73 return_with_errno(NULL
, EINVAL
);
75 r
= device_monitor_new_full(&m
, g
, -EBADF
);
77 return_with_errno(NULL
, r
);
79 udev_monitor
= new(struct udev_monitor
, 1);
81 return_with_errno(NULL
, ENOMEM
);
83 *udev_monitor
= (struct udev_monitor
) {
86 .monitor
= TAKE_PTR(m
),
93 * udev_monitor_filter_update:
94 * @udev_monitor: monitor
96 * Update the installed socket filter. This is only needed,
97 * if the filter was removed or changed.
99 * Returns: 0 on success, otherwise a negative error value.
101 _public_
int udev_monitor_filter_update(struct udev_monitor
*udev_monitor
) {
102 assert_return(udev_monitor
, -EINVAL
);
104 return sd_device_monitor_filter_update(udev_monitor
->monitor
);
108 * udev_monitor_enable_receiving:
109 * @udev_monitor: the monitor which should receive events
111 * Deprecated, and alias of udev_monitor_filter_update().
113 * Returns: 0 on success, otherwise a negative error value.
115 _public_
int udev_monitor_enable_receiving(struct udev_monitor
*udev_monitor
) {
116 return udev_monitor_filter_update(udev_monitor
);
120 * udev_monitor_set_receive_buffer_size:
121 * @udev_monitor: the monitor which should receive events
122 * @size: the size in bytes
124 * Set the size of the kernel socket buffer. This call needs the
125 * appropriate privileges to succeed.
127 * Returns: 0 on success, otherwise -1 on error.
129 _public_
int udev_monitor_set_receive_buffer_size(struct udev_monitor
*udev_monitor
, int size
) {
130 assert_return(udev_monitor
, -EINVAL
);
132 return sd_device_monitor_set_receive_buffer_size(udev_monitor
->monitor
, (size_t) size
);
135 static struct udev_monitor
* udev_monitor_free(struct udev_monitor
*udev_monitor
) {
136 assert(udev_monitor
);
138 sd_device_monitor_unref(udev_monitor
->monitor
);
139 return mfree(udev_monitor
);
144 * @udev_monitor: udev monitor
146 * Take a reference of a udev monitor.
148 * Returns: the passed udev monitor
152 * udev_monitor_unref:
153 * @udev_monitor: udev monitor
155 * Drop a reference of a udev monitor. If the refcount reaches zero,
156 * the bound socket will be closed, and the resources of the monitor
161 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(struct udev_monitor
, udev_monitor
, udev_monitor_free
);
164 * udev_monitor_get_udev:
165 * @udev_monitor: udev monitor
167 * Retrieve the udev library context the monitor was created with.
169 * Returns: the udev library context
171 _public_
struct udev
* udev_monitor_get_udev(struct udev_monitor
*udev_monitor
) {
172 assert_return(udev_monitor
, NULL
);
174 return udev_monitor
->udev
;
178 * udev_monitor_get_fd:
179 * @udev_monitor: udev monitor
181 * Retrieve the socket file descriptor associated with the monitor.
183 * Returns: the socket file descriptor
185 _public_
int udev_monitor_get_fd(struct udev_monitor
*udev_monitor
) {
186 assert_return(udev_monitor
, -EINVAL
);
188 return sd_device_monitor_get_fd(udev_monitor
->monitor
);
191 static int udev_monitor_receive_sd_device(struct udev_monitor
*udev_monitor
, sd_device
**ret
) {
194 assert(udev_monitor
);
198 /* r == 0 means a device is received but it does not pass the current filter. */
199 r
= sd_device_monitor_receive(udev_monitor
->monitor
, ret
);
204 /* Wait for next message */
205 r
= fd_wait_for_event(sd_device_monitor_get_fd(udev_monitor
->monitor
), POLLIN
, 0);
213 /* Receive next message */
220 * udev_monitor_receive_device:
221 * @udev_monitor: udev monitor
223 * Receive data from the udev monitor socket, allocate a new udev
224 * device, fill in the received data, and return the device.
226 * Only socket connections with uid=0 are accepted.
228 * The monitor socket is by default set to NONBLOCK. A variant of poll() on
229 * the file descriptor returned by udev_monitor_get_fd() should to be used to
230 * wake up when new devices arrive, or alternatively the file descriptor
231 * switched into blocking mode.
233 * The initial refcount is 1, and needs to be decremented to
234 * release the resources of the udev device.
236 * Returns: a new udev device, or #NULL, in case of an error
238 _public_
struct udev_device
* udev_monitor_receive_device(struct udev_monitor
*udev_monitor
) {
239 _cleanup_(sd_device_unrefp
) sd_device
*device
= NULL
;
242 assert_return(udev_monitor
, NULL
);
244 r
= udev_monitor_receive_sd_device(udev_monitor
, &device
);
246 return_with_errno(NULL
, r
);
248 return udev_device_new(udev_monitor
->udev
, device
);
252 * udev_monitor_filter_add_match_subsystem_devtype:
253 * @udev_monitor: the monitor
254 * @subsystem: the subsystem value to match the incoming devices against
255 * @devtype: the devtype value to match the incoming devices against
257 * This filter is efficiently executed inside the kernel, and libudev subscribers
258 * will usually not be woken up for devices which do not match.
260 * The filter must be installed before the monitor is switched to listening mode.
262 * Returns: 0 on success, otherwise a negative error value.
264 _public_
int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor
*udev_monitor
, const char *subsystem
, const char *devtype
) {
267 assert_return(udev_monitor
, -EINVAL
);
269 r
= sd_device_monitor_filter_add_match_subsystem_devtype(udev_monitor
->monitor
, subsystem
, devtype
);
270 return r
< 0 ? r
: 0;
274 * udev_monitor_filter_add_match_tag:
275 * @udev_monitor: the monitor
276 * @tag: the name of a tag
278 * This filter is efficiently executed inside the kernel, and libudev subscribers
279 * will usually not be woken up for devices which do not match.
281 * The filter must be installed before the monitor is switched to listening mode.
283 * Returns: 0 on success, otherwise a negative error value.
285 _public_
int udev_monitor_filter_add_match_tag(struct udev_monitor
*udev_monitor
, const char *tag
) {
288 assert_return(udev_monitor
, -EINVAL
);
290 r
= sd_device_monitor_filter_add_match_tag(udev_monitor
->monitor
, tag
);
291 return r
< 0 ? r
: 0;
295 * udev_monitor_filter_remove:
296 * @udev_monitor: monitor
298 * Remove all filters from monitor.
300 * Returns: 0 on success, otherwise a negative error value.
302 _public_
int udev_monitor_filter_remove(struct udev_monitor
*udev_monitor
) {
303 assert_return(udev_monitor
, -EINVAL
);
305 return sd_device_monitor_filter_remove(udev_monitor
->monitor
);