diff options
author | wtc%netscape.com <devnull@localhost> | 1999-10-26 01:58:10 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 1999-10-26 01:58:10 +0000 |
commit | 31d015914bdd3a4a82736576bc3d17feca17bc28 (patch) | |
tree | b03b8f97e0961697672c12a74cc4215847d1606d | |
parent | ce44957c957676c2f316671fd480a981f8bd47d1 (diff) | |
download | nspr-hg-31d015914bdd3a4a82736576bc3d17feca17bc28.tar.gz |
Bugzilla bug #17184: PR_Bind should not set the SO_REUSEADDR socket
option. The HAVE_SOCKET_REUSEADDR macro is now obsolete. Tests
that depended on the old PR_Bind behavior needs to call PR_SetSocketOption
before PR_Bind.
Modified files: _beos.h, _os2.h, _unixos.h, _win16.h, _win95.h, _winnt.h,
prsocket.c, ptio.c, accept.c, acceptread.c, sel_spd.c, servr_kk.c,
servr_ku.c, servr_uk.c, and servr_uu.c.
-rw-r--r-- | pr/include/md/_beos.h | 1 | ||||
-rw-r--r-- | pr/include/md/_os2.h | 1 | ||||
-rw-r--r-- | pr/include/md/_unixos.h | 1 | ||||
-rw-r--r-- | pr/include/md/_win16.h | 1 | ||||
-rw-r--r-- | pr/include/md/_win95.h | 1 | ||||
-rw-r--r-- | pr/include/md/_winnt.h | 1 | ||||
-rw-r--r-- | pr/src/io/prsocket.c | 17 | ||||
-rw-r--r-- | pr/src/pthreads/ptio.c | 11 | ||||
-rw-r--r-- | pr/tests/accept.c | 27 | ||||
-rw-r--r-- | pr/tests/acceptread.c | 9 | ||||
-rw-r--r-- | pr/tests/sel_spd.c | 15 | ||||
-rw-r--r-- | pr/tests/servr_kk.c | 11 | ||||
-rw-r--r-- | pr/tests/servr_ku.c | 11 | ||||
-rw-r--r-- | pr/tests/servr_uk.c | 11 | ||||
-rw-r--r-- | pr/tests/servr_uu.c | 11 |
15 files changed, 75 insertions, 54 deletions
diff --git a/pr/include/md/_beos.h b/pr/include/md/_beos.h index e8be6c21..bd3f8a7e 100644 --- a/pr/include/md/_beos.h +++ b/pr/include/md/_beos.h @@ -143,7 +143,6 @@ struct _MDDir { #define PR_PATH_SEPARATOR ':' #define PR_PATH_SEPARATOR_STR ":" -#undef HAVE_SOCKET_REUSEADDR #undef HAVE_SOCKET_KEEPALIVE #define GETTIMEOFDAY(tp) gettimeofday((tp), NULL) diff --git a/pr/include/md/_os2.h b/pr/include/md/_os2.h index 5d7ef0fc..f2862480 100644 --- a/pr/include/md/_os2.h +++ b/pr/include/md/_os2.h @@ -55,7 +55,6 @@ #define HAVE_DLL #undef HAVE_THREAD_AFFINITY -#define HAVE_SOCKET_REUSEADDR #define HAVE_SOCKET_KEEPALIVE #undef _PR_HAVE_ATOMIC_OPS diff --git a/pr/include/md/_unixos.h b/pr/include/md/_unixos.h index 9dd1f1fe..f2344b3b 100644 --- a/pr/include/md/_unixos.h +++ b/pr/include/md/_unixos.h @@ -442,7 +442,6 @@ extern PRStatus _MD_getsysinfo(PRSysInfo cmd, char *name, PRUint32 namelen); extern int _MD_unix_get_nonblocking_connect_error(int osfd); -#define HAVE_SOCKET_REUSEADDR #define HAVE_SOCKET_KEEPALIVE /* Memory-mapped files */ diff --git a/pr/include/md/_win16.h b/pr/include/md/_win16.h index 544b4564..a58e53a1 100644 --- a/pr/include/md/_win16.h +++ b/pr/include/md/_win16.h @@ -41,7 +41,6 @@ #define _PR_LOCAL_THREADS_ONLY #undef _PR_GLOBAL_THREADS_ONLY #undef HAVE_THREAD_AFFINITY -#define HAVE_SOCKET_REUSEADDR #define HAVE_SOCKET_KEEPALIVE #define _PR_HAVE_ATOMIC_OPS diff --git a/pr/include/md/_win95.h b/pr/include/md/_win95.h index 89febac7..a993c6b7 100644 --- a/pr/include/md/_win95.h +++ b/pr/include/md/_win95.h @@ -35,7 +35,6 @@ #define HAVE_DLL #undef HAVE_THREAD_AFFINITY -#define HAVE_SOCKET_REUSEADDR #define HAVE_SOCKET_KEEPALIVE #define _PR_HAVE_ATOMIC_OPS #define PR_HAVE_WIN32_NAMED_SHARED_MEMORY diff --git a/pr/include/md/_winnt.h b/pr/include/md/_winnt.h index c75aa9b5..15e605ca 100644 --- a/pr/include/md/_winnt.h +++ b/pr/include/md/_winnt.h @@ -47,7 +47,6 @@ #define HAVE_DLL #define HAVE_CUSTOM_USER_THREADS #define HAVE_THREAD_AFFINITY -#define HAVE_SOCKET_REUSEADDR #define HAVE_SOCKET_KEEPALIVE #define _PR_HAVE_ATOMIC_OPS #define _PR_HAVE_ATOMIC_CAS diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c index cb6dc897..406e19bc 100644 --- a/pr/src/io/prsocket.c +++ b/pr/src/io/prsocket.c @@ -473,23 +473,8 @@ static PRStatus PR_CALLBACK SocketBind(PRFileDesc *fd, const PRNetAddr *addr) PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); return PR_FAILURE; } - } else { -#endif - -#ifdef HAVE_SOCKET_REUSEADDR - if ( setsockopt (fd->secret->md.osfd, (int)SOL_SOCKET, SO_REUSEADDR, -#ifdef XP_OS2_VACPP - (char *)&one, sizeof(one) ) < 0) { -#else - (const void *)&one, sizeof(one) ) < 0) { -#endif - return PR_FAILURE; - } -#endif - -#ifdef XP_UNIX } -#endif +#endif /* XP_UNIX */ result = _PR_MD_BIND(fd, addr, PR_NETADDR_SIZE(addr)); if (result < 0) { diff --git a/pr/src/pthreads/ptio.c b/pr/src/pthreads/ptio.c index e39977c4..35112ad4 100644 --- a/pr/src/pthreads/ptio.c +++ b/pr/src/pthreads/ptio.c @@ -1848,17 +1848,6 @@ static PRStatus pt_Bind(PRFileDesc *fd, const PRNetAddr *addr) return PR_FAILURE; } } - else - { - rv = setsockopt( - fd->secret->md.osfd, SOL_SOCKET, SO_REUSEADDR, - (_PRSockOptVal_t) &one, sizeof(one)); - if (rv == -1) - { - pt_MapError(_PR_MD_MAP_SETSOCKOPT_ERROR, errno); - return PR_FAILURE; - } - } addr_len = PR_NETADDR_SIZE(addr); #ifdef _PR_HAVE_SOCKADDR_LEN diff --git a/pr/tests/accept.c b/pr/tests/accept.c index 71f00b7f..e2fb0a05 100644 --- a/pr/tests/accept.c +++ b/pr/tests/accept.c @@ -75,6 +75,18 @@ static PRInt32 count = 1; static PRFileDesc *output; static PRNetAddr serverAddr; static PRThreadScope thread_scope = PR_LOCAL_THREAD; +static PRInt32 clientCommand; +static PRInt32 iterations; +static PRStatus rv; +static PRFileDesc *listenSock; +static PRFileDesc *clientSock = NULL; +static PRNetAddr listenAddr; +static PRNetAddr clientAddr; +static PRThread *clientThread; +static PRNetAddr *raddr; +static char buf[4096 + 64]; +static PRInt32 status; +static PRInt32 bytesRead; PRIntn failed_already=0; PRIntn debug_mode; @@ -111,7 +123,7 @@ ClientThread(void *_action) PRFileDesc *sock = NULL; serverAddr.inet.family = PR_AF_INET; - serverAddr.inet.port = PR_htons(BASE_PORT); + serverAddr.inet.port = listenAddr.inet.port; serverAddr.inet.ip = PR_htonl(PR_INADDR_LOOPBACK); for (; iterations--;) { @@ -172,19 +184,6 @@ ErrorExit: } -static PRInt32 clientCommand; -static PRInt32 iterations; -static PRStatus rv; -static PRFileDesc *listenSock; -static PRFileDesc *clientSock = NULL; -static PRNetAddr listenAddr; -static PRNetAddr clientAddr; -static PRThread *clientThread; -static PRNetAddr *raddr; -static char buf[4096 + 64]; -static PRInt32 status; -static PRInt32 bytesRead; - static void RunTest(PRInt32 acceptType, PRInt32 clientAction) { diff --git a/pr/tests/acceptread.c b/pr/tests/acceptread.c index f3fcc4f9..d24e93c1 100644 --- a/pr/tests/acceptread.c +++ b/pr/tests/acceptread.c @@ -108,12 +108,21 @@ static void AcceptingThread(void *arg) PRUint8 buf[BUF_SIZE + (20 * sizeof(PRNetAddr))]; PRNetAddr *accept_addr, *listen_addr = (PRNetAddr*)arg; PRFileDesc *accept_sock, *listen_sock = PR_NewTCPSocket(); + PRSocketOptionData sock_opt; if (NULL == listen_sock) { PL_FPrintError(err_out, "PR_NewTCPSocket (server) failed"); PR_ProcessExit(1); } + sock_opt.option = PR_SockOpt_Reuseaddr; + sock_opt.value.reuse_addr = PR_TRUE; + rv = PR_SetSocketOption(listen_sock, &sock_opt); + if (PR_FAILURE == rv) + { + PL_FPrintError(err_out, "PR_SetSocketOption (server) failed"); + PR_ProcessExit(1); + } rv = PR_Bind(listen_sock, listen_addr); if (PR_FAILURE == rv) { diff --git a/pr/tests/sel_spd.c b/pr/tests/sel_spd.c index 4487a7c7..d4c72099 100644 --- a/pr/tests/sel_spd.c +++ b/pr/tests/sel_spd.c @@ -123,6 +123,7 @@ _server_thread(void *arg_id) PRThread *thread; int *id = (int *)arg_id; PRFileDesc *sock; + PRSocketOptionData sockopt; PRNetAddr sa; PRFileDesc * newsock; char *data_buffer = NULL; @@ -152,6 +153,13 @@ _server_thread(void *arg_id) goto done; } + sockopt.option = PR_SockOpt_Reuseaddr; + sockopt.value.reuse_addr = PR_TRUE; + if ( PR_SetSocketOption(sock, &sockopt) == PR_FAILURE) { + fprintf(stderr, "Error setting socket option in server thread %d\n", *id); + goto done; + } + memset(&sa, 0 , sizeof(sa)); sa.inet.family = PR_AF_INET; sa.inet.port = PR_htons(PORT_BASE + *id); @@ -162,13 +170,6 @@ _server_thread(void *arg_id) goto done; } -#if 0 - { - int one = 1; - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one)); - } -#endif - if ( PR_Listen(sock, 32) < 0 ) { fprintf(stderr, "Error listening to socket in server thread %d\n", *id); goto done; diff --git a/pr/tests/servr_kk.c b/pr/tests/servr_kk.c index 2ad019eb..3a225ff1 100644 --- a/pr/tests/servr_kk.c +++ b/pr/tests/servr_kk.c @@ -221,6 +221,7 @@ PRFileDesc * ServerSetup(void) { PRFileDesc *listenSocket; + PRSocketOptionData sockOpt; PRNetAddr serverAddr; PRThread *WorkerThread; @@ -230,6 +231,16 @@ ServerSetup(void) return NULL; } + sockOpt.option = PR_SockOpt_Reuseaddr; + sockOpt.value.reuse_addr = PR_TRUE; + if ( PR_SetSocketOption(listenSocket, &sockOpt) == PR_FAILURE) { + if (debug_mode) printf("\tServer error setting socket option: OS error %d\n", + PR_GetOSError()); + else failed_already=1; + PR_Close(listenSocket); + return NULL; + } + memset(&serverAddr, 0, sizeof(PRNetAddr)); serverAddr.inet.family = PR_AF_INET; serverAddr.inet.port = PR_htons(PORT); diff --git a/pr/tests/servr_ku.c b/pr/tests/servr_ku.c index 9121dc42..53a117fa 100644 --- a/pr/tests/servr_ku.c +++ b/pr/tests/servr_ku.c @@ -222,6 +222,7 @@ PRFileDesc * ServerSetup(void) { PRFileDesc *listenSocket; + PRSocketOptionData sockOpt; PRNetAddr serverAddr; PRThread *WorkerThread; @@ -231,6 +232,16 @@ ServerSetup(void) return NULL; } + sockOpt.option = PR_SockOpt_Reuseaddr; + sockOpt.value.reuse_addr = PR_TRUE; + if ( PR_SetSocketOption(listenSocket, &sockOpt) == PR_FAILURE) { + if (debug_mode) printf("\tServer error setting socket option: OS error %d\n", + PR_GetOSError()); + else failed_already=1; + PR_Close(listenSocket); + return NULL; + } + memset(&serverAddr, 0, sizeof(PRNetAddr)); serverAddr.inet.family = PR_AF_INET; serverAddr.inet.port = PR_htons(PORT); diff --git a/pr/tests/servr_uk.c b/pr/tests/servr_uk.c index c96763c0..ef20cf08 100644 --- a/pr/tests/servr_uk.c +++ b/pr/tests/servr_uk.c @@ -224,6 +224,7 @@ PRFileDesc * ServerSetup(void) { PRFileDesc *listenSocket; + PRSocketOptionData sockOpt; PRNetAddr serverAddr; PRThread *WorkerThread; @@ -233,6 +234,16 @@ ServerSetup(void) return NULL; } + sockOpt.option = PR_SockOpt_Reuseaddr; + sockOpt.value.reuse_addr = PR_TRUE; + if ( PR_SetSocketOption(listenSocket, &sockOpt) == PR_FAILURE) { + if (debug_mode) printf("\tServer error setting socket option: OS error %d\n", + PR_GetOSError()); + else failed_already=1; + PR_Close(listenSocket); + return NULL; + } + memset(&serverAddr, 0, sizeof(PRNetAddr)); serverAddr.inet.family = PR_AF_INET; serverAddr.inet.port = PR_htons(PORT); diff --git a/pr/tests/servr_uu.c b/pr/tests/servr_uu.c index 23db87c0..b6fc3a8f 100644 --- a/pr/tests/servr_uu.c +++ b/pr/tests/servr_uu.c @@ -222,6 +222,7 @@ PRFileDesc * ServerSetup(void) { PRFileDesc *listenSocket; + PRSocketOptionData sockOpt; PRNetAddr serverAddr; PRThread *WorkerThread; @@ -231,6 +232,16 @@ ServerSetup(void) return NULL; } + sockOpt.option = PR_SockOpt_Reuseaddr; + sockOpt.value.reuse_addr = PR_TRUE; + if ( PR_SetSocketOption(listenSocket, &sockOpt) == PR_FAILURE) { + if (debug_mode) printf("\tServer error setting socket option: OS error %d\n", + PR_GetOSError()); + else failed_already=1; + PR_Close(listenSocket); + return NULL; + } + memset(&serverAddr, 0, sizeof(PRNetAddr)); serverAddr.inet.family = PR_AF_INET; serverAddr.inet.port = PR_htons(PORT); |