From f92a917d45c6f6f29a9dfcfc06cc69d319c37281 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 10 Jul 2015 22:22:57 +0000 Subject: [PATCH] iscsi-scst: Suppress strict aliasing compiler warnings Avoid that the compiler reports warnings about strict aliasing when building iscsi-scst on RHEL 6. This patch does not change any functionality. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6414 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- iscsi-scst/usr/config.c | 52 ++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/iscsi-scst/usr/config.c b/iscsi-scst/usr/config.c index b423a722b..516db2ce3 100644 --- a/iscsi-scst/usr/config.c +++ b/iscsi-scst/usr/config.c @@ -575,14 +575,21 @@ out: * Access control code */ -static int netmask_match_v6(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t mbit) +typedef union { + struct sockaddr sa; + struct sockaddr_in sa_in; + struct sockaddr_in6 sa_in6; +} sockaddress; + +static int netmask_match_v6(const struct sockaddr_in6 *sa1, + const struct sockaddr_in6 *sa2, uint32_t mbit) { uint16_t mask, a1[8], a2[8]; int i; for (i = 0; i < 8; i++) { - a1[i] = ntohs(((struct sockaddr_in6 *) sa1)->sin6_addr.s6_addr16[i]); - a2[i] = ntohs(((struct sockaddr_in6 *) sa2)->sin6_addr.s6_addr16[i]); + a1[i] = ntohs(sa1->sin6_addr.s6_addr16[i]); + a2[i] = ntohs(sa2->sin6_addr.s6_addr16[i]); } for (i = 0; i < mbit / 16; i++) @@ -598,12 +605,14 @@ static int netmask_match_v6(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t return 1; } -static int netmask_match_v4(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t mbit) +static int netmask_match_v4(const struct sockaddr_in *sa1, + const struct sockaddr_in *sa2, + uint32_t mbit) { uint32_t s1, s2, mask = ~((1 << (32 - mbit)) - 1); - s1 = htonl(((struct sockaddr_in *) sa1)->sin_addr.s_addr); - s2 = htonl(((struct sockaddr_in *) sa2)->sin_addr.s_addr); + s1 = htonl(sa1->sin_addr.s_addr); + s2 = htonl(sa2->sin_addr.s_addr); if (~mask & s1) return 0; @@ -614,10 +623,11 @@ static int netmask_match_v4(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t return 0; } -static int netmask_match(struct sockaddr *sa1, struct sockaddr *sa2, char *buf) +static int netmask_match(const sockaddress *sa1, const sockaddress *sa2, + char *buf) { unsigned long mbit; - uint8_t family = sa1->sa_family; + uint8_t family = sa1->sa.sa_family; mbit = strtoul(buf, NULL, 0); if (mbit == ULONG_MAX || @@ -626,21 +636,21 @@ static int netmask_match(struct sockaddr *sa1, struct sockaddr *sa2, char *buf) return 0; if (family == AF_INET) - return netmask_match_v4(sa1, sa2, mbit); + return netmask_match_v4(&sa1->sa_in, &sa2->sa_in, mbit); - return netmask_match_v6(sa1, sa2, mbit); + return netmask_match_v6(&sa1->sa_in6, &sa2->sa_in6, mbit); } -static int address_match(struct sockaddr *sa1, struct sockaddr *sa2) +static int address_match(const sockaddress *sa1, const sockaddress *sa2) { - if (sa1->sa_family == AF_INET) - return ((struct sockaddr_in *) sa1)->sin_addr.s_addr == - ((struct sockaddr_in *) sa2)->sin_addr.s_addr; + if (sa1->sa.sa_family == AF_INET) + return sa1->sa_in.sin_addr.s_addr == + sa2->sa_in.sin_addr.s_addr; else { - struct in6_addr *a1, *a2; + const struct in6_addr *a1, *a2; - a1 = &((struct sockaddr_in6 *) sa1)->sin6_addr; - a2 = &((struct sockaddr_in6 *) sa2)->sin6_addr; + a1 = &sa1->sa_in6.sin6_addr; + a2 = &sa2->sa_in6.sin6_addr; return (a1->s6_addr32[0] == a2->s6_addr32[0] && a1->s6_addr32[1] == a2->s6_addr32[1] && @@ -653,7 +663,7 @@ static int address_match(struct sockaddr *sa1, struct sockaddr *sa2) static int __initiator_match(int fd, char *str) { - struct sockaddr_storage from; + sockaddress from; socklen_t len; char *p, *q; int err = 0; @@ -690,11 +700,9 @@ static int __initiator_match(int fd, char *str) return 0; if (q) - err = netmask_match(res->ai_addr, - (struct sockaddr *) &from, q); + err = netmask_match((sockaddress *)res->ai_addr, &from, q); else - err = address_match(res->ai_addr, - (struct sockaddr *) &from); + err = address_match((sockaddress *)res->ai_addr, &from); freeaddrinfo(res);