Blame SOURCES/0016-avoid-casting-struct-sockaddr.patch

dc245c
From 73ce7f40c81f7ef2647abe18df8f14c35c086c7e Mon Sep 17 00:00:00 2001
dc245c
From: Paolo Bonzini <pbonzini@redhat.com>
dc245c
Date: Fri, 2 Aug 2013 14:19:29 +0200
dc245c
Subject: [RHEL7 libiscsi PATCH 16/18] avoid casting struct sockaddr
dc245c
dc245c
On ARM, this produces a warning.  Use a union instead.
dc245c
dc245c
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
dc245c
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
dc245c
(cherry-picked from upstream commit 73ce7f40c81f7ef2647abe18df8f14c35c086c7e)
dc245c
---
dc245c
 lib/socket.c | 19 ++++++++++++++-----
dc245c
 1 file changed, 14 insertions(+), 5 deletions(-)
dc245c
dc245c
diff --git a/lib/socket.c b/lib/socket.c
dc245c
index 5d98783..2c65a4a 100644
dc245c
--- a/lib/socket.c
dc245c
+++ b/lib/socket.c
dc245c
@@ -171,6 +171,12 @@ int set_tcp_syncnt(struct iscsi_context *iscsi)
dc245c
 	return 0;
dc245c
 }
dc245c
 
dc245c
+union socket_address {
dc245c
+	struct sockaddr_in sin;
dc245c
+	struct sockaddr_in6 sin6;
dc245c
+	struct sockaddr sa;
dc245c
+};
dc245c
+
dc245c
 int
dc245c
 iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
dc245c
 		    iscsi_command_cb cb, void *private_data)
dc245c
@@ -179,6 +185,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
dc245c
 	char *str;
dc245c
 	char *addr, *host;
dc245c
 	struct addrinfo *ai = NULL;
dc245c
+	union socket_address sa;
dc245c
 	int socksize;
dc245c
 
dc245c
 	ISCSI_LOG(iscsi, 2, "connecting to portal %s",portal);
dc245c
@@ -238,19 +245,22 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
dc245c
  	}
dc245c
 	iscsi_free(iscsi, addr);
dc245c
 
dc245c
+	memset(&sa, 0, sizeof(sa));
dc245c
 	switch (ai->ai_family) {
dc245c
 	case AF_INET:
dc245c
 		socksize = sizeof(struct sockaddr_in);
dc245c
-		((struct sockaddr_in *)(ai->ai_addr))->sin_port = htons(port);
dc245c
+		memcpy(&sa.sin, ai->ai_addr, socksize);
dc245c
+		sa.sin.sin_port = htons(port);
dc245c
 #ifdef HAVE_SOCK_SIN_LEN
dc245c
-		((struct sockaddr_in *)(ai->ai_addr))->sin_len = socksize;
dc245c
+		sa.sin.sin_len = socksize;
dc245c
 #endif
dc245c
 		break;
dc245c
 	case AF_INET6:
dc245c
 		socksize = sizeof(struct sockaddr_in6);
dc245c
-		((struct sockaddr_in6 *)(ai->ai_addr))->sin6_port = htons(port);
dc245c
+		memcpy(&sa.sin6, ai->ai_addr, socksize);
dc245c
+		sa.sin6.sin6_port = htons(port);
dc245c
 #ifdef HAVE_SOCK_SIN_LEN
dc245c
-		((struct sockaddr_in6 *)(ai->ai_addr))->sin6_len = socksize;
dc245c
+		sa.sin6.sin6_len = socksize;
dc245c
 #endif
dc245c
 		break;
dc245c
 	default:
dc245c
@@ -316,7 +325,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
dc245c
 		ISCSI_LOG(iscsi,3,"TCP_NODELAY set to 1");
dc245c
 	}
dc245c
 
dc245c
-	if (connect(iscsi->fd, ai->ai_addr, socksize) != 0
dc245c
+	if (connect(iscsi->fd, &sa.sa, socksize) != 0
dc245c
 	    && errno != EINPROGRESS) {
dc245c
 		iscsi_set_error(iscsi, "Connect failed with errno : "
dc245c
 				"%s(%d)", strerror(errno), errno);
dc245c
-- 
dc245c
1.8.1.4
dc245c