bjh 99/10/29 06:36:29
Modified: src/lib/apr/include apr_network_io.h src/lib/apr/network_io/os2 sendrecv.c Log: Add new APR function ap_sendv(), a writev for APR sockets. Revision Changes Path 1.15 +4 -0 apache-2.0/src/lib/apr/include/apr_network_io.h Index: apr_network_io.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_network_io.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- apr_network_io.h 1999/10/25 23:55:07 1.14 +++ apr_network_io.h 1999/10/29 13:36:28 1.15 @@ -67,6 +67,9 @@ #ifdef HAVE_NETINET_IN_H #include <netinet/in.h> #endif +#ifdef HAVE_SYS_UIO_H +#include <sys/uio.h> +#endif #ifdef __cplusplus extern "C" { @@ -124,6 +127,7 @@ ap_status_t (*cleanup) (void*)); ap_status_t ap_send(ap_socket_t *, const char *, ap_ssize_t *); +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_recv(ap_socket_t *, char *, ap_ssize_t *); ap_status_t ap_setsocketopt(ap_socket_t *, ap_int32_t, ap_int32_t); 1.3 +44 -0 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.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- sendrecv.c 1999/10/18 11:06:38 1.2 +++ sendrecv.c 1999/10/29 13:36:29 1.3 @@ -134,3 +134,47 @@ return APR_SUCCESS; } + + +ap_status_t ap_sendv(ap_socket_t *sock, const struct iovec *vec, ap_int32_t nvec, ap_int32_t *nbytes) +{ + ap_status_t rv; + struct iovec *tmpvec; + + 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 (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) { + int fds; + int srv; + + do { + fds = sock->socketdes; + srv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1); + } while (srv == -1 && sock_errno() == SOCEINTR); + + 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 (rv < 0) { + *nbytes = 0; + return os2errno(sock_errno()); + } + + *nbytes = rv; + return APR_SUCCESS; +}