summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>1999-10-26 01:58:10 +0000
committerwtc%netscape.com <devnull@localhost>1999-10-26 01:58:10 +0000
commit31d015914bdd3a4a82736576bc3d17feca17bc28 (patch)
treeb03b8f97e0961697672c12a74cc4215847d1606d
parentce44957c957676c2f316671fd480a981f8bd47d1 (diff)
downloadnspr-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.h1
-rw-r--r--pr/include/md/_os2.h1
-rw-r--r--pr/include/md/_unixos.h1
-rw-r--r--pr/include/md/_win16.h1
-rw-r--r--pr/include/md/_win95.h1
-rw-r--r--pr/include/md/_winnt.h1
-rw-r--r--pr/src/io/prsocket.c17
-rw-r--r--pr/src/pthreads/ptio.c11
-rw-r--r--pr/tests/accept.c27
-rw-r--r--pr/tests/acceptread.c9
-rw-r--r--pr/tests/sel_spd.c15
-rw-r--r--pr/tests/servr_kk.c11
-rw-r--r--pr/tests/servr_ku.c11
-rw-r--r--pr/tests/servr_uk.c11
-rw-r--r--pr/tests/servr_uu.c11
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);