swrap: Implement support for IP_RECVDSTADDR on BSD.
authorAndreas Schneider <asn@samba.org>
Tue, 3 Jun 2014 13:02:17 +0000 (15:02 +0200)
committerMichael Adam <obnox@samba.org>
Thu, 5 Jun 2014 21:57:10 +0000 (23:57 +0200)
Pair-Programmed-With: Michael Adam <obnox@samba.org>
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
lib/socket_wrapper/socket_wrapper.c

index 56d1d966a0aa32b706d07dd12108f8953c5e2f64..7a0b63ca61fa4c2f5db226ed5cfaf665598ab647 100644 (file)
@@ -125,6 +125,18 @@ enum swrap_dbglvl_e {
 # endif /* IPV6_RECVPKTINFO */
 #endif /* IPV6_PKTINFO */
 
+/*
+ * On BSD IP_PKTINFO has a different name because during
+ * the time when they implemented it, there was no RFC.
+ * The name for IPv6 is the same as on Linux.
+ */
+#ifndef IP_PKTINFO
+# ifdef IP_RECVDSTADDR
+#  define IP_PKTINFO IP_RECVDSTADDR
+# endif
+#endif
+
+
 #define SWRAP_DLIST_ADD(list,item) do { \
        if (!(list)) { \
                (item)->prev    = NULL; \
@@ -3053,10 +3065,15 @@ static int swrap_msghdr_add_pktinfo(struct socket_info *si,
 {
        /* Add packet info */
        switch (si->pktinfo) {
-#if defined(IP_PKTINFO) && defined(HAVE_STRUCT_IN_PKTINFO)
+#if defined(IP_PKTINFO)
+/* && (defined(HAVE_STRUCT_IN_PKTINFO) || defined(IP_RECVDSTADDR)) */
        case AF_INET: {
                struct sockaddr_in *sin;
+#if defined(HAVE_STRUCT_IN_PKTINFO)
                struct in_pktinfo pkt;
+#elif defined(IP_RECVDSTADDR)
+               struct in_addr pkt;
+#endif
 
                if (si->bindname_len == sizeof(struct sockaddr_in)) {
                        sin = (struct sockaddr_in*)si->bindname;
@@ -3069,8 +3086,12 @@ static int swrap_msghdr_add_pktinfo(struct socket_info *si,
 
                ZERO_STRUCT(pkt);
 
+#if defined(HAVE_STRUCT_IN_PKTINFO)
                pkt.ipi_ifindex = socket_wrapper_default_iface();
                pkt.ipi_addr.s_addr = sin->sin_addr.s_addr;
+#elif defined(IP_RECVDSTADDR)
+               pkt = sin->sin_addr;
+#endif
 
                swrap_msghdr_add_cmsghdr(msg, IPPROTO_IP, IP_PKTINFO,
                                         &pkt, sizeof(pkt));