Xtranssock.c | 75 +++++++++++++++++++++++++++++------------------------------ Xtransutil.c | 6 +++- configure.ac | 2 - xtrans.m4 | 18 +++++++++++--- 4 files changed, 58 insertions(+), 43 deletions(-)
New commits: commit e75b9dad0ae4bc0869af81652d8259675a3c5cac Author: Julien Cristau <[EMAIL PROTECTED]> Date: Thu May 8 16:27:29 2008 +0200 Bump to 1.2 diff --git a/configure.ac b/configure.ac index 0846bf1..304fd6b 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ([2.57]) -AC_INIT(xtrans, 1.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xtrans) +AC_INIT(xtrans, 1.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xtrans) AM_INIT_AUTOMAKE([dist-bzip2]) AM_MAINTAINER_MODE commit 962ad4d3f8096f5ffa14b32b3ee094f250790c77 Author: Alan Hourihane <[EMAIL PROTECTED]> Date: Mon Apr 28 23:46:05 2008 +0100 disable UNIXCONN on MINGW diff --git a/xtrans.m4 b/xtrans.m4 index dfc5dd3..31d456b 100644 --- a/xtrans.m4 +++ b/xtrans.m4 @@ -67,17 +67,21 @@ AC_INCLUDES_DEFAULT AC_DEFUN([XTRANS_CONNECTION_FLAGS],[ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_TYPE_SIGNAL]) + [case $host_os in + mingw*) unixdef="no" ;; + *) unixdef="yes" ;; + esac] AC_ARG_ENABLE(unix-transport, AC_HELP_STRING([--enable-unix-transport],[Enable UNIX domain socket transport]), - [UNIXCONN=$enableval], [UNIXCONN=yes]) - AC_ARG_ENABLE(tcp-transport, - AC_HELP_STRING([--enable-tcp-transport],[Enable TCP socket transport]), - [TCPCONN=$enableval], [TCPCONN=yes]) + [UNIXCONN=$enableval], [UNIXCONN=$unixdef]) AC_MSG_CHECKING([if Xtrans should support UNIX socket connections]) if test "$UNIXCONN" = "yes"; then AC_DEFINE(UNIXCONN,1,[Support UNIX socket connections]) fi AC_MSG_RESULT($UNIXCONN) + AC_ARG_ENABLE(tcp-transport, + AC_HELP_STRING([--enable-tcp-transport],[Enable TCP socket transport]), + [TCPCONN=$enableval], [TCPCONN=yes]) AC_MSG_CHECKING([if Xtrans should support TCP socket connections]) AC_MSG_RESULT($TCPCONN) if test "$TCPCONN" = "yes"; then commit 9e8c0e3356bc6359368b7655d3a717d6c000387e Author: Alan Hourihane <[EMAIL PROTECTED]> Date: Sat Apr 26 16:23:19 2008 +0100 fix build for MAKEWORD diff --git a/Xtransutil.c b/Xtransutil.c old mode 100644 new mode 100755 index 9906367..f68b1e7 --- a/Xtransutil.c +++ b/Xtransutil.c @@ -57,6 +57,10 @@ from The Open Group. #ifdef XTHREADS #include <X11/Xthreads.h> #endif +#ifdef WIN32 +#include <X11/Xlibint.h> +#include <X11/Xwinsock.h> +#endif #ifdef X11_t commit 568c5ea02ee1de437833ee0b53a7b3fd7ece084f Author: Colin Harrison <colin.harrison-at-virgin.net> Date: Sat Apr 26 08:53:13 2008 +0100 Update to winsock2 diff --git a/Xtransutil.c b/Xtransutil.c index a35c84b..9906367 100644 --- a/Xtransutil.c +++ b/Xtransutil.c @@ -479,7 +479,7 @@ TRANS(WSAStartup) (void) PRMSG (2,"WSAStartup()\n", 0, 0, 0); - if (!wsadata.wVersion && WSAStartup(0x0101, &wsadata)) + if (!wsadata.wVersion && WSAStartup(MAKEWORD(2,2), &wsadata)) return 1; return 0; } commit 960902584a3ef125946beb5ebe331b54d697e9d9 Author: James Cloos <[EMAIL PROTECTED]> Date: Fri Apr 25 15:53:20 2008 -0400 Fix length calculation for the path for abstract unix domain sockets Since the struct has a fixed-lenght char[] its sizeof() contains trailing NUL octets which results in corrupt abstract sockets. Instead, take the strlen(3) of the path, plus the single NUL octet (which identifies the path as an abstract path rather than a file- system path) plus the offset from the start of the struct to the start of the char array. This fixes: https://bugs.freedesktop.org/show_bug.cgi?id=15677 diff --git a/Xtranssock.c b/Xtranssock.c index 8f64429..9be7f5a 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -1180,7 +1180,7 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, if (abstract) { sockname.sun_path[0] = '\0'; - namelen = sizeof(sockname); + namelen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&sockname.sun_path[1]); } else unlink (sockname.sun_path); commit 3a2a5375b8aab85697b4f2644ab99c3ccf79e658 Author: Colin Harrison <colin.harrison-at-virgin.net> Date: Wed Apr 23 10:39:30 2008 +0100 Only call WSAGetLastError() if there has been an error condition. diff --git a/Xtranssock.c b/Xtranssock.c index 5ac6a62..8f64429 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -2221,7 +2221,7 @@ TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend) #ifdef WIN32 { int ret = ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend); - errno = WSAGetLastError(); + if (ret == SOCKET_ERROR) errno = WSAGetLastError(); return ret; } #else @@ -2248,7 +2248,7 @@ TRANS(SocketRead) (XtransConnInfo ciptr, char *buf, int size) { int ret = recv ((SOCKET)ciptr->fd, buf, size, 0); #ifdef WIN32 - errno = WSAGetLastError(); + if (ret == SOCKET_ERROR) errno = WSAGetLastError(); #endif return ret; } @@ -2268,7 +2268,7 @@ TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size) { int ret = send ((SOCKET)ciptr->fd, buf, size, 0); #ifdef WIN32 - errno = WSAGetLastError(); + if (ret == SOCKET_ERROR) errno = WSAGetLastError(); #endif return ret; } @@ -2307,7 +2307,7 @@ TRANS(SocketDisconnect) (XtransConnInfo ciptr) #ifdef WIN32 { int ret = shutdown (ciptr->fd, 2); - errno = WSAGetLastError(); + if (ret == SOCKET_ERROR) errno = WSAGetLastError(); return ret; } #else @@ -2326,7 +2326,7 @@ TRANS(SocketINETClose) (XtransConnInfo ciptr) #ifdef WIN32 { int ret = close (ciptr->fd); - errno = WSAGetLastError(); + if (ret == SOCKET_ERROR) errno = WSAGetLastError(); return ret; } #else commit ac13a1a34b61247a21da130f0ba9922f35d3dc3b Author: Alan Coopersmith <[EMAIL PROTECTED]> Date: Tue Apr 15 12:32:35 2008 -0700 Sun bug #6688467: _X11TransConvertAddress: Unknown family type on 64-bit SPARC Check for socklen_t definition and if found use it instead of size_t or int for the length argument to getpeername/getsockname/etc. <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6688467> diff --git a/Xtranssock.c b/Xtranssock.c index da4afe9..5ac6a62 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -281,6 +281,14 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr); #define MAXHOSTNAMELEN 255 #endif +#if defined HAVE_SOCKLEN_T || (defined(IPv6) && defined(AF_INET6)) +# define SOCKLEN_T socklen_t +#elif defined(SVR4) || defined(__SCO__) +# define SOCKLEN_T size_t +#else +# define SOCKLEN_T int +#endif + /* * This provides compatibility for apps linked against system libraries * that don't have IPv6 support. @@ -330,11 +338,7 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr) #endif struct sockaddr_in socknamev4; void *socknamePtr; -#if defined(SVR4) || defined(__SCO__) - size_t namelen; -#else - int namelen; -#endif + SOCKLEN_T namelen; PRMSG (3,"SocketINETGetAddr(%p)\n", ciptr, 0, 0); @@ -407,11 +411,7 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr) #endif struct sockaddr_in socknamev4; void *socknamePtr; -#if defined(SVR4) || defined(__SCO__) - size_t namelen; -#else - int namelen; -#endif + SOCKLEN_T namelen; #if defined(IPv6) && defined(AF_INET6) if (haveIPv6 && ciptr->family == AF_INET6) @@ -918,7 +918,7 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr, int socknamelen, unsigned int flags) { - int namelen = socknamelen; + SOCKLEN_T namelen = socknamelen; int fd = ciptr->fd; int retry; @@ -998,7 +998,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int struct sockaddr_in sockname; #endif unsigned short sport; - int namelen = sizeof(sockname); + SOCKLEN_T namelen = sizeof(sockname); int status; long tmpport; #ifdef XTHREADS_NEEDS_BYNAMEPARAMS @@ -1315,7 +1315,7 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status) { XtransConnInfo newciptr; struct sockaddr_in sockname; - int namelen = sizeof(sockname); + SOCKLEN_T namelen = sizeof(sockname); PRMSG (2, "SocketINETAccept(%p,%d)\n", ciptr, ciptr->fd, 0); @@ -1394,11 +1394,7 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) { XtransConnInfo newciptr; struct sockaddr_un sockname; -#if defined(SVR4) || defined(__SCO__) - size_t namelen = sizeof sockname; -#else - int namelen = sizeof sockname; -#endif + SOCKLEN_T namelen = sizeof sockname; PRMSG (2, "SocketUNIXAccept(%p,%d)\n", ciptr, ciptr->fd, 0); @@ -2031,11 +2027,11 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) { struct sockaddr_un sockname; - int namelen; + SOCKLEN_T namelen; #if defined(hpux) && defined(X11_t) struct sockaddr_un old_sockname; - int old_namelen; + SOCKLEN_T old_namelen; #endif int abstract = 0; diff --git a/xtrans.m4 b/xtrans.m4 index 1d80595..dfc5dd3 100644 --- a/xtrans.m4 +++ b/xtrans.m4 @@ -52,6 +52,12 @@ AC_DEFUN([XTRANS_TCP_FLAGS],[ #include <sys/socket.h> #include <netinet/in.h> ]) + + # POSIX.1g changed the type of pointer passed to getsockname/getpeername/etc. + AC_CHECK_TYPES([socklen_t], [], [], [ +AC_INCLUDES_DEFAULT +#include <sys/socket.h>]) + ]) # XTRANS_TCP_FLAGS # XTRANS_CONNECTION_FLAGS() commit 556a351de83fc6f401b02213dae95731553c216d Author: Loïc Minier <[EMAIL PROTECTED]> Date: Mon Mar 24 15:38:27 2008 -0400 Bug #10489: Don't retry unix socket connect()s on ENOENT. If the socket isn't there, it's not gonna magically appear. Either it's a server socket and you should have just waited for the SIGUSR1 from the server, or it's a stale reference to an ICE socket. However, do retry once, so fallback from abstract to filesystem namespace works. Originally Debian bug #385976. diff --git a/Xtranssock.c b/Xtranssock.c index 8a7d2ec..da4afe9 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -2146,8 +2146,13 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) errno = olderrno; /* - * If the error was ENOENT, the server may be starting up - * and we should try again. + * If the error was ENOENT, the server may be starting up; we used + * to suggest to try again in this case with + * TRANS_TRY_CONNECT_AGAIN, but this introduced problems for + * processes still referencing stale sockets in their environment. + * Hence, we now return a hard error, TRANS_CONNECT_FAILED, and it + * is suggested that higher level stacks handle retries on their + * level when they face a slow starting server. * * If the error was EWOULDBLOCK or EINPROGRESS then the socket * was non-blocking and we should poll using select @@ -2161,14 +2166,14 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) else if (olderrno == EINTR) return TRANS_TRY_CONNECT_AGAIN; else if (olderrno == ENOENT) { - /* - * If opening as abstract socket failed, try again "normally" - */ - if (abstract) + /* If opening as abstract socket failed, try again normally */ + if (abstract) { ciptr->transptr->flags &= ~(TRANS_ABSTRACT); - return TRANS_TRY_CONNECT_AGAIN; - } - else { + return TRANS_TRY_CONNECT_AGAIN; + } else { + return TRANS_CONNECT_FAILED; + } + } else { PRMSG (2,"SocketUNIXConnect: Can't connect: errno = %d\n", EGET(),0, 0); commit 3de3e666e0653d4e8ae23fc3e6e31864ddad4059 Author: Julien Cristau <[EMAIL PROTECTED]> Date: Sun Mar 23 19:43:32 2008 +0100 BSD44SOCKETS is the wrong check for SOCK_MAXADDRLEN GNU/kFreeBSD defines BSD44SOCKETS, but doesn't have SOCK_MAXADDRLEN. Check for the latter directly. diff --git a/Xtranssock.c b/Xtranssock.c index 94b73e2..8a7d2ec 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -540,7 +540,7 @@ TRANS(SocketReopen) (int i, int type, int fd, char *port) } portlen = strlen(port) + 1; // include space for trailing null -#ifdef BSD44SOCKETS +#ifdef SOCK_MAXADDRLEN if (portlen < 0 || portlen > (SOCK_MAXADDRLEN + 2)) { PRMSG (1, "SocketReopen: invalid portlen %d\n", portlen, 0, 0); return NULL; @@ -551,7 +551,7 @@ TRANS(SocketReopen) (int i, int type, int fd, char *port) PRMSG (1, "SocketReopen: invalid portlen %d\n", portlen, 0, 0); return NULL; } -#endif /*BSD44SOCKETS*/ +#endif /*SOCK_MAXADDRLEN*/ if ((ciptr = (XtransConnInfo) xcalloc ( 1, sizeof(struct _XtransConnInfo))) == NULL) -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]