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)