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)