Marc Aurele La France writes: > > I don't like the peppering of this code with more OS #ifdef's. I think > the approach espoused by Itojun, Todd, Matthieu and Andrew is better. > So maybe you can tell what the big difference is? It tries to preserve more of the old behavoir with respect to the -nolisten and -pn/-nopn option.
You can of course remove the 'defined (Linux)' as this patch should work for all systems as it allows bind() for ipv4 to fail silently. I've attached a corrected version below. Egbert.
Index: Xtrans.c =================================================================== RCS file: /home/x-cvs/xc/lib/xtrans/Xtrans.c,v retrieving revision 3.31 diff -u -w -r3.31 Xtrans.c --- Xtrans.c 20 Jul 2003 16:12:15 -0000 3.31 +++ Xtrans.c 23 Jul 2003 13:35:40 -0000 @@ -90,10 +90,10 @@ #endif /* STREAMSCONN */ #if defined(TCPCONN) { &TRANS(SocketTCPFuncs), TRANS_SOCKET_TCP_INDEX }, - { &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX }, #if defined(IPv6) && defined(AF_INET6) { &TRANS(SocketINET6Funcs), TRANS_SOCKET_INET6_INDEX }, #endif /* IPv6 */ + { &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX }, #endif /* TCPCONN */ #if defined(DNETCONN) { &TRANS(DNETFuncs), TRANS_DNET_INDEX }, @@ -768,10 +768,10 @@ #ifdef TRANS_SERVER int -TRANS(CreateListener) (XtransConnInfo ciptr, char *port) +TRANS(CreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags) { - return ciptr->transptr->CreateListener (ciptr, port); + return ciptr->transptr->CreateListener (ciptr, port, flags); } int @@ -1037,6 +1037,9 @@ char buffer[256]; /* ??? What size ?? */ XtransConnInfo ciptr, temp_ciptrs[NUMTRANS]; int status, i, j; +#if defined (linux) && defined(IPv6) && defined(AF_INET6) + Bool ipv6_succ = FALSE; +#endif PRMSG (2,"MakeAllCOTSServerListeners(%s,%p)\n", port ? port : "NULL", ciptrs_ret, 0); @@ -1046,6 +1049,7 @@ for (i = 0; i < NUMTRANS; i++) { Xtransport *trans = Xtransports[i].transport; + unsigned int flags = 0; if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) continue; @@ -1065,8 +1069,13 @@ trans->TransName, 0, 0); continue; } +#if defined (linux) && defined(IPv6) && defined(AF_INET6) + if ((Xtransports[i].transport_id == TRANS_SOCKET_INET_INDEX + && ipv6_succ)) + flags |= ADDR_IN_USE_ALLOWED; +#endif - if ((status = TRANS(CreateListener (ciptr, port))) < 0) + if ((status = TRANS(CreateListener (ciptr, port, flags))) < 0) { if (status == TRANS_ADDR_IN_USE) { @@ -1098,6 +1107,11 @@ } } +#if defined (linux) && defined(IPv6) && defined(AF_INET6) + if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX) + ipv6_succ = TRUE; +#endif + PRMSG (5, "MakeAllCOTSServerListeners: opened listener for %s, %d\n", trans->TransName, ciptr->fd, 0); @@ -1165,7 +1179,7 @@ continue; } - if ((status = TRANS(CreateListener (ciptr, port))) < 0) + if ((status = TRANS(CreateListener (ciptr, port, 0))) < 0) { if (status == TRANS_ADDR_IN_USE) { Index: Xtrans.h =================================================================== RCS file: /home/x-cvs/xc/lib/xtrans/Xtrans.h,v retrieving revision 3.21 diff -u -w -r3.21 Xtrans.h --- Xtrans.h 20 Jul 2003 16:12:15 -0000 3.21 +++ Xtrans.h 23 Jul 2003 13:35:41 -0000 @@ -339,7 +339,8 @@ int TRANS(CreateListener)( XtransConnInfo, /* ciptr */ - char * /* port */ + char *, /* port */ + unsigned int /* flags */ ); int TRANS(NoListen) ( Index: Xtransint.h =================================================================== RCS file: /home/x-cvs/xc/lib/xtrans/Xtransint.h,v retrieving revision 3.35 diff -u -w -r3.35 Xtransint.h --- Xtransint.h 26 Nov 2002 01:12:30 -0000 3.35 +++ Xtransint.h 23 Jul 2003 13:35:41 -0000 @@ -26,7 +26,7 @@ from The Open Group. */ -/* $XFree86: xc/lib/xtrans/Xtransint.h,v 3.35 2002/11/26 01:12:30 dawes Exp $ */ +/* $XFree86: xc/lib/xtrans/Xtransint.h,v 3.34 2002/11/20 23:00:36 dawes Exp $ */ /* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA * @@ -283,10 +283,13 @@ ); #ifdef TRANS_SERVER +/* Flags */ +# define ADDR_IN_USE_ALLOWED 1 int (*CreateListener)( XtransConnInfo, /* connection */ - char * /* port */ + char *, /* port */ + unsigned int /* flags */ ); int (*ResetListener)( Index: Xtranssock.c =================================================================== RCS file: /home/x-cvs/xc/lib/xtrans/Xtranssock.c,v retrieving revision 3.59 diff -u -w -r3.59 Xtranssock.c --- Xtranssock.c 18 Jul 2003 15:39:48 -0000 3.59 +++ Xtranssock.c 23 Jul 2003 13:35:41 -0000 @@ -783,7 +783,8 @@ static int TRANS(SocketCreateListener) (XtransConnInfo ciptr, - struct sockaddr *sockname, int socknamelen) + struct sockaddr *sockname, + int socknamelen, unsigned int flags) { int namelen = socknamelen; @@ -803,7 +804,10 @@ while (bind (fd, (struct sockaddr *) sockname, namelen) < 0) { - if (errno == EADDRINUSE) + if (errno == EADDRINUSE) { + if (flags & ADDR_IN_USE_ALLOWED) + break; + } else return TRANS_ADDR_IN_USE; if (retry-- == 0) { @@ -853,7 +857,7 @@ #ifdef TCPCONN static int -TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port) +TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags) { #if defined(IPv6) && defined(AF_INET6) @@ -958,7 +962,7 @@ #endif if ((status = TRANS(SocketCreateListener) (ciptr, - (struct sockaddr *) &sockname, namelen)) < 0) + (struct sockaddr *) &sockname, namelen, flags)) < 0) { PRMSG (1, "SocketINETCreateListener: ...SocketCreateListener() failed\n", @@ -983,7 +987,8 @@ #ifdef UNIXCONN static int -TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port) +TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, + unsigned int flags) { struct sockaddr_un sockname; @@ -1034,7 +1039,7 @@ unlink (sockname.sun_path); if ((status = TRANS(SocketCreateListener) (ciptr, - (struct sockaddr *) &sockname, namelen)) < 0) + (struct sockaddr *) &sockname, namelen, flags)) < 0) { PRMSG (1, "SocketUNIXCreateListener: ...SocketCreateListener() failed\n",