#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
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
/*
*/
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().
* 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;
}
*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;
}
*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
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().
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;
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;
pkt = (struct in6_pktinfo *) CMSG_DATA(cmsg);
memset(pkt, 0, sizeof(*pkt));
pkt->ipi6_addr = s6->sin6_addr;
-#endif
+#endif /* IPV6_PKTINFO */
}
#endif