summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2025-01-18 11:50:59 -0800
committerAlan Coopersmith <alan.coopersmith@oracle.com>2025-01-18 11:50:59 -0800
commit2c4a122ca0512936d4306ef449f6b7b2566d6785 (patch)
treeeaeac4e9723fc5c0f0fce7ef883cb6a4f7d67fc4
parentdeb755c0ad4575a7542e2abcba986a003fddb198 (diff)
if sockaddr_storage is available, use it, even if IPv6 support is disabled
Support for using sockaddr_storage was originally added to support IPv6, and only used if IPv6 support was enabled. Two decades later, support for sockaddr_storage is ubiquitous and can simplify our code paths, so use the modern interface whenever we can now. Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Part-of: <https://gitlab.freedesktop.org/xorg/lib/libxtrans/-/merge_requests/28>
-rw-r--r--Xtrans.h8
-rw-r--r--Xtranssock.c62
-rw-r--r--xtrans.m46
3 files changed, 29 insertions, 47 deletions
diff --git a/Xtrans.h b/Xtrans.h
index 8796b7e..8cf0daf 100644
--- a/Xtrans.h
+++ b/Xtrans.h
@@ -131,7 +131,13 @@ static const char *__xtransname = "_XTrans";
* This structure needs to be independent of the socket/TLI interface used.
*/
-#if defined(IPv6) && defined(AF_INET6)
+/* Temporary workaround for consumers whose configure scripts were
+ generated with pre-1.6 versions of xtrans.m4 */
+#if defined(IPv6) && !defined(HAVE_STRUCT_SOCKADDR_STORAGE)
+#define HAVE_STRUCT_SOCKADDR_STORAGE
+#endif
+
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
typedef struct sockaddr_storage Xtransaddr;
#else
#define XTRANS_MAX_ADDR_LEN 128 /* large enough to hold sun_path */
diff --git a/Xtranssock.c b/Xtranssock.c
index 69c20cd..b2692e5 100644
--- a/Xtranssock.c
+++ b/Xtranssock.c
@@ -296,24 +296,16 @@ static int
TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
{
-#ifdef IPv6
- struct sockaddr_storage socknamev6;
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
+ struct sockaddr_storage sockname;
#else
- struct sockaddr_in socknamev4;
+ struct sockaddr_in sockname;
#endif
- void *socknamePtr;
- SOCKLEN_T namelen;
+ void *socknamePtr = &sockname;
+ SOCKLEN_T namelen = sizeof(sockname);
prmsg (3,"SocketINETGetAddr(%p)\n", (void *) ciptr);
-#ifdef IPv6
- namelen = sizeof(socknamev6);
- socknamePtr = &socknamev6;
-#else
- namelen = sizeof(socknamev4);
- socknamePtr = &socknamev4;
-#endif
-
bzero(socknamePtr, namelen);
if (getsockname (ciptr->fd,(struct sockaddr *) socknamePtr,
@@ -338,11 +330,7 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
return -1;
}
-#ifdef IPv6
ciptr->family = ((struct sockaddr *)socknamePtr)->sa_family;
-#else
- ciptr->family = socknamev4.sin_family;
-#endif
ciptr->addrlen = namelen;
memcpy (ciptr->addr, socknamePtr, ciptr->addrlen);
@@ -359,25 +347,13 @@ static int
TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
{
-#ifdef IPv6
- struct sockaddr_storage socknamev6;
-#endif
- struct sockaddr_in socknamev4;
- void *socknamePtr;
- SOCKLEN_T namelen;
-
-#ifdef IPv6
- if (ciptr->family == AF_INET6)
- {
- namelen = sizeof(socknamev6);
- socknamePtr = &socknamev6;
- }
- else
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
+ struct sockaddr_storage sockname;
+#else
+ struct sockaddr_in sockname;
#endif
- {
- namelen = sizeof(socknamev4);
- socknamePtr = &socknamev4;
- }
+ void *socknamePtr = &sockname;
+ SOCKLEN_T namelen = sizeof(sockname);
bzero(socknamePtr, namelen);
@@ -863,7 +839,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
unsigned int flags)
{
-#ifdef IPv6
+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
struct sockaddr_storage sockname;
#else
struct sockaddr_in sockname;
@@ -937,7 +913,6 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
sport = 0;
bzero(&sockname, sizeof(sockname));
-#ifdef IPv6
if (Sockettrans2devtab[ciptr->index].family == AF_INET) {
namelen = sizeof (struct sockaddr_in);
#ifdef BSD44SOCKETS
@@ -947,6 +922,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
((struct sockaddr_in *)&sockname)->sin_port = htons(sport);
((struct sockaddr_in *)&sockname)->sin_addr.s_addr = htonl(INADDR_ANY);
} else {
+#ifdef IPv6
namelen = sizeof (struct sockaddr_in6);
#ifdef SIN6_LEN
((struct sockaddr_in6 *)&sockname)->sin6_len = sizeof(sockname);
@@ -954,15 +930,13 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
((struct sockaddr_in6 *)&sockname)->sin6_family = AF_INET6;
((struct sockaddr_in6 *)&sockname)->sin6_port = htons(sport);
((struct sockaddr_in6 *)&sockname)->sin6_addr = in6addr_any;
- }
#else
-#ifdef BSD44SOCKETS
- sockname.sin_len = sizeof (sockname);
-#endif
- sockname.sin_family = AF_INET;
- sockname.sin_port = htons (sport);
- sockname.sin_addr.s_addr = htonl (INADDR_ANY);
+ prmsg (1,
+ "SocketINETCreateListener: unsupported address family %d\n",
+ Sockettrans2devtab[ciptr->index].family);
+ return TRANS_CREATE_LISTENER_FAILED;
#endif
+ }
if ((status = TRANS(SocketCreateListener) (ciptr,
(struct sockaddr *) &sockname, namelen, flags)) < 0)
diff --git a/xtrans.m4 b/xtrans.m4
index fbb6527..f145f42 100644
--- a/xtrans.m4
+++ b/xtrans.m4
@@ -55,9 +55,11 @@ AC_DEFUN([XTRANS_TCP_FLAGS],[
])
# POSIX.1g changed the type of pointer passed to getsockname/getpeername/etc.
- AC_CHECK_TYPES([socklen_t], [], [], [
+ # and added a type defined to be large enough to hold any sockaddr format.
+ AC_CHECK_TYPES([socklen_t, struct sockaddr_storage], [], [], [
AC_INCLUDES_DEFAULT
-#include <sys/socket.h>])
+#include <sys/socket.h>
+ ])
# XPG4v2/UNIX95 added msg_control - check to see if we need to define
# _XOPEN_SOURCE to get it (such as on Solaris)