gcc 4.4.1 (as included in openSUSE 11.2) complains about the user-space iSCSI code because it breaks strict-aliasing rules. The reported warnings should be addressed because not doing so can result in the compiler generating incorrect code. The patch below fixes these compiler warnings.

Signed-off-by: Bart Van Assche <bart.vanassche@gmail.com>



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1352 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2009-11-20 19:53:12 +00:00
parent da022918e4
commit c918eb371e
2 changed files with 39 additions and 23 deletions
+15 -11
View File
@@ -205,7 +205,11 @@ static void create_listen_socket(struct pollfd *array)
static void accept_connection(int listen)
{
struct sockaddr_storage from, to;
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} from, to;
char portal[50]; /* for full IP6 address + port */
socklen_t namesize;
struct pollfd *pollfd;
@@ -213,7 +217,7 @@ static void accept_connection(int listen)
int fd, i, rc;
namesize = sizeof(from);
if ((fd = accept(listen, (struct sockaddr *)&from, &namesize)) < 0) {
if ((fd = accept(listen, &from.sa, &namesize)) < 0) {
switch (errno) {
case EINTR:
case EAGAIN:
@@ -234,14 +238,14 @@ static void accept_connection(int listen)
}
namesize = sizeof(to);
rc = getsockname(fd, (struct sockaddr *)&to, &namesize);
rc = getsockname(fd, &to.sa, &namesize);
if (rc == 0) {
if (from.ss_family == AF_INET) {
struct sockaddr_in *in = (struct sockaddr_in *)&to;
if (from.sa.sa_family == AF_INET) {
struct sockaddr_in *in = &to.sin;
rc = snprintf(portal, sizeof(portal), "%s:%hu",
inet_ntoa(in->sin_addr), ntohs(in->sin_port));
} else if (from.ss_family == AF_INET6) {
struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&to;
} else if (from.sa.sa_family == AF_INET6) {
struct sockaddr_in6 *in6 = &to.sin6;
rc = snprintf(portal, sizeof(portal), "%x:%x:%x:%x:%x:%x:%x:%x.%hu",
in6->sin6_addr.s6_addr16[7], in6->sin6_addr.s6_addr16[6],
in6->sin6_addr.s6_addr16[5], in6->sin6_addr.s6_addr16[4],
@@ -257,12 +261,12 @@ static void accept_connection(int listen)
goto out_close;
}
if (from.ss_family == AF_INET) {
struct sockaddr_in *in = (struct sockaddr_in *)&from;
if (from.sa.sa_family == AF_INET) {
struct sockaddr_in *in = &from.sin;
log_info("Connect from %s:%hu to %s", inet_ntoa(in->sin_addr),
ntohs(in->sin_port), portal);
} else if (from.ss_family == AF_INET6) {
struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&from;
} else if (from.sa.sa_family == AF_INET6) {
struct sockaddr_in6 *in6 = &from.sin6;
log_info("Connect from %x:%x:%x:%x:%x:%x:%x:%x.%hu to %s",
in6->sin6_addr.s6_addr16[7], in6->sin6_addr.s6_addr16[6],
in6->sin6_addr.s6_addr16[5], in6->sin6_addr.s6_addr16[4],
+24 -12
View File
@@ -87,25 +87,29 @@ static int isns_get_ip(int fd)
{
int err, i;
uint32_t addr;
struct sockaddr_storage lss;
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} lss;
socklen_t slen = sizeof(lss);
err = getsockname(fd, (struct sockaddr *) &lss, &slen);
err = getsockname(fd, &lss.sa, &slen);
if (err) {
log_error("getsockname error: %s!", gai_strerror(err));
return err;
}
err = getnameinfo((struct sockaddr *) &lss, sizeof(lss),
err = getnameinfo(&lss.sa, sizeof(lss),
eid, sizeof(eid), NULL, 0, 0);
if (err) {
log_error("getaddrinfo error: %s!", gai_strerror(err));
return err;
}
switch (lss.ss_family) {
switch (lss.sa.sa_family) {
case AF_INET:
addr = (((struct sockaddr_in *) &lss)->sin_addr.s_addr);
addr = lss.sin.sin_addr.s_addr;
ip[10] = ip[11] = 0xff;
ip[15] = 0xff & (addr >> 24);
@@ -115,7 +119,7 @@ static int isns_get_ip(int fd)
break;
case AF_INET6:
for (i = 0; i < ARRAY_SIZE(ip); i++)
ip[i] = ((struct sockaddr_in6 *) &lss)->sin6_addr.s6_addr[i];
ip[i] = lss.sin6.sin6_addr.s6_addr[i];
break;
}
@@ -755,12 +759,16 @@ int isns_handle(int is_timeout, int *timeout)
static int scn_accept_connection(void)
{
struct sockaddr_storage from;
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} from;
socklen_t slen;
int fd, err, opt = 1;
slen = sizeof(from);
fd = accept(scn_listen_fd, (struct sockaddr *) &from, &slen);
fd = accept(scn_listen_fd, &from.sa, &slen);
if (fd < 0) {
log_error("%s %d: accept error: %s", __func__, __LINE__,
strerror(errno));
@@ -850,7 +858,11 @@ int isns_scn_handle(int is_accept)
static int scn_init(char *addr)
{
int fd, opt, err;
struct sockaddr_storage lss;
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} lss;
socklen_t slen;
fd = socket(ss.ss_family, SOCK_STREAM, IPPROTO_TCP);
@@ -882,10 +894,10 @@ static int scn_init(char *addr)
}
/* protocol independent way ? */
if (lss.ss_family == AF_INET6)
scn_listen_port = ntohs(((struct sockaddr_in6 *) &lss)->sin6_port);
if (lss.sa.sa_family == AF_INET6)
scn_listen_port = ntohs(lss.sin6.sin6_port);
else
scn_listen_port = ntohs(((struct sockaddr_in *) &lss)->sin_port);
scn_listen_port = ntohs(lss.sin.sin_port);
log_error("scn listen port %u %d %d\n", scn_listen_port, fd, err);
out: