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