From: Alan T. DeKok Date: Thu, 16 Dec 2010 13:57:12 +0000 (+0100) Subject: Try to get it working for v6, too X-Git-Tag: release_2_1_11~184 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa0851d9235f04ff0d4161fc6f842857ff8d52aa;p=thirdparty%2Ffreeradius-server.git Try to get it working for v6, too --- diff --git a/src/lib/udpfromto.c b/src/lib/udpfromto.c index 27cff0599bb..c0f2ebb6eff 100644 --- a/src/lib/udpfromto.c +++ b/src/lib/udpfromto.c @@ -38,10 +38,10 @@ #include RCSID("$Id$") -#ifdef WITH_UDPFROMTO - #include +#ifdef WITH_UDPFROMTO + #ifdef HAVE_SYS_UIO_H #include #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