stoddard    00/01/26 21:58:14

  Modified:    src/lib/apr/network_io/win32 sendrecv.c sockets.c
               src/main http_protocol.c
               src/modules/mpm/winnt winnt.c winnt.h
               src/os/win32 iol_socket.c
  Log:
  More sendfile work. Use new sendfile API in Apache, update Windows MPM
  to begin using APR socket API.
  Note:
  sendfile on Unix side is broken. Need to detect for NULL hdtr. I'll do
  it later this week if no one else steps up.
  
  Revision  Changes    Path
  1.6       +2 -4      apache-2.0/src/lib/apr/network_io/win32/sendrecv.c
  
  Index: sendrecv.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/win32/sendrecv.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- sendrecv.c        2000/01/26 05:56:40     1.5
  +++ sendrecv.c        2000/01/27 05:57:34     1.6
  @@ -216,7 +216,7 @@
   
       /* TransmitFile can only send one header and one footer */
       memset(&tfb, '0', sizeof (tfb));
  -    if (hdtr->numheaders) {
  +    if (hdtr && hdtr->numheaders) {
           ptfb = &tfb;
           for (i = 0; i < hdtr->numheaders; i++) {
               tfb.HeadLength += hdtr->headers[i].iov_len;
  @@ -230,7 +230,7 @@
               ptr += hdtr->headers[i].iov_len;
           }
       }
  -    if (hdtr->numtrailers) {
  +    if (hdtr && hdtr->numtrailers) {
           ptfb = &tfb;
           for (i = 0; i < hdtr->numtrailers; i++) {
               tfb.TailLength += hdtr->headers[i].iov_len;
  @@ -243,8 +243,6 @@
                      hdtr->trailers[i].iov_len);
               ptr += hdtr->trailers[i].iov_len;
           }
  -
  -
       }
   #ifdef OVERLAPPED
       memset(&overlapped,'0', sizeof(overlapped));
  
  
  
  1.17      +12 -1     apache-2.0/src/lib/apr/network_io/win32/sockets.c
  
  Index: sockets.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/win32/sockets.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- sockets.c 1999/12/17 12:32:16     1.16
  +++ sockets.c 2000/01/27 05:57:38     1.17
  @@ -63,7 +63,7 @@
   #include <windows.h>
   
   
  -ap_status_t socket_cleanup(void *sock)
  +static ap_status_t socket_cleanup(void *sock)
   {
       struct socket_t *thesocket = sock;
       if (closesocket(thesocket->sock) != SOCKET_ERROR) {
  @@ -271,6 +271,17 @@
       if ((*sock) == NULL) {
           (*sock) = (struct socket_t *)ap_palloc(cont, sizeof(struct 
socket_t));
           (*sock)->cntxt = cont;
  +        (*sock)->local_addr = (struct sockaddr_in *)ap_palloc((*sock)->cntxt,
  +                             sizeof(struct sockaddr_in));
  +        (*sock)->remote_addr = (struct sockaddr_in 
*)ap_palloc((*sock)->cntxt,
  +                              sizeof(struct sockaddr_in));
  +
  +        if ((*sock)->local_addr == NULL || (*sock)->remote_addr == NULL) {
  +            return APR_ENOMEM;
  +        }
  +     
  +        (*sock)->addr_len = sizeof(*(*sock)->local_addr);
  +        (*sock)->timeout = -1;
       }
       (*sock)->sock = *thesock;
       return APR_SUCCESS;
  
  
  
  1.51      +6 -2      apache-2.0/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- http_protocol.c   2000/01/19 02:09:03     1.50
  +++ http_protocol.c   2000/01/27 05:57:47     1.51
  @@ -2019,8 +2019,12 @@
   #ifdef HAVE_SENDFILE
       if (!r->chunked) {
           ap_bflush(r->connection->client);
  -        if (iol_sendfile(r->connection->client->iol, fd, len,
  -                         NULL, 0, 0) != APR_SUCCESS) {
  +        if (iol_sendfile(r->connection->client->iol, 
  +                         fd,  /* The file to send */
  +                         NULL, /* header and trailer iovecs */
  +                         0,   /* Offset in file to begin sending from */
  +                         &len,
  +                         0) != APR_SUCCESS) {
               ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
                             "ap_send_fd: iol_sendfile failed.");
           }
  
  
  
  1.36      +14 -7     apache-2.0/src/modules/mpm/winnt/winnt.c
  
  Index: winnt.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/winnt/winnt.c,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- winnt.c   1999/12/20 19:52:51     1.35
  +++ winnt.c   2000/01/27 05:57:57     1.36
  @@ -104,6 +104,15 @@
   int my_pid;
   int parent_pid;
   
  +static ap_status_t socket_cleanup(void *sock)
  +{
  +    struct socket_t *thesocket = sock;
  +    SOCKET sd;
  +    if (ap_get_os_sock(&sd, thesocket) == APR_SUCCESS) {
  +        closesocket(sd);
  +    }
  +    return APR_SUCCESS;
  +}
   
   /* A bunch or routines from os/win32/multithread.c that need to be merged 
into APR
    * or thrown out entirely...
  @@ -995,6 +1004,7 @@
       }
   
       ap_clear_pool(context->ptrans);
  +    context->sock = NULL;
       context->conn_io = ap_bcreate(context->ptrans, B_RDWR);
       context->recv_buf = context->conn_io->inbase;
       context->recv_buf_size = context->conn_io->bufsiz - 2*PADDED_ADDR_SIZE;
  @@ -1149,13 +1159,10 @@
   
           if (!context)
               break;
  -
  -        /* TODO: Register cleanups for our sockets.*/
  -        /* ap_note_cleanups_for_socket(context->ptrans, 
context->accept_socket); */
  -
  -     sock_disable_nagle(context->accept_socket);
  -
  -        iol = win32_attach_socket(context->ptrans, context->accept_socket);
  +        sock_disable_nagle(context->accept_socket);
  +        ap_put_os_sock(&context->sock, &context->accept_socket, 
context->ptrans);
  +        ap_register_cleanup(context->ptrans, context->sock, socket_cleanup, 
ap_null_cleanup);
  +        iol = win32_attach_socket(context->ptrans, context->sock);
           if (iol == NULL) {
               ap_log_error(APLOG_MARK, APLOG_ERR, APR_ENOMEM, server_conf,
                            "worker_main: attach_socket() failed. 
Continuing...");
  
  
  
  1.7       +1 -12     apache-2.0/src/modules/mpm/winnt/winnt.h
  
  Index: winnt.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/winnt/winnt.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- winnt.h   1999/12/13 22:53:25     1.6
  +++ winnt.h   2000/01/27 05:58:00     1.7
  @@ -67,6 +67,7 @@
   typedef struct CompContext {
       OVERLAPPED Overlapped;
       SOCKET accept_socket;
  +    ap_socket_t *sock;
       ap_listen_rec *lr;
       BUFF *conn_io;
       char *recv_buf;
  @@ -77,16 +78,4 @@
       struct sockaddr *sa_client;
       int sa_client_len;
   } COMP_CONTEXT, *PCOMP_CONTEXT;
  -#if 0
  -typedef struct CompContext {
  -    OVERLAPPED Overlapped;
  -    SOCKET accept_socket;
  -    BUFF* conn_io;
  -    ap_context_t *ptrans;
  -    struct sockaddr sa_server;
  -    int sa_server_len;
  -    struct sockaddr sa_client;
  -    int sa_client_len;
  -} COMP_CONTEXT, *PCOMP_CONTEXT;
  -#endif
   #endif /* APACHE_MPM_WINNT_H */
  
  
  
  1.10      +1 -1      apache-2.0/src/os/win32/iol_socket.c
  
  Index: iol_socket.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/os/win32/iol_socket.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- iol_socket.c      2000/01/26 05:56:41     1.9
  +++ iol_socket.c      2000/01/27 05:58:09     1.10
  @@ -141,7 +141,7 @@
       iol_socket *iol;
   
   //    iol = malloc(sizeof(iol_socket));
  -    iol = ap_palloc(p,sizeof(iol_socket));
  +    iol = ap_palloc(p, sizeof(iol_socket));
       if (!iol)
           return (ap_iol*) NULL;
       iol->iol.methods = &socket_methods;
  
  
  

Reply via email to