chiark / gitweb /
libudev: monitor - export filter_update()
[elogind.git] / udev / lib / libudev-monitor.c
index 211aa12f62b1b770aa09edff05acfdda525ff202..c87ff7434f48dcca56aa44b69c315fd25f3c922d 100644 (file)
@@ -223,7 +223,7 @@ static inline void bpf_jmp(struct sock_filter *inss, unsigned int *i,
        (*i)++;
 }
 
-static int filter_apply(struct udev_monitor *udev_monitor)
+int udev_monitor_filter_update(struct udev_monitor *udev_monitor)
 {
        static struct sock_filter ins[256];
        static struct sock_fprog filter;
@@ -290,7 +290,7 @@ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor)
                err = bind(udev_monitor->sock,
                           (struct sockaddr *)&udev_monitor->sun, udev_monitor->addrlen);
        } else if (udev_monitor->snl.nl_family != 0) {
-               filter_apply(udev_monitor);
+               udev_monitor_filter_update(udev_monitor);
                err = bind(udev_monitor->sock,
                           (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl));
        } else {
@@ -707,3 +707,11 @@ int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_mo
                return -ENOMEM;
        return 0;
 }
+
+int udev_monitor_filter_remove(struct udev_monitor *udev_monitor)
+{
+       static struct sock_fprog filter = { 0, NULL };
+
+       udev_list_cleanup_entries(udev_monitor->udev, &udev_monitor->filter_subsystem_list);
+       return setsockopt(udev_monitor->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
+}