fielding    99/04/18 19:57:49

  Modified:    apr/network_io/unix sendrecv.c
  Log:
  Fix the algorithm for apr_send.  The same needs to be done for apr_read.
  Why are these functions called send and recv when they have no relation
  to the UNIX system functions send and recv?  write_with_nonblocking_timeout
  is what it does.
  
  Revision  Changes    Path
  1.3       +27 -26    apache-apr/apr/network_io/unix/sendrecv.c
  
  Index: sendrecv.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/network_io/unix/sendrecv.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- sendrecv.c        1999/04/14 15:14:03     1.2
  +++ sendrecv.c        1999/04/19 02:57:48     1.3
  @@ -60,37 +60,38 @@
   #include "apr_network_io.h"
   #include <sys/time.h>
   
  -apr_ssize_t  apr_send(apr_socket_t *sock, const char *buf, int len, time_t 
sec)
  +apr_ssize_t apr_send(apr_socket_t *sock, const char *buf, int len, time_t 
sec)
   {
  -    fd_set fdset;
  -    struct timeval tv;
  -    int err = EAGAIN;
  -    apr_int32_t rv;
  +    ssize_t rv;
       
  -    tv.tv_sec = sec;
  -    if (tv.tv_sec == 0) {
  -        return (write(sock->socketdes, buf, len));
  -    }
  -    rv = write(sock->socketdes, buf, len);
  +    do {
  +        rv = write(sock->socketdes, buf, len);
  +    } while (rv == -1 && errno == EINTR);
  +
  +    if (rv == -1 && errno == EAGAIN && sec > 0) {
  +        struct timeval tv;
  +        fd_set fdset;
  +        int srv;
  +
  +        do {
  +            FD_ZERO(&fdset);
  +            FD_SET(sock->socketdes, &fdset);
  +            tv.tv_sec  = sec;
  +            tv.tv_usec = 0;
  +
  +            srv = select(FD_SETSIZE, NULL, &fdset, NULL, &tv);
  +        } while (srv == -1 && errno == EINTR);
   
  -    if (rv == -1) {
  -        err = errno;
  -     if (err == EAGAIN || errno == EINTR) {
  -         FD_ZERO(&fdset);
  -         FD_SET(sock->socketdes, &fdset);
  -         tv.tv_usec = 0;
  +        if (srv < 1) {
  +            return (apr_ssize_t) -1;
  +        }
  +        else {
               do {
  -             rv = select(FD_SETSIZE, NULL, &fdset, NULL, &tv);
  -         } while (rv == -1 && errno == EINTR);
  -            if (rv == -1 || rv == 0) {
  -             err = errno;
  -                return APR_FAILURE;
  -         }
  -         else {
  -             return write(sock->socketdes, buf, len);
  -         }
  -     }
  +                rv = write(sock->socketdes, buf, len);
  +            } while (rv == -1 && errno == EINTR);
  +        }
       }
  +    return (apr_ssize_t) rv;
   }
   
   apr_ssize_t apr_recv(apr_socket_t *sock, char *buf, int len, time_t sec)
  
  
  

Reply via email to