diff options
-rw-r--r-- | libglusterfs/src/common-utils.h | 7 | ||||
-rw-r--r-- | libglusterfs/src/run.c | 2 | ||||
-rw-r--r-- | rpc/rpc-transport/rdma/src/name.c | 35 | ||||
-rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.c | 28 | ||||
-rw-r--r-- | rpc/rpc-transport/socket/src/name.c | 29 | ||||
-rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 13 | ||||
-rw-r--r-- | xlators/nfs/lib/src/rpc-socket.c | 8 |
7 files changed, 60 insertions, 62 deletions
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index e092288bf..e42945bf0 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -147,6 +147,13 @@ extern char *gf_mgmt_list[GF_MGMT_MAXVALUE]; } while (0); #endif +union gf_sock_union { + struct sockaddr_storage storage; + struct sockaddr_in6 sin6; + struct sockaddr_in sin; + struct sockaddr sa; +}; + #define GF_HIDDEN_PATH ".glusterfs" static inline void diff --git a/libglusterfs/src/run.c b/libglusterfs/src/run.c index 052a2fdb5..41601209c 100644 --- a/libglusterfs/src/run.c +++ b/libglusterfs/src/run.c @@ -312,7 +312,7 @@ runner_start (runner_t *runner) execvp (runner->argv[0], runner->argv); } - write (xpi[1], &errno, sizeof (errno)); + ret = write (xpi[1], &errno, sizeof (errno)); _exit (1); } diff --git a/rpc/rpc-transport/rdma/src/name.c b/rpc/rpc-transport/rdma/src/name.c index bc9b97e90..53c8db9b1 100644 --- a/rpc/rpc-transport/rdma/src/name.c +++ b/rpc/rpc-transport/rdma/src/name.c @@ -577,40 +577,33 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add { int32_t ret = 0, tmpaddr_len = 0; char service[NI_MAXSERV], host[NI_MAXHOST]; - struct sockaddr_storage tmpaddr; + union gf_sock_union sock_union; - memset (&tmpaddr, 0, sizeof (tmpaddr)); - tmpaddr = *addr; + memset (&sock_union, 0, sizeof (sock_union)); + sock_union.storage = *addr; tmpaddr_len = addr_len; - if (((struct sockaddr *) &tmpaddr)->sa_family == AF_INET6) { + if (sock_union.sa.sa_family == AF_INET6) { int32_t one_to_four, four_to_eight, twelve_to_sixteen; int16_t eight_to_ten, ten_to_twelve; one_to_four = four_to_eight = twelve_to_sixteen = 0; eight_to_ten = ten_to_twelve = 0; - one_to_four = ((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr.s6_addr32[0]; - four_to_eight = ((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr.s6_addr32[1]; + one_to_four = sock_union.sin6.sin6_addr.s6_addr32[0]; + four_to_eight = sock_union.sin6.sin6_addr.s6_addr32[1]; #ifdef GF_SOLARIS_HOST_OS - eight_to_ten = S6_ADDR16(((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr)[4]; + eight_to_ten = S6_ADDR16(sock_union.sin6.sin6_addr)[4]; #else - eight_to_ten = ((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr.s6_addr16[4]; + eight_to_ten = sock_union.sin6.sin6_addr.s6_addr16[4]; #endif #ifdef GF_SOLARIS_HOST_OS - ten_to_twelve = S6_ADDR16(((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr)[5]; + ten_to_twelve = S6_ADDR16(sock_union.sin6.sin6_addr)[5]; #else - ten_to_twelve = ((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr.s6_addr16[5]; + ten_to_twelve = sock_union.sin6.sin6_addr.s6_addr16[5]; #endif - twelve_to_sixteen = ((struct sockaddr_in6 *) - &tmpaddr)->sin6_addr.s6_addr32[3]; + twelve_to_sixteen = sock_union.sin6.sin6_addr.s6_addr32[3]; /* ipv4 mapped ipv6 address has bits 0-80: 0 @@ -622,8 +615,8 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add four_to_eight == 0 && eight_to_ten == 0 && ten_to_twelve == -1) { - struct sockaddr_in *in_ptr = (struct sockaddr_in *)&tmpaddr; - memset (&tmpaddr, 0, sizeof (tmpaddr)); + struct sockaddr_in *in_ptr = &sock_union.sin; + memset (&sock_union, 0, sizeof (sock_union)); in_ptr->sin_family = AF_INET; in_ptr->sin_port = ((struct sockaddr_in6 *)addr)->sin6_port; @@ -632,7 +625,7 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add } } - ret = getnameinfo ((struct sockaddr *) &tmpaddr, + ret = getnameinfo (&sock_union.sa, tmpaddr_len, host, sizeof (host), service, sizeof (service), diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index d27beaf1c..c0b7e7bf2 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -4501,7 +4501,7 @@ rdma_connect (struct rpc_transport *this, int port) int32_t ret = 0; gf_boolean_t non_blocking = 1; - struct sockaddr_storage sockaddr; + union gf_sock_union sock_union; socklen_t sockaddr_len = 0; if (dict_get (options, "non-blocking-io")) { @@ -4517,7 +4517,7 @@ rdma_connect (struct rpc_transport *this, int port) } ret = gf_rdma_client_get_remote_sockaddr (this, - (struct sockaddr *)&sockaddr, + &sock_union.sa, &sockaddr_len, port); if (ret != 0) { gf_log (this->name, GF_LOG_DEBUG, @@ -4532,8 +4532,7 @@ rdma_connect (struct rpc_transport *this, int port) goto unlock; } - priv->sock = socket (((struct sockaddr *)&sockaddr)->sa_family, - SOCK_STREAM, 0); + priv->sock = socket (sock_union.sa.sa_family, SOCK_STREAM, 0); if (priv->sock == -1) { gf_log (this->name, GF_LOG_ERROR, @@ -4545,12 +4544,12 @@ rdma_connect (struct rpc_transport *this, int port) gf_log (this->name, GF_LOG_TRACE, "socket fd = %d", priv->sock); - memcpy (&this->peerinfo.sockaddr, &sockaddr, sockaddr_len); + memcpy (&this->peerinfo.sockaddr, &sock_union.storage, + sockaddr_len); this->peerinfo.sockaddr_len = sockaddr_len; if (port > 0) - ((struct sockaddr_in *) (&sockaddr))->sin_port - = htons (port); + sock_union.sin.sin_port = htons (port); ((struct sockaddr *) &this->myinfo.sockaddr)->sa_family = ((struct sockaddr *)&this->peerinfo.sockaddr)->sa_family; @@ -4713,15 +4712,15 @@ rdma_server_event_handler (int fd, int idx, void *data, static int32_t rdma_listen (rpc_transport_t *this) { - struct sockaddr_storage sockaddr; + union gf_sock_union sock_union; socklen_t sockaddr_len; rdma_private_t *priv = this->private; int opt = 1, ret = 0; char service[NI_MAXSERV], host[NI_MAXHOST]; - memset (&sockaddr, 0, sizeof (sockaddr)); + memset (&sock_union, 0, sizeof (sock_union)); ret = gf_rdma_server_get_local_sockaddr (this, - (struct sockaddr *)&sockaddr, + &sock_union.sa, &sockaddr_len); if (ret != 0) { gf_log (this->name, GF_LOG_DEBUG, @@ -4729,8 +4728,7 @@ rdma_listen (rpc_transport_t *this) goto err; } - priv->sock = socket (((struct sockaddr *)&sockaddr)->sa_family, - SOCK_STREAM, 0); + priv->sock = socket (sock_union.sa.sa_family, SOCK_STREAM, 0); if (priv->sock == -1) { gf_log ("rdma/server", GF_LOG_CRITICAL, "init: failed to create socket, error: %s", @@ -4740,7 +4738,7 @@ rdma_listen (rpc_transport_t *this) goto err; } - memcpy (&this->myinfo.sockaddr, &sockaddr, sockaddr_len); + memcpy (&this->myinfo.sockaddr, &sock_union.storage, sockaddr_len); this->myinfo.sockaddr_len = sockaddr_len; ret = getnameinfo ((struct sockaddr *)&this->myinfo.sockaddr, @@ -4756,9 +4754,7 @@ rdma_listen (rpc_transport_t *this) sprintf (this->myinfo.identifier, "%s:%s", host, service); setsockopt (priv->sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); - if (bind (priv->sock, - (struct sockaddr *)&sockaddr, - sockaddr_len) != 0) { + if (bind (priv->sock, &sock_union.sa, sockaddr_len) != 0) { ret = -1; gf_log ("rdma/server", GF_LOG_ERROR, "init: failed to bind to socket for %s (%s)", diff --git a/rpc/rpc-transport/socket/src/name.c b/rpc/rpc-transport/socket/src/name.c index d310b0f8a..a9813998e 100644 --- a/rpc/rpc-transport/socket/src/name.c +++ b/rpc/rpc-transport/socket/src/name.c @@ -36,6 +36,7 @@ #include "rpc-transport.h" #include "socket.h" +#include "common-utils.h" int32_t gf_resolve_ip6 (const char *hostname, @@ -604,7 +605,7 @@ int32_t fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *addr, int32_t addr_len, char *identifier) { - struct sockaddr_storage tmpaddr; + union gf_sock_union sock_union; char service[NI_MAXSERV] = {0,}; char host[NI_MAXHOST] = {0,}; @@ -616,26 +617,26 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add int16_t eight_to_ten = 0; int16_t ten_to_twelve = 0; - memset (&tmpaddr, 0, sizeof (tmpaddr)); - tmpaddr = *addr; + memset (&sock_union, 0, sizeof (sock_union)); + sock_union.storage = *addr; tmpaddr_len = addr_len; - if (((struct sockaddr *) &tmpaddr)->sa_family == AF_INET6) { - one_to_four = ((struct sockaddr_in6 *) &tmpaddr)->sin6_addr.s6_addr32[0]; - four_to_eight = ((struct sockaddr_in6 *) &tmpaddr)->sin6_addr.s6_addr32[1]; + if (sock_union.sa.sa_family == AF_INET6) { + one_to_four = sock_union.sin6.sin6_addr.s6_addr32[0]; + four_to_eight = sock_union.sin6.sin6_addr.s6_addr32[1]; #ifdef GF_SOLARIS_HOST_OS - eight_to_ten = S6_ADDR16(((struct sockaddr_in6 *) &tmpaddr)->sin6_addr)[4]; + eight_to_ten = S6_ADDR16(sock_union.sin6.sin6_addr)[4]; #else - eight_to_ten = ((struct sockaddr_in6 *) &tmpaddr)->sin6_addr.s6_addr16[4]; + eight_to_ten = sock_union.sin6.sin6_addr.s6_addr16[4]; #endif #ifdef GF_SOLARIS_HOST_OS - ten_to_twelve = S6_ADDR16(((struct sockaddr_in6 *) &tmpaddr)->sin6_addr)[5]; + ten_to_twelve = S6_ADDR16(sock_union.sin6.sin6_addr)[5]; #else - ten_to_twelve = ((struct sockaddr_in6 *) &tmpaddr)->sin6_addr.s6_addr16[5]; + ten_to_twelve = sock_union.sin6.sin6_addr.s6_addr16[5]; #endif - twelve_to_sixteen = ((struct sockaddr_in6 *) &tmpaddr)->sin6_addr.s6_addr32[3]; + twelve_to_sixteen = sock_union.sin6.sin6_addr.s6_addr32[3]; /* ipv4 mapped ipv6 address has bits 0-80: 0 @@ -647,8 +648,8 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add four_to_eight == 0 && eight_to_ten == 0 && ten_to_twelve == -1) { - struct sockaddr_in *in_ptr = (struct sockaddr_in *)&tmpaddr; - memset (&tmpaddr, 0, sizeof (tmpaddr)); + struct sockaddr_in *in_ptr = &sock_union.sin; + memset (&sock_union, 0, sizeof (sock_union)); in_ptr->sin_family = AF_INET; in_ptr->sin_port = ((struct sockaddr_in6 *)addr)->sin6_port; @@ -657,7 +658,7 @@ fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *add } } - ret = getnameinfo ((struct sockaddr *) &tmpaddr, + ret = getnameinfo (&sock_union.sa, tmpaddr_len, host, sizeof (host), service, sizeof (service), diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 2948621fc..681064d79 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -1945,10 +1945,10 @@ socket_connect (rpc_transport_t *this, int port) int ret = -1; int sock = -1; socket_private_t *priv = NULL; - struct sockaddr_storage sockaddr = {0, }; socklen_t sockaddr_len = 0; glusterfs_ctx_t *ctx = NULL; sa_family_t sa_family = {0, }; + union gf_sock_union sock_union; GF_VALIDATE_OR_GOTO ("socket", this, err); GF_VALIDATE_OR_GOTO ("socket", this->private, err); @@ -1976,16 +1976,16 @@ socket_connect (rpc_transport_t *this, int port) goto err; } - ret = socket_client_get_remote_sockaddr (this, SA (&sockaddr), + ret = socket_client_get_remote_sockaddr (this, &sock_union.sa, &sockaddr_len, &sa_family); if (ret == -1) { /* logged inside client_get_remote_sockaddr */ goto err; } - if (port > 0) - ((struct sockaddr_in *) (&sockaddr))->sin_port = htons (port); - + if (port > 0) { + sock_union.sin.sin_port = htons (port); + } pthread_mutex_lock (&priv->lock); { if (priv->sock != -1) { @@ -1994,7 +1994,8 @@ socket_connect (rpc_transport_t *this, int port) goto unlock; } - memcpy (&this->peerinfo.sockaddr, &sockaddr, sockaddr_len); + memcpy (&this->peerinfo.sockaddr, &sock_union.storage, + sockaddr_len); this->peerinfo.sockaddr_len = sockaddr_len; priv->sock = socket (sa_family, SOCK_STREAM, 0); diff --git a/xlators/nfs/lib/src/rpc-socket.c b/xlators/nfs/lib/src/rpc-socket.c index 3d18a3c48..d2b4bfeb2 100644 --- a/xlators/nfs/lib/src/rpc-socket.c +++ b/xlators/nfs/lib/src/rpc-socket.c @@ -83,21 +83,21 @@ int nfs_rpcsvc_socket_listen (int addrfam, char *listenhost, uint16_t listenport) { int sock = -1; - struct sockaddr_storage sockaddr; socklen_t sockaddr_len; int flags = 0; int ret = -1; int opt = 1; + union gf_sock_union sock_union; ret = nfs_rpcsvc_socket_server_get_local_socket (addrfam, listenhost, listenport, - SA (&sockaddr), + &sock_union.sa, &sockaddr_len); if (ret == -1) return ret; - sock = socket (SA (&sockaddr)->sa_family, SOCK_STREAM, 0); + sock = socket (sock_union.sa.sa_family, SOCK_STREAM, 0); if (sock == -1) { gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "socket creation failed" " (%s)", strerror (errno)); @@ -125,7 +125,7 @@ nfs_rpcsvc_socket_listen (int addrfam, char *listenhost, uint16_t listenport) goto close_err; } - ret = bind (sock, (struct sockaddr *)&sockaddr, sockaddr_len); + ret = bind (sock, &sock_union.sa, sockaddr_len); if (ret == -1) { if (errno != EADDRINUSE) { gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "binding socket " |