Lines Matching refs:udev_monitor
48 * udev_monitor:
52 struct udev_monitor {
95 static struct udev_monitor *udev_monitor_new(struct udev *udev)
97 struct udev_monitor *udev_monitor;
99 udev_monitor = new0(struct udev_monitor, 1);
100 if (udev_monitor == NULL)
102 udev_monitor->refcount = 1;
103 udev_monitor->udev = udev;
104 udev_list_init(udev, &udev_monitor->filter_subsystem_list, false);
105 udev_list_init(udev, &udev_monitor->filter_tag_list, true);
106 return udev_monitor;
109 static void monitor_set_nl_address(struct udev_monitor *udev_monitor) {
114 assert(udev_monitor);
120 r = getsockname(udev_monitor->sock, &snl.sa, &addrlen);
122 udev_monitor->snl.nl.nl_pid = snl.nl.nl_pid;
125 struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const char *name, int fd)
127 struct udev_monitor *udev_monitor;
158 udev_monitor = udev_monitor_new(udev);
159 if (udev_monitor == NULL)
163 udev_monitor->sock = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT);
164 if (udev_monitor->sock < 0) {
166 free(udev_monitor);
170 udev_monitor->bound = true;
171 udev_monitor->sock = fd;
172 monitor_set_nl_address(udev_monitor);
175 udev_monitor->snl.nl.nl_family = AF_NETLINK;
176 udev_monitor->snl.nl.nl_groups = group;
179 udev_monitor->snl_destination.nl.nl_family = AF_NETLINK;
180 udev_monitor->snl_destination.nl.nl_groups = UDEV_MONITOR_UDEV;
182 return udev_monitor;
207 _public_ struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name)
237 * @udev_monitor: monitor
244 _public_ int udev_monitor_filter_update(struct udev_monitor *udev_monitor)
252 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) == NULL &&
253 udev_list_get_entry(&udev_monitor->filter_tag_list) == NULL)
266 if (udev_list_get_entry(&udev_monitor->filter_tag_list) != NULL) {
271 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list))
275 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list)) {
301 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) != NULL) {
302 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_subsystem_list)) {
339 err = setsockopt(udev_monitor->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
343 int udev_monitor_allow_unicast_sender(struct udev_monitor *udev_monitor, struct udev_monitor *sender)
345 udev_monitor->snl_trusted_sender.nl.nl_pid = sender->snl.nl.nl_pid;
351 * @udev_monitor: the monitor which should receive events
353 * Binds the @udev_monitor socket to the event source.
357 _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor)
362 udev_monitor_filter_update(udev_monitor);
364 if (!udev_monitor->bound) {
365 err = bind(udev_monitor->sock,
366 &udev_monitor->snl.sa, sizeof(struct sockaddr_nl));
368 udev_monitor->bound = true;
372 monitor_set_nl_address(udev_monitor);
379 err = setsockopt(udev_monitor->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
388 * @udev_monitor: the monitor which should receive events
396 _public_ int udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size)
398 if (udev_monitor == NULL)
400 return setsockopt(udev_monitor->sock, SOL_SOCKET, SO_RCVBUFFORCE, &size, sizeof(size));
403 int udev_monitor_disconnect(struct udev_monitor *udev_monitor)
407 err = close(udev_monitor->sock);
408 udev_monitor->sock = -1;
414 * @udev_monitor: udev monitor
420 _public_ struct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor)
422 if (udev_monitor == NULL)
424 udev_monitor->refcount++;
425 return udev_monitor;
430 * @udev_monitor: udev monitor
438 _public_ struct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor)
440 if (udev_monitor == NULL)
442 udev_monitor->refcount--;
443 if (udev_monitor->refcount > 0)
445 if (udev_monitor->sock >= 0)
446 close(udev_monitor->sock);
447 udev_list_cleanup(&udev_monitor->filter_subsystem_list);
448 udev_list_cleanup(&udev_monitor->filter_tag_list);
449 free(udev_monitor);
455 * @udev_monitor: udev monitor
461 _public_ struct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor)
463 if (udev_monitor == NULL)
465 return udev_monitor->udev;
470 * @udev_monitor: udev monitor
476 _public_ int udev_monitor_get_fd(struct udev_monitor *udev_monitor)
478 if (udev_monitor == NULL)
480 return udev_monitor->sock;
483 static int passes_filter(struct udev_monitor *udev_monitor, struct udev_device *udev_device)
487 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) == NULL)
489 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_subsystem_list)) {
510 if (udev_list_get_entry(&udev_monitor->filter_tag_list) == NULL)
512 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list)) {
523 * @udev_monitor: udev monitor
540 _public_ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor)
558 if (udev_monitor == NULL)
570 buflen = recvmsg(udev_monitor->sock, &smsg, 0);
584 if (udev_monitor->snl_trusted_sender.nl.nl_pid == 0 ||
585 snl.nl.nl_pid != udev_monitor->snl_trusted_sender.nl.nl_pid) {
641 udev_device = udev_device_new_from_nulstr(udev_monitor->udev, &buf.raw[bufpos], buflen - bufpos);
651 if (!passes_filter(udev_monitor, udev_device)) {
658 pfd[0].fd = udev_monitor->sock;
669 int udev_monitor_send_device(struct udev_monitor *udev_monitor,
670 struct udev_monitor *destination, struct udev_device *udev_device)
727 smsg.msg_name = &udev_monitor->snl_destination;
729 count = sendmsg(udev_monitor->sock, &smsg, 0);
732 log_debug("passed device to netlink monitor %p", udev_monitor);
738 log_debug("passed %zi byte device to netlink monitor %p", count, udev_monitor);
744 * @udev_monitor: the monitor
755 _public_ int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, const char *subsystem, const char *devtype)
757 if (udev_monitor == NULL)
761 if (udev_list_entry_add(&udev_monitor->filter_subsystem_list, subsystem, devtype) == NULL)
768 * @udev_monitor: the monitor
778 _public_ int udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag)
780 if (udev_monitor == NULL)
784 if (udev_list_entry_add(&udev_monitor->filter_tag_list, tag, NULL) == NULL)
791 * @udev_monitor: monitor
797 _public_ int udev_monitor_filter_remove(struct udev_monitor *udev_monitor)
801 udev_list_cleanup(&udev_monitor->filter_subsystem_list);
802 return setsockopt(udev_monitor->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));