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;
  +        }
       }
   }
   
  
  
  

Reply via email to