Lines Matching defs:udev_monitor

51  * udev_monitor:
55 struct udev_monitor {
98 static struct udev_monitor *udev_monitor_new(struct udev *udev)
100 struct udev_monitor *udev_monitor;
102 udev_monitor = new0(struct udev_monitor, 1);
103 if (udev_monitor == NULL)
105 udev_monitor->refcount = 1;
106 udev_monitor->udev = udev;
107 udev_list_init(udev, &udev_monitor->filter_subsystem_list, false);
108 udev_list_init(udev, &udev_monitor->filter_tag_list, true);
109 return udev_monitor;
153 static void monitor_set_nl_address(struct udev_monitor *udev_monitor) {
158 assert(udev_monitor);
164 r = getsockname(udev_monitor->sock, &snl.sa, &addrlen);
166 udev_monitor->snl.nl.nl_pid = snl.nl.nl_pid;
169 struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const char *name, int fd)
171 struct udev_monitor *udev_monitor;
202 udev_monitor = udev_monitor_new(udev);
203 if (udev_monitor == NULL)
207 udev_monitor->sock = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT);
208 if (udev_monitor->sock < 0) {
210 free(udev_monitor);
214 udev_monitor->bound = true;
215 udev_monitor->sock = fd;
216 monitor_set_nl_address(udev_monitor);
219 udev_monitor->snl.nl.nl_family = AF_NETLINK;
220 udev_monitor->snl.nl.nl_groups = group;
223 udev_monitor->snl_destination.nl.nl_family = AF_NETLINK;
224 udev_monitor->snl_destination.nl.nl_groups = UDEV_MONITOR_UDEV;
226 return udev_monitor;
251 _public_ struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name)
281 * @udev_monitor: monitor
288 _public_ int udev_monitor_filter_update(struct udev_monitor *udev_monitor)
296 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) == NULL &&
297 udev_list_get_entry(&udev_monitor->filter_tag_list) == NULL)
310 if (udev_list_get_entry(&udev_monitor->filter_tag_list) != NULL) {
315 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list))
319 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list)) {
345 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) != NULL) {
346 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_subsystem_list)) {
383 err = setsockopt(udev_monitor->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
387 int udev_monitor_allow_unicast_sender(struct udev_monitor *udev_monitor, struct udev_monitor *sender)
389 udev_monitor->snl_trusted_sender.nl.nl_pid = sender->snl.nl.nl_pid;
395 * @udev_monitor: the monitor which should receive events
397 * Binds the @udev_monitor socket to the event source.
401 _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor)
406 udev_monitor_filter_update(udev_monitor);
408 if (!udev_monitor->bound) {
409 err = bind(udev_monitor->sock,
410 &udev_monitor->snl.sa, sizeof(struct sockaddr_nl));
412 udev_monitor->bound = true;
416 monitor_set_nl_address(udev_monitor);
421 err = setsockopt(udev_monitor->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
430 * @udev_monitor: the monitor which should receive events
438 _public_ int udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size)
440 if (udev_monitor == NULL)
442 return setsockopt(udev_monitor->sock, SOL_SOCKET, SO_RCVBUFFORCE, &size, sizeof(size));
445 int udev_monitor_disconnect(struct udev_monitor *udev_monitor)
449 err = close(udev_monitor->sock);
450 udev_monitor->sock = -1;
456 * @udev_monitor: udev monitor
462 _public_ struct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor)
464 if (udev_monitor == NULL)
466 udev_monitor->refcount++;
467 return udev_monitor;
472 * @udev_monitor: udev monitor
480 _public_ struct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor)
482 if (udev_monitor == NULL)
484 udev_monitor->refcount--;
485 if (udev_monitor->refcount > 0)
487 if (udev_monitor->sock >= 0)
488 close(udev_monitor->sock);
489 udev_list_cleanup(&udev_monitor->filter_subsystem_list);
490 udev_list_cleanup(&udev_monitor->filter_tag_list);
491 free(udev_monitor);
497 * @udev_monitor: udev monitor
503 _public_ struct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor)
505 if (udev_monitor == NULL)
507 return udev_monitor->udev;
512 * @udev_monitor: udev monitor
518 _public_ int udev_monitor_get_fd(struct udev_monitor *udev_monitor)
520 if (udev_monitor == NULL)
522 return udev_monitor->sock;
525 static int passes_filter(struct udev_monitor *udev_monitor, struct udev_device *udev_device)
529 if (udev_list_get_entry(&udev_monitor->filter_subsystem_list) == NULL)
531 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_subsystem_list)) {
552 if (udev_list_get_entry(&udev_monitor->filter_tag_list) == NULL)
554 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_monitor->filter_tag_list)) {
565 * @udev_monitor: udev monitor
582 _public_ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor)
600 if (udev_monitor == NULL)
612 buflen = recvmsg(udev_monitor->sock, &smsg, 0);
626 if (udev_monitor->snl_trusted_sender.nl.nl_pid == 0 ||
627 snl.nl.nl_pid != udev_monitor->snl_trusted_sender.nl.nl_pid) {
683 udev_device = udev_device_new_from_nulstr(udev_monitor->udev, &buf.raw[bufpos], buflen - bufpos);
693 if (!passes_filter(udev_monitor, udev_device)) {
700 pfd[0].fd = udev_monitor->sock;
711 int udev_monitor_send_device(struct udev_monitor *udev_monitor,
712 struct udev_monitor *destination, struct udev_device *udev_device)
769 smsg.msg_name = &udev_monitor->snl_destination;
771 count = sendmsg(udev_monitor->sock, &smsg, 0);
774 log_debug("passed device to netlink monitor %p", udev_monitor);
780 log_debug("passed %zi byte device to netlink monitor %p", count, udev_monitor);
786 * @udev_monitor: the monitor
797 _public_ int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, const char *subsystem, const char *devtype)
799 if (udev_monitor == NULL)
803 if (udev_list_entry_add(&udev_monitor->filter_subsystem_list, subsystem, devtype) == NULL)
810 * @udev_monitor: the monitor
820 _public_ int udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag)
822 if (udev_monitor == NULL)
826 if (udev_list_entry_add(&udev_monitor->filter_tag_list, tag, NULL) == NULL)
833 * @udev_monitor: monitor
839 _public_ int udev_monitor_filter_remove(struct udev_monitor *udev_monitor)
843 udev_list_cleanup(&udev_monitor->filter_subsystem_list);
844 return setsockopt(udev_monitor->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));