rbb         99/04/19 06:31:39

  Modified:    apr/network_io/unix sendrecv.c
  Log:
  Updated receive to use the same algorithm as send.
  
  Revision  Changes    Path
  1.4       +27 -25    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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- sendrecv.c        1999/04/19 02:57:48     1.3
  +++ sendrecv.c        1999/04/19 13:31:39     1.4
  @@ -96,33 +96,35 @@
   
   apr_ssize_t apr_recv(apr_socket_t *sock, char *buf, int len, time_t sec)
   {
  -    fd_set fdset;
  -    struct timeval tv;
  -    int err = EAGAIN;
  -    int rv;
  +    ssize_t rv;
  +    
  +    do {
  +        rv = read(sock->socketdes, buf, len);
  +    } while (rv == -1 && errno == EINTR);
   
  -    tv.tv_sec = sec;
  -    if (tv.tv_sec == 0) {
  -     return (read(sock->socketdes, buf, len));
  -    }
  -    rv = read(sock->socketdes, buf, len);
  -    if (rv == -1) {
  -     err = errno;
  -     if (err == EAGAIN || errno == EINTR) {
  -         FD_ZERO(&fdset);
  -         FD_SET(sock->socketdes, &fdset);
  -         tv.tv_usec = 0;
  -         do {
  -                rv = select(FD_SETSIZE, &fdset, NULL, NULL, &tv);
  -         } while (rv == -1 && errno == EINTR);
  -            if (rv == -1 || rv == 0) {
  -             err = errno;
  -                return APR_FAILURE;
  -         }
  -         else {
  -             return read(sock->socketdes, buf, len);
  -         }
  +    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, &fdset, NULL, NULL, &tv);
  +        } while (srv == -1 && errno == EINTR);
  +
  +        if (srv < 1) {
  +            return (apr_ssize_t) -1;
  +        }
  +        else {
  +            do {
  +                rv = read(sock->socketdes, buf, len);
  +            } while (rv == -1 && errno == EINTR);
           }
       }
  +    return (apr_ssize_t) rv;
   }
   
  
  
  

Reply via email to