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