X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=support%2Finclude%2Fsockaddr.h;h=a1c30f9bea5da5746f80668c5463ba11fc2e7f6f;hb=e0b66eaad419b466ecfac1b82d4802bb5fb676d0;hp=732514be6c747a2ce981a89b77ffeee372c63ce6;hpb=f0d3a4bedccca7cce48296757bc1c8bd59b80828;p=nfs-utils.git diff --git a/support/include/sockaddr.h b/support/include/sockaddr.h index 732514b..a1c30f9 100644 --- a/support/include/sockaddr.h +++ b/support/include/sockaddr.h @@ -20,6 +20,13 @@ #ifndef NFS_UTILS_SOCKADDR_H #define NFS_UTILS_SOCKADDR_H +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_LIBIO_H +#include +#endif #include #include #include @@ -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: