]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/include/sockaddr.h
Merge branch 'sid'
[nfs-utils.git] / support / include / sockaddr.h
index 732514be6c747a2ce981a89b77ffeee372c63ce6..a1c30f9bea5da5746f80668c5463ba11fc2e7f6f 100644 (file)
 #ifndef NFS_UTILS_SOCKADDR_H
 #define NFS_UTILS_SOCKADDR_H
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_LIBIO_H
+#include <libio.h>
+#endif
 #include <stdbool.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -192,16 +199,14 @@ compare_sockaddr6(const struct sockaddr *sa1, const struct sockaddr *sa2)
 {
        const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
        const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
+       const struct in6_addr *saddr1 = &sin1->sin6_addr;
+       const struct in6_addr *saddr2 = &sin2->sin6_addr;
 
-       if ((IN6_IS_ADDR_LINKLOCAL((char *)&sin1->sin6_addr) &&
-            IN6_IS_ADDR_LINKLOCAL((char *)&sin2->sin6_addr)) ||
-           (IN6_IS_ADDR_SITELOCAL((char *)&sin1->sin6_addr) &&
-            IN6_IS_ADDR_SITELOCAL((char *)&sin2->sin6_addr)))
+       if (IN6_IS_ADDR_LINKLOCAL(saddr1) && IN6_IS_ADDR_LINKLOCAL(saddr2))
                if (sin1->sin6_scope_id != sin2->sin6_scope_id)
                        return false;
 
-       return IN6_ARE_ADDR_EQUAL((char *)&sin1->sin6_addr,
-                                       (char *)&sin2->sin6_addr);
+       return IN6_ARE_ADDR_EQUAL(saddr1, saddr2);
 }
 #else  /* !IPV6_SUPPORTED */
 static inline _Bool
@@ -223,6 +228,9 @@ compare_sockaddr6(__attribute__ ((unused)) const struct sockaddr *sa1,
 static inline _Bool
 nfs_compare_sockaddr(const struct sockaddr *sa1, const struct sockaddr *sa2)
 {
+       if (sa1 == NULL || sa2 == NULL)
+               return false;
+
        if (sa1->sa_family == sa2->sa_family)
                switch (sa1->sa_family) {
                case AF_INET: