rbb 99/06/15 10:01:57
Modified: apr/network_io/win32 networkio.h poll.c sockets.c
Log:
Finally have all of the network code for Windows passing the testsock test
case. It doesn't use the best windows API, but these work, and that's more
than I can say for the others.
Revision Changes Path
1.2 +6 -4 apache-apr/apr/network_io/win32/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apache-apr/apr/network_io/win32/networkio.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- networkio.h 1999/06/14 19:11:16 1.1
+++ networkio.h 1999/06/15 17:01:55 1.2
@@ -69,10 +69,12 @@
struct pollfd_t {
ap_context_t *cntxt;
- fd_set read;
- fd_set write;
- fd_set except;
-
+ fd_set *read;
+ int numread;
+ fd_set *write;
+ int numwrite;
+ fd_set *except;
+ int numexcept;
};
#endif /* ! NETWORK_IO_H */
1.2 +38 -20 apache-apr/apr/network_io/win32/poll.c
Index: poll.c
===================================================================
RCS file: /home/cvs/apache-apr/apr/network_io/win32/poll.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- poll.c 1999/06/14 19:11:17 1.1
+++ poll.c 1999/06/15 17:01:55 1.2
@@ -69,9 +69,15 @@
return APR_ENOMEM;
}
(*new)->cntxt = cont;
- FD_ZERO(&(*new)->read);
- FD_ZERO(&(*new)->write);
- FD_ZERO(&(*new)->except);
+ (*new)->read = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ (*new)->write = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ (*new)->except = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ FD_ZERO((*new)->read);
+ (*new)->numread = 0;
+ FD_ZERO((*new)->write);
+ (*new)->numwrite = 0;
+ FD_ZERO((*new)->except);
+ (*new)->numexcept = 0;
return APR_SUCCESS;
}
@@ -79,23 +85,17 @@
struct socket_t *sock, ap_int16_t event)
{
if (event & APR_POLLIN) {
- FD_SET(sock->sock, &aprset->read);
+ FD_SET(sock->sock, aprset->read);
+ aprset->numread++;
}
if (event & APR_POLLPRI) {
- FD_SET(sock->sock, &aprset->read);
+ FD_SET(sock->sock, aprset->read);
+ aprset->numexcept++;
}
if (event & APR_POLLOUT) {
- FD_SET(sock->sock, &aprset->write);
+ FD_SET(sock->sock, aprset->write);
+ aprset->numwrite++;
}
- if (event & APR_POLLERR) {
- FD_SET(sock->sock, &aprset->except);
- }
- if (event & APR_POLLHUP) {
- FD_SET(sock->sock, &aprset->except);
- }
- if (event & APR_POLLNVAL) {
- FD_SET(sock->sock, &aprset->except);
- }
return APR_SUCCESS;
}
@@ -103,6 +103,9 @@
{
int rv;
struct timeval *thetime;
+ fd_set *newread = NULL;
+ fd_set *newwrite = NULL;
+ fd_set *newexcept = NULL;
if (timeout == -1) {
thetime = NULL;
@@ -114,9 +117,24 @@
timeout = timeout % 1000;
thetime->tv_usec = timeout * 1000;
}
+
+ if (aprset->numread != 0) {
+ newread = aprset->read;
+ }
+ if (aprset->numwrite != 0) {
+ newwrite = aprset->write;
+ }
+ if (aprset->numexcept != 0) {
+ newexcept = aprset->except;
+ }
- rv = select(500, &aprset->read, &aprset->read, &aprset->read,
- thetime);
+ if (newread == NULL && newwrite == NULL && newexcept == NULL) {
+ Sleep(100); /* Should sleep for timeout, but that will be fixed
next */
+ return APR_TIMEUP;
+ }
+ else {
+ rv = select(500, newread, newwrite, newexcept, thetime);
+ }
(*nsds) = rv;
if ((*nsds) < 0) {
@@ -138,7 +156,7 @@
data.len = 256;
data.buf = (char *)ap_palloc(aprset->cntxt, 256);
- if (FD_ISSET(sock->sock, &aprset->read)) {
+ if (FD_ISSET(sock->sock, aprset->read)) {
revents |= APR_POLLIN;
if (WSARecv(sock->sock, &data, 1, &dummy, &flags, NULL,
NULL) == SOCKET_ERROR) {
@@ -163,14 +181,14 @@
}
}
}
- if (FD_ISSET(sock->sock, &aprset->write)) {
+ if (FD_ISSET(sock->sock, aprset->write)) {
revents |= APR_POLLOUT;
}
/* I am assuming that the except is for out of band data, not a failed
* connection on a non-blocking socket. Might be a bad assumption, but
* it works for now. rbb.
*/
- if (FD_ISSET(sock->sock, &aprset->except)) {
+ if (FD_ISSET(sock->sock, aprset->except)) {
revents |= APR_POLLPRI;
}
1.2 +14 -8 apache-apr/apr/network_io/win32/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apache-apr/apr/network_io/win32/sockets.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sockets.c 1999/06/14 19:11:17 1.1
+++ sockets.c 1999/06/15 17:01:56 1.2
@@ -91,7 +91,7 @@
/* For right now, we are not using socket groups. We may later.
* No flags to use when creating a socket, so use 0 for that parameter
as well.
*/
- (*new)->sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+ (*new)->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
(*new)->remote_hostname = NULL;
(*new)->addr->sin_family = AF_INET;
@@ -142,9 +142,7 @@
ap_status_t ap_setport(struct socket_t *sock, ap_uint32_t port)
{
- if (WSAHtons(sock->sock, (short)port, &sock->addr->sin_port) != 0) {
- return APR_EEXIST;
- }
+ sock->addr->sin_port = htons((short)port);
return APR_SUCCESS;
}
@@ -179,8 +177,8 @@
sizeof(struct sockaddr_in));
(*new)->addr_len = sizeof(struct sockaddr_in);
- (*new)->sock = WSAAccept(sock->sock, (struct sockaddr *)(*new)->addr,
- &(*new)->addr_len, NULL, 0);
+ (*new)->sock = accept(sock->sock, (struct sockaddr *)(*new)->addr,
+ &(*new)->addr_len);
if ((*new)->sock == INVALID_SOCKET) {
return errno;
@@ -201,6 +199,7 @@
{
struct hostent *hp;
int lasterror;
+ fd_set temp;
if ((sock->sock == INVALID_SOCKET) || (!sock->addr)) {
return APR_ENOTSOCK;
@@ -224,14 +223,21 @@
sock->addr->sin_family = AF_INET;
- if (WSAConnect(sock->sock, (const struct sockaddr *)sock->addr,
sock->addr_len,
- NULL, NULL, NULL, NULL) == 0) {
+ if (connect(sock->sock, (const struct sockaddr *)sock->addr,
+ sock->addr_len) == 0) {
sock->remote_hostname = strdup(hostname);
return APR_SUCCESS;
}
else {
lasterror = WSAGetLastError();
+ if (lasterror == WSAEWOULDBLOCK) {
+ FD_ZERO(&temp);
+ FD_SET(sock->sock, &temp);
+ if (select(sock->sock+1, NULL, &temp, NULL, NULL) == 1) {
+ return APR_SUCCESS;
+ }
return APR_EEXIST;
+ }
}
}