bjh 99/11/03 06:03:27
Modified: src/lib/apr/network_io/os2 networkio.h sendrecv.c sockets.c sockopt.c Log: OS/2: Rework ap_send/ap_recv to time out properly on blocking sockets. Revision Changes Path 1.6 +2 -1 apache-2.0/src/lib/apr/network_io/os2/networkio.h Index: networkio.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/networkio.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- networkio.h 1999/10/29 14:21:00 1.5 +++ networkio.h 1999/11/03 14:03:25 1.6 @@ -68,7 +68,8 @@ struct sockaddr_in *local_addr; struct sockaddr_in *remote_addr; int addr_len; - int timeout; + int timeout; + int nonblock; }; struct pollfd_t { 1.6 +68 -78 apache-2.0/src/lib/apr/network_io/os2/sendrecv.c Index: sendrecv.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sendrecv.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- sendrecv.c 1999/10/29 14:21:01 1.5 +++ sendrecv.c 1999/11/03 14:03:25 1.6 @@ -65,38 +65,34 @@ ap_status_t ap_send(struct socket_t *sock, const char *buf, ap_ssize_t *len) { ssize_t rv; - + int fds, err = 0; + do { - rv = send(sock->socketdes, buf, (*len), 0); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (!sock->nonblock || err == SOCEWOULDBLOCK) { + fds = sock->socketdes; + rv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - if (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) { - int fds; - int srv; + if (rv != 1) { + *len = -1; + err = sock_errno(); - do { - fds = sock->socketdes; - srv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - } while (srv == -1 && sock_errno() == SOCEINTR); + if (rv == 0) + return APR_TIMEUP; - if (srv == 0) { - (*len) = -1; - return APR_TIMEUP; - } - else if (srv < 0) { - (*len) = -1; - return os2errno(sock_errno()); - } - else { - do { - rv = send(sock->socketdes, buf, (*len), 0); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (err == SOCEINTR) + continue; + + return os2errno(err); + } } - } - if (rv < 0) { - *len = 0; - return os2errno(sock_errno()); + rv = send(sock->socketdes, buf, (*len), 0); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || err == SOCEWOULDBLOCK); + + if (err) { + *len = -1; + return os2errno(err); } (*len) = rv; @@ -108,38 +104,34 @@ ap_status_t ap_recv(struct socket_t *sock, char *buf, ap_ssize_t *len) { ssize_t rv; - + int fds, err = 0; + do { - rv = recv(sock->socketdes, buf, (*len), 0); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (!sock->nonblock || err == SOCEWOULDBLOCK) { + fds = sock->socketdes; + rv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - if (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) { - int fds; - int srv; + if (rv != 1) { + *len = -1; + err = sock_errno(); - do { - fds = sock->socketdes; - srv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - } while (srv == -1 && sock_errno() == SOCEINTR); + if (rv == 0) + return APR_TIMEUP; - if (srv == 0) { - (*len) = -1; - return APR_TIMEUP; - } - else if (srv < 0) { - (*len) = -1; - return os2errno(sock_errno()); - } - else { - do { - rv = recv(sock->socketdes, buf, (*len), 0); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (err == SOCEINTR) + continue; + + return os2errno(err); + } } - } + + rv = recv(sock->socketdes, buf, (*len), 0); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || err == SOCEWOULDBLOCK); - if (rv < 0) { - *len = 0; - return os2errno(sock_errno()); + if (err) { + *len = -1; + return os2errno(err); } (*len) = rv; @@ -148,45 +140,43 @@ -ap_status_t ap_sendv(ap_socket_t *sock, const struct iovec *vec, ap_int32_t nvec, ap_int32_t *nbytes) +ap_status_t ap_sendv(ap_socket_t *sock, const struct iovec *vec, ap_int32_t nvec, ap_int32_t *len) { ap_status_t rv; struct iovec *tmpvec; + int fds, err = 0; tmpvec = alloca(sizeof(struct iovec) * nvec); memcpy(tmpvec, vec, sizeof(struct iovec) * nvec); do { - rv = writev(sock->socketdes, tmpvec, nvec); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (!sock->nonblock || err == SOCEWOULDBLOCK) { + fds = sock->socketdes; + rv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - if (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) { - int fds; - int srv; + if (rv != 1) { + *len = -1; + err = sock_errno(); - do { - fds = sock->socketdes; - srv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); - } while (srv == -1 && sock_errno() == SOCEINTR); + if (rv == 0) + return APR_TIMEUP; - if (srv == 0) { - return APR_TIMEUP; - } - else if (srv < 0) { - return os2errno(sock_errno()); - } - else { - do { - rv = writev(sock->socketdes, (struct iovec *)vec, nvec); - } while (rv == -1 && sock_errno() == SOCEINTR); + if (err == SOCEINTR) + continue; + + return os2errno(err); + } } - } - - if (rv < 0) { - *nbytes = 0; - return os2errno(sock_errno()); + + rv = writev(sock->socketdes, tmpvec, nvec); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || err == SOCEWOULDBLOCK); + + if (err) { + *len = -1; + return os2errno(err); } - *nbytes = rv; + *len = rv; return APR_SUCCESS; } 1.10 +1 -0 apache-2.0/src/lib/apr/network_io/os2/sockets.c Index: sockets.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sockets.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- sockets.c 1999/11/02 21:21:52 1.9 +++ sockets.c 1999/11/03 14:03:25 1.10 @@ -107,6 +107,7 @@ return os2errno(sock_errno()); } (*new)->timeout = -1; + (*new)->nonblock = FALSE; ap_register_cleanup((*new)->cntxt, (void *)(*new), socket_cleanup, ap_null_cleanup); return APR_SUCCESS; 1.7 +3 -1 apache-2.0/src/lib/apr/network_io/os2/sockopt.c Index: sockopt.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sockopt.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- sockopt.c 1999/10/29 14:21:02 1.6 +++ sockopt.c 1999/11/03 14:03:25 1.7 @@ -98,8 +98,10 @@ } } if (opt & APR_SO_NONBLOCK) { - if (ioctl(sock->socketdes, FIONBIO, (caddr_t)&on, sizeof(on)) == -1) { + if (ioctl(sock->socketdes, FIONBIO, (caddr_t)&one, sizeof(one)) == -1) { return os2errno(sock_errno()); + } else { + sock->nonblock = one; } } if (opt & APR_SO_LINGER) {