]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Try to get it working for v6, too
authorAlan T. DeKok <aland@freeradius.org>
Thu, 16 Dec 2010 13:57:12 +0000 (14:57 +0100)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 16 Dec 2010 13:57:12 +0000 (14:57 +0100)
src/lib/udpfromto.c

index 27cff0599bb9ab547cf50622699f0991b231980b..c0f2ebb6effa86ebc0b83ef97dc9236ebff3d86c 100644 (file)
 #include <freeradius-devel/ident.h>
 RCSID("$Id$")
 
-#ifdef WITH_UDPFROMTO
-
 #include <freeradius-devel/udpfromto.h>
 
+#ifdef WITH_UDPFROMTO
+
 #ifdef HAVE_SYS_UIO_H
 #include <sys/uio.h>
 #endif
@@ -145,12 +145,12 @@ int recvfromto(int s, void *buf, size_t len, int flags,
        struct sockaddr_storage si;
        socklen_t si_len = sizeof(si);
 
-#if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR) && !defined (IN6_PKTINFO)
+#if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR) && !defined (IPV6_PKTINFO)
        /*
         *      If the recvmsg() flags aren't defined, fall back to
         *      using recvfrom().
         */
-       to = NULL;
+       to = NULL:
 #endif
 
        /*
@@ -158,7 +158,6 @@ int recvfromto(int s, void *buf, size_t len, int flags,
         */
        if (!to || !tolen) return recvfrom(s, buf, len, flags, from, fromlen);
 
-
        /*
         *      recvmsg doesn't provide sin_port so we have to
         *      retrieve it using getsockname().
@@ -172,6 +171,9 @@ int recvfromto(int s, void *buf, size_t len, int flags,
         *      with a more specific address given by recvmsg(), below.
         */
        if (si.ss_family == AF_INET) {
+#if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR)
+               return recvfrom(s, buf, len, flags, from, fromlen);
+#else
                struct sockaddr_in *dst = (struct sockaddr_in *) to;
                struct sockaddr_in *src = (struct sockaddr_in *) &si;
                
@@ -181,17 +183,14 @@ int recvfromto(int s, void *buf, size_t len, int flags,
                }
                *tolen = sizeof(*dst);
                *dst = *src;
-
-#if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR)
-               /*
-                *      recvmsg() flags aren't defined.  Use recvfrom()
-                */
-               return recvfrom(s, buf, len, flags, from, fromlen);
 #endif
        }
 
 #ifdef AF_INET6
        else if (si.ss_family == AF_INET6) {
+#if !defined(IPV6_PKTINFO)
+               return recvfrom(s, buf, len, flags, from, fromlen);
+#else
                struct sockaddr_in6 *dst = (struct sockaddr_in6 *) to;
                struct sockaddr_in6 *src = (struct sockaddr_in6 *) &si;
                
@@ -201,12 +200,6 @@ int recvfromto(int s, void *buf, size_t len, int flags,
                }
                *tolen = sizeof(*dst);
                *dst = *src;
-
-#if !defined(IN6_PKTINFO)
-               /*
-                *      recvmsg() flags aren't defined.  Use recvfrom()
-                */
-               return recvfrom(s, buf, len, flags, from, fromlen);
 #endif
        }
 #endif
@@ -287,7 +280,7 @@ int sendfromto(int s, void *buf, size_t len, int flags,
        struct iovec iov;
        char cbuf[256];
 
-#if !defined(IP_PKTINFO) && !defined(IP_SENDSRCADDR) && !defined(IN6_PKTINFO)
+#if !defined(IP_PKTINFO) && !defined(IP_SENDSRCADDR) && !defined(IPV6_PKTINFO)
        /*
         *      If the sendmsg() flags aren't defined, fall back to
         *      using sendto().
@@ -312,9 +305,10 @@ int sendfromto(int s, void *buf, size_t len, int flags,
        msgh.msg_namelen = tolen;
 
        if (from->sa_family == AF_INET) {
-#if defined(IP_PKTINFO) || defined(IP_SENDSRCADDR)
+#if !defined(IP_PKTINFO) && !defined(IP_SENDSRCADDR)
+               return sendto(s, buf, len, flags, to, tolen);
+#else
                struct sockaddr_in *s4 = (struct sockaddr_in *) from;
-#endif
 
 #ifdef IP_PKTINFO
                struct in_pktinfo *pkt;
@@ -346,11 +340,14 @@ int sendfromto(int s, void *buf, size_t len, int flags,
                in = (struct in_addr *) CMSG_DATA(cmsg);
                *in = s4->sin_addr;
 #endif
+#endif /* IP_PKTINFO or IP_SENDSRCADDR */
        }
 
 #ifdef AF_INET6
        else if (from->sa_family == AF_INET6) {
-#ifdef IPV6_PKTINFO
+#if !defined(IPV6_PKTINFO)
+               return sendto(s, buf, len, flags, to, tolen);
+#else          
                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) from;
 
                struct in6_pktinfo *pkt;
@@ -366,7 +363,7 @@ int sendfromto(int s, void *buf, size_t len, int flags,
                pkt = (struct in6_pktinfo *) CMSG_DATA(cmsg);
                memset(pkt, 0, sizeof(*pkt));
                pkt->ipi6_addr = s6->sin6_addr;
-#endif
+#endif /* IPV6_PKTINFO */
        }
 #endif