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