]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: introduce sd_netlink_attach_filter()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 18 Oct 2021 17:41:38 +0000 (02:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Oct 2021 11:41:09 +0000 (20:41 +0900)
src/libsystemd/sd-netlink/sd-netlink.c
src/systemd/sd-netlink.h

index 2bf26523bdeafbd3b9a003b86e08ae42efa3d9e9..9de13f4c46d8931fd33e891cd161a3e76e2187a8 100644 (file)
@@ -1023,3 +1023,18 @@ int sd_netlink_add_match(
         return netlink_add_match_internal(rtnl, ret_slot, groups, n_groups, type, 0, callback,
                                           destroy_callback, userdata, description);
 }
+
+int sd_netlink_attach_filter(sd_netlink *nl, size_t len, struct sock_filter *filter) {
+        assert_return(nl, -EINVAL);
+        assert_return(len == 0 || filter, -EINVAL);
+
+        if (setsockopt(nl->fd, SOL_SOCKET,
+                       len == 0 ? SO_DETACH_FILTER : SO_ATTACH_FILTER,
+                       &(struct sock_fprog) {
+                               .len = len,
+                               .filter = filter,
+                       }, sizeof(struct sock_fprog)) < 0)
+                return -errno;
+
+        return 0;
+}
index fdf802041a9da1323284212a69342e501535b906..66a1bb6a33f7f502eeb0410419c3994d426b2043 100644 (file)
@@ -21,6 +21,7 @@
 #include <inttypes.h>
 #include <net/ethernet.h>
 #include <netinet/in.h>
+#include <linux/filter.h>
 #include <linux/neighbour.h>
 #include <linux/rtnetlink.h>
 
@@ -68,6 +69,7 @@ int sd_netlink_add_match(sd_netlink *nl, sd_netlink_slot **ret_slot, uint16_t ma
 
 int sd_netlink_attach_event(sd_netlink *nl, sd_event *e, int64_t priority);
 int sd_netlink_detach_event(sd_netlink *nl);
+int sd_netlink_attach_filter(sd_netlink *nl, size_t len, struct sock_filter *filter);
 
 /* message */
 int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data);