diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2025-01-18 11:50:59 -0800 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2025-01-18 11:50:59 -0800 |
commit | 2c4a122ca0512936d4306ef449f6b7b2566d6785 (patch) | |
tree | eaeac4e9723fc5c0f0fce7ef883cb6a4f7d67fc4 | |
parent | deb755c0ad4575a7542e2abcba986a003fddb198 (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.h | 8 | ||||
-rw-r--r-- | Xtranssock.c | 62 | ||||
-rw-r--r-- | xtrans.m4 | 6 |
3 files changed, 29 insertions, 47 deletions
@@ -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) @@ -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) |