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

Reply via email to