diff --git a/iscsi-scst/usr/iscsi_scstd.c b/iscsi-scst/usr/iscsi_scstd.c index 58f15da27..fa22cc155 100644 --- a/iscsi-scst/usr/iscsi_scstd.c +++ b/iscsi-scst/usr/iscsi_scstd.c @@ -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], diff --git a/iscsi-scst/usr/isns.c b/iscsi-scst/usr/isns.c index 315f33a65..482e17881 100644 --- a/iscsi-scst/usr/isns.c +++ b/iscsi-scst/usr/isns.c @@ -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: