]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: add generic socket_pass_pktinfo() helper
authorLennart Poettering <lennart@poettering.net>
Wed, 27 May 2020 17:27:51 +0000 (19:27 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 27 May 2020 20:39:34 +0000 (22:39 +0200)
The helper turns on the protocol specific "packet info" structure cmsg
for three relevant protocols we know.

src/basic/socket-util.c
src/basic/socket-util.h

index 0be098df2ea1e411310c3dec500ded5bd0051003..05dd7e70014fc836052979113e4ad90ce81854ee 100644 (file)
@@ -1174,5 +1174,27 @@ ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags) {
         }
 
         return n;
+}
+
+int socket_pass_pktinfo(int fd, bool b) {
+        int af;
+        socklen_t sl = sizeof(af);
+
+        if (getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &af, &sl) < 0)
+                return -errno;
+
+        switch (af) {
+
+        case AF_INET:
+                return setsockopt_int(fd, IPPROTO_IP, IP_PKTINFO, b);
 
+        case AF_INET6:
+                return setsockopt_int(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, b);
+
+        case AF_NETLINK:
+                return setsockopt_int(fd, SOL_NETLINK, NETLINK_PKTINFO, b);
+
+        default:
+                return -EAFNOSUPPORT;
+        }
 }
index 6f366c042998184d190f0bd8222a321c388b71e0..9e02e398875480396669fd598c27df015c8ac299 100644 (file)
@@ -220,3 +220,5 @@ int socket_bind_to_ifname(int fd, const char *ifname);
 int socket_bind_to_ifindex(int fd, int ifindex);
 
 ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags);
+
+int socket_pass_pktinfo(int fd, bool b);