You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@locus.apache.org on 2000/06/14 19:16:50 UTC
cvs commit: apache-2.0/src/lib/apr/network_io/win32 sockets.c sockopt.c
stoddard 00/06/14 10:16:49
Modified: src/lib/apr/network_io/win32 sockets.c sockopt.c
Log:
Get non-blocking network I/O working on Windows. Apache serves pages on Windows
now. Cleaned up some Windows specific bugs with timing out connections as well.
Revision Changes Path
1.30 +5 -2 apache-2.0/src/lib/apr/network_io/win32/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/win32/sockets.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- sockets.c 2000/05/01 14:39:34 1.29
+++ sockets.c 2000/06/14 17:16:47 1.30
@@ -97,11 +97,13 @@
}
(*new)->local_addr->sin_family = AF_INET;
+ (*new)->remote_addr->sin_family = AF_INET;
(*new)->addr_len = sizeof(*(*new)->local_addr);
(*new)->local_addr->sin_port = 0;
-
+
+ (*new)->timeout = -1;
ap_register_cleanup((*new)->cntxt, (void *)(*new),
socket_cleanup, ap_null_cleanup);
return APR_SUCCESS;
@@ -169,6 +171,7 @@
memcpy((*new)->local_addr, sock->local_addr, sizeof(struct sockaddr_in));
(*new)->addr_len = sizeof(struct sockaddr_in);
+ (*new)->timeout = -1;
(*new)->sock = accept(sock->sock, (struct sockaddr *)(*new)->local_addr,
&(*new)->addr_len);
@@ -176,7 +179,7 @@
if ((*new)->sock == INVALID_SOCKET) {
return WSAGetLastError();
}
-
+
ap_register_cleanup((*new)->cntxt, (void *)(*new),
socket_cleanup, ap_null_cleanup);
return APR_SUCCESS;
1.17 +37 -10 apache-2.0/src/lib/apr/network_io/win32/sockopt.c
Index: sockopt.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/win32/sockopt.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- sockopt.c 2000/05/01 14:39:34 1.16
+++ sockopt.c 2000/06/14 17:16:47 1.17
@@ -60,9 +60,9 @@
ap_status_t soblock(SOCKET sd)
{
- int one = 1;
+ int zero = 0;
- if (ioctlsocket(sd, FIONBIO, &one) == SOCKET_ERROR) {
+ if (ioctlsocket(sd, FIONBIO, &zero) == SOCKET_ERROR) {
return WSAGetLastError();
}
return APR_SUCCESS;
@@ -70,9 +70,9 @@
ap_status_t sononblock(SOCKET sd)
{
- int zero = 0;
+ int one = 1;
- if (ioctlsocket(sd, FIONBIO, &zero) == SOCKET_ERROR) {
+ if (ioctlsocket(sd, FIONBIO, &one) == SOCKET_ERROR) {
return WSAGetLastError();
}
return APR_SUCCESS;
@@ -90,13 +90,40 @@
one = 0;
if (opt & APR_SO_TIMEOUT) {
- int timeout;
- sock->timeout = on;
- timeout = on / 1000; /* Windows needs timeout in mSeconds */
- if (setsockopt(sock->sock, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout,
- sizeof(timeout)) == SOCKET_ERROR) {
- return WSAGetLastError();
+ int new_timeout;
+ if (on <= 0)
+ new_timeout = on;
+ else
+ new_timeout = on/1000; /* Windows needs timeout in mSeconds */
+
+ if (new_timeout == 0) {
+ /* Set the socket non-blocking if it isn't already set to non-blocking */
+ if (sock->timeout != 0) {
+ if ((stat = sononblock(sock->sock)) != APR_SUCCESS)
+ return stat;
+ }
+ }
+ else if (new_timeout > 0) {
+ /* Set the socket to blocking if it was previously non-blocking */
+ if (sock->timeout == 0) {
+ if ((stat = soblock(sock->sock)) != APR_SUCCESS)
+ return stat;
+ }
+ /* Reset socket timeouts if the new timeout differs from the old timeout */
+ if (sock->timeout != new_timeout) {
+ setsockopt(sock->sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &new_timeout, sizeof(new_timeout));
+ setsockopt(sock->sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &new_timeout, sizeof(new_timeout));
+ }
+ }
+ else if (new_timeout < 0) {
+ int zero = 0;
+ /* Set the socket to blocking with infinite timeouts */
+ if ((stat = soblock(sock->sock)) != APR_SUCCESS)
+ return stat;
+ setsockopt(sock->sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &zero, sizeof(zero));
+ setsockopt(sock->sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &zero, sizeof(zero));
}
+ sock->timeout = new_timeout;
}
if (opt & APR_SO_KEEPALIVE) {
if (setsockopt(sock->sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof(int)) == -1) {