Use new functions to copy sockaddr to ipaddr
authoraland <aland>
Tue, 10 Jun 2008 07:39:42 +0000 (07:39 +0000)
committeraland <aland>
Tue, 10 Jun 2008 07:39:42 +0000 (07:39 +0000)
src/lib/radius.c

index cdf9af1..58c2b67 100644 (file)
@@ -151,70 +151,20 @@ static int rad_sendto(int sockfd, void *data, size_t data_len, int flags,
                      fr_ipaddr_t *dst_ipaddr, int dst_port)
 {
        struct sockaddr_storage dst;
-       socklen_t               sizeof_dst = sizeof(dst);
+       socklen_t               sizeof_dst;
 
 #ifdef WITH_UDPFROMTO
        struct sockaddr_storage src;
-       socklen_t               sizeof_src = sizeof(src);
-
-       memset(&src, 0, sizeof(src));
-#endif
-       memset(&dst, 0, sizeof(dst));
-
-       /*
-        *      IPv4 is supported.
-        */
-       if (dst_ipaddr->af == AF_INET) {
-               struct sockaddr_in      s4;
-
-               sizeof_dst = sizeof(s4);
-
-               s4.sin_family = AF_INET;
-               s4.sin_addr = dst_ipaddr->ipaddr.ip4addr;
-               s4.sin_port = htons(dst_port);
-               memset(&dst, 0, sizeof(dst));
-               memcpy(&dst, &s4, sizeof_dst);
-
-#ifdef WITH_UDPFROMTO
-               sizeof_src = sizeof(s4);
+       socklen_t               sizeof_src;
 
-               s4.sin_family = AF_INET;
-               s4.sin_addr = src_ipaddr->ipaddr.ip4addr;
-               s4.sin_port = htons(src_port);
-               memset(&src, 0, sizeof(src));
-               memcpy(&src, &s4, sizeof_src);
+       fr_ipaddr2sockaddr(src_ipaddr, src_port, &src, &sizeof_src);
 #else
-               src_port = src_port; /* -Wunused */
+       src_port = src_port;    /* -Wunused */
 #endif
 
-       /*
-        *      IPv6 MAY be supported.
-        */
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
-       } else if (dst_ipaddr->af == AF_INET6) {
-               struct sockaddr_in6     s6;
-
-               sizeof_dst = sizeof(s6);
-
-               s6.sin6_family = AF_INET6;
-               s6.sin6_addr = dst_ipaddr->ipaddr.ip6addr;
-               s6.sin6_port = htons(dst_port);
-               memset(&dst, 0, sizeof(dst));
-               memcpy(&dst, &s6, sizeof_dst);
-
-#ifdef WITH_UDPFROMTO
-               return -1;      /* UDPFROMTO && IPv6 are not supported */
-#if 0
-               sizeof_src = sizeof(s6);
-
-               s6.sin6_family = AF_INET6;
-               s6.sin6_addr = src_ipaddr->ipaddr.ip6addr;
-               memset(&src, 0, sizeof(src));
-               memcpy(&src, &s6, sizeof_src);
-#endif /* #if 0 */
-#endif /* WITH_UDPFROMTO */
-#endif /* HAVE_STRUCT_SOCKADDR_IN6 */
-       } else return -1;   /* Unknown address family, Die Die Die! */
+       if (!fr_ipaddr2sockaddr(dst_ipaddr, dst_port, &dst, &sizeof_dst)) {
+               return -1;
+       }
 
 #ifdef WITH_UDPFROMTO
        /*
@@ -301,25 +251,10 @@ ssize_t rad_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, int *src_port,
                }
        }
 
-       if (src.ss_family == AF_INET) {
-               struct sockaddr_in      s4;
-
-               memcpy(&s4, &src, sizeof(s4));
-               src_ipaddr->af = AF_INET;
-               src_ipaddr->ipaddr.ip4addr = s4.sin_addr;
-               *src_port = ntohs(s4.sin_port);
-
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
-       } else if (src.ss_family == AF_INET6) {
-               struct sockaddr_in6     s6;
-
-               memcpy(&s6, &src, sizeof(s6));
-               src_ipaddr->af = AF_INET6;
-               src_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
-               *src_port = ntohs(s6.sin6_port);
-
-#endif
-       } else {
+       /*
+        *      Convert AF.  If unknown, discard packet.
+        */
+       if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, src_port)) {
                recvfrom(sockfd, header, sizeof(header), 0,
                         (struct sockaddr *)&src, &sizeof_src);
                return 1;
@@ -351,6 +286,7 @@ static ssize_t rad_recvfrom(int sockfd, uint8_t **pbuf, int flags,
        uint8_t                 header[4];
        void                    *buf;
        size_t                  len;
+       int                     port;
 
        memset(&src, 0, sizeof_src);
        memset(&dst, 0, sizeof_dst);
@@ -435,40 +371,14 @@ static ssize_t rad_recvfrom(int sockfd, uint8_t **pbuf, int flags,
                return data_len;
        }
 
-       /*
-        *      Check address families, and update src/dst ports, etc.
-        */
-       if (src.ss_family == AF_INET) {
-               struct sockaddr_in      s4;
-
-               memcpy(&s4, &src, sizeof(s4));
-               src_ipaddr->af = AF_INET;
-               src_ipaddr->ipaddr.ip4addr = s4.sin_addr;
-               *src_port = ntohs(s4.sin_port);
-
-               memcpy(&s4, &dst, sizeof(s4));
-               dst_ipaddr->af = AF_INET;
-               dst_ipaddr->ipaddr.ip4addr = s4.sin_addr;
-               *dst_port = ntohs(s4.sin_port);
-
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
-       } else if (src.ss_family == AF_INET6) {
-               struct sockaddr_in6     s6;
-
-               memcpy(&s6, &src, sizeof(s6));
-               src_ipaddr->af = AF_INET6;
-               src_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
-               *src_port = ntohs(s6.sin6_port);
-
-               memcpy(&s6, &dst, sizeof(s6));
-               dst_ipaddr->af = AF_INET6;
-               dst_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
-               *dst_port = ntohs(s6.sin6_port);
-#endif
-       } else {
+       if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, &port)) {
                free(buf);
                return -1;      /* Unknown address family, Die Die Die! */
        }
+       *src_port = port;
+
+       fr_sockaddr2ipaddr(&dst, sizeof_dst, dst_ipaddr, &port);
+       *dst_port = port;
 
        /*
         *      Different address families should never happen.