bjh         99/10/23 22:59:23

  Modified:    src/include http_connection.h
               src/lib/apr/include apr_network_io.h
               src/lib/apr/network_io/os2 Makefile.in networkio.h sockets.c
               src/lib/apr/network_io/unix Makefile.in networkio.h
                        sockets.c sockopt.c
               src/lib/apr/test ab_apr.c client.c server.c
               src/main http_connection.c listen.c rfc1413.c
               src/modules/mpm/prefork prefork.c
               src/modules/mpm/spmt_os2 spmt_os2.c
  Added:       src/lib/apr/network_io/os2 sockaddr.c
               src/lib/apr/network_io/unix sockaddr.c
  Log:
  Enhancements for APR network_io. Adds separate local/remote access methods for
  a socket's port, IP address and sockaddr_in.
  
  Updates for Apache code to use these, allowing the correct IP address of
  clients to be logged.
  
  Revision  Changes    Path
  1.9       +3 -0      apache-2.0/src/include/http_connection.h
  
  Index: http_connection.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/http_connection.h,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- http_connection.h 1999/08/31 05:32:18     1.8
  +++ http_connection.h 1999/10/24 05:59:12     1.9
  @@ -59,6 +59,7 @@
   #define APACHE_HTTP_CONNECTION_H
   
   #include "ap_hooks.h"
  +#include "apr_network_io.h"
   
   #ifdef __cplusplus
   extern "C" {
  @@ -67,6 +68,8 @@
   conn_rec *ap_new_connection(ap_context_t *p, server_rec *server, BUFF *inout,
                            const struct sockaddr_in *remaddr,
                            const struct sockaddr_in *saddr, long id);
  +conn_rec *ap_new_apr_connection(ap_context_t *p, server_rec *server, BUFF 
*inout,
  +                         const ap_socket_t *conn_socket, long id);
   CORE_EXPORT(void) ap_process_connection(conn_rec *);
   int ap_process_http_connection(conn_rec *);
   
  
  
  
  1.12      +18 -4     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.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- apr_network_io.h  1999/10/15 14:19:57     1.11
  +++ apr_network_io.h  1999/10/24 05:59:13     1.12
  @@ -64,6 +64,10 @@
   #include "apr_errno.h"
   #include <time.h>
   
  +#ifdef HAVE_NETINET_IN_H
  +#include <netinet/in.h>
  +#endif
  +
   #ifdef __cplusplus
   extern "C" {
   #endif /* __cplusplus */
  @@ -123,10 +127,20 @@
   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);
  -ap_status_t ap_setport(ap_socket_t *, ap_uint32_t);
  -ap_status_t ap_setipaddr(ap_socket_t *, const char *);
  -ap_status_t ap_getport(ap_uint32_t *, ap_socket_t *);
  -ap_status_t ap_getipaddr(char *buf, ap_ssize_t len, const ap_socket_t *sock);
  +
  +ap_status_t ap_set_local_port(ap_socket_t *sock, ap_uint32_t port);
  +ap_status_t ap_set_remote_port(ap_socket_t *sock, ap_uint32_t port);
  +ap_status_t ap_get_local_port(ap_uint32_t *port, ap_socket_t *sock);
  +ap_status_t ap_get_remote_port(ap_uint32_t *port, ap_socket_t *sock);
  +ap_status_t ap_set_local_ipaddr(ap_socket_t *sock, const char *addr);
  +ap_status_t ap_set_remote_ipaddr(ap_socket_t *sock, const char *addr);
  +ap_status_t ap_get_local_ipaddr(char **addr, const ap_socket_t *sock);
  +ap_status_t ap_get_remote_ipaddr(char **addr, const ap_socket_t *sock);
  +
  +#ifdef HAVE_NETINET_IN_H
  +ap_status_t ap_get_local_name(struct sockaddr_in **name, const ap_socket_t 
*sock);
  +ap_status_t ap_get_remote_name(struct sockaddr_in **name, const ap_socket_t 
*sock);
  +#endif
   
   ap_status_t ap_setup_poll(ap_pollfd_t **, ap_int32_t, ap_context_t *);
   ap_status_t ap_poll(ap_pollfd_t *, ap_int32_t *, ap_int32_t);
  
  
  
  1.5       +7 -1      apache-2.0/src/lib/apr/network_io/os2/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/Makefile.in,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Makefile.in       1999/10/18 12:06:53     1.4
  +++ Makefile.in       1999/10/24 05:59:13     1.5
  @@ -18,6 +18,7 @@
        sendrecv.o \
        sockets.o \
        sockopt.o \
  +     sockaddr.o
   
   .c.o:
        $(CC) $(CFLAGS) -c $(INCLUDES) $<
  @@ -63,6 +64,11 @@
    $(INCDIR1)/apr_general.h $(INCDIR1)/apr_config.h \
    $(INCDIR1)/apr_errno.h $(INCDIR1)/apr_lib.h \
    $(INCDIR1)/apr_file_io.h
  +sockaddr.o: sockaddr.c ../unix/sockaddr.c ../unix/networkio.h \
  + $(INCDIR1)/apr_network_io.h $(INCDIR1)/apr_general.h \
  + $(INCDIR1)/apr_config.h $(INCDIR1)/apr_errno.h \
  + $(INCDIR1)/apr_lock.h $(INCDIR1)/apr_lib.h \
  + $(INCDIR1)/apr_file_io.h
   sockets.o: sockets.c networkio.h $(INCDIR1)/apr_network_io.h \
    $(INCDIR1)/apr_general.h $(INCDIR1)/apr_config.h \
    $(INCDIR1)/apr_errno.h $(INCDIR1)/apr_portable.h \
  @@ -73,4 +79,4 @@
    $(INCDIR1)/apr_network_io.h $(INCDIR1)/apr_general.h \
    $(INCDIR1)/apr_config.h $(INCDIR1)/apr_errno.h \
    $(INCDIR1)/apr_lock.h $(INCDIR1)/apr_lib.h \
  - $(INCDIR1)/apr_file_io.h $(INCDIR)/apr_macro.h
  + $(INCDIR1)/apr_file_io.h
  
  
  
  1.4       +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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- networkio.h       1999/10/18 11:36:03     1.3
  +++ networkio.h       1999/10/24 05:59:13     1.4
  @@ -62,7 +62,8 @@
   struct socket_t {
       ap_context_t *cntxt;
       int socketdes;
  -    struct sockaddr_in *addr;
  +    struct sockaddr_in *local_addr;
  +    struct sockaddr_in *remote_addr;
       int addr_len;
       int timeout; 
   };
  
  
  
  1.5       +21 -60    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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- sockets.c 1999/10/18 11:14:21     1.4
  +++ sockets.c 1999/10/24 05:59:14     1.5
  @@ -86,18 +86,21 @@
           return APR_ENOMEM;
       }
       (*new)->cntxt = cont; 
  -    (*new)->addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  -                       sizeof(struct sockaddr_in));
  +    (*new)->local_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  +                         sizeof(struct sockaddr_in));
  +    (*new)->remote_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  +                         sizeof(struct sockaddr_in));
   
  -    if ((*new)->addr == NULL) {
  +    if ((*new)->local_addr == NULL || (*new)->remote_addr == NULL) {
           return APR_ENOMEM;
       }
    
       (*new)->socketdes = socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP);
   
  -    (*new)->addr->sin_family = AF_INET;
  +    (*new)->local_addr->sin_family = AF_INET;
  +    (*new)->remote_addr->sin_family = AF_INET;
   
  -    (*new)->addr_len = sizeof(*(*new)->addr);
  +    (*new)->addr_len = sizeof(*(*new)->local_addr);
       
       if ((*new)->socketdes < 0) {
           return errno;
  @@ -124,57 +127,13 @@
       return socket_cleanup(thesocket);
   }
   
  -ap_status_t ap_setport(struct socket_t *sock, ap_uint32_t port)
  -{
  -    sock->addr->sin_port = htons((short)port);
  -    return APR_SUCCESS;
  -}
  -
  -
  -
  -ap_status_t ap_getport(ap_uint32_t *port, struct socket_t *sock)
  -{
  -    *port = ntohs(sock->addr->sin_port);
  -    return APR_SUCCESS;
  -}
  -
  -
  -
  -ap_status_t ap_setipaddr(struct socket_t *sock, const char *addr)
  -{
  -    ULONG ipaddr;
  -    
  -    if (!strcmp(addr, APR_ANYADDR)) {
  -        sock->addr->sin_addr.s_addr = htonl(INADDR_ANY);
  -        return APR_SUCCESS;
  -    }
  -    
  -    ipaddr = inet_addr(addr);
  -    
  -    if (ipaddr == (ULONG)-1) {
  -        return errno;
  -    }
  -    
  -    *(ULONG *)&sock->addr->sin_addr = ipaddr;
  -    return APR_SUCCESS;
  -}
  -
   
   
  -ap_status_t ap_getipaddr(char *addr, ap_ssize_t len,
  -                      const struct socket_t *sock)
  -{
  -    char *temp = inet_ntoa(sock->addr->sin_addr);
  -    ap_cpystrn(addr,temp,len-1);
  -    return APR_SUCCESS;
  -}
  -
   
  -
   ap_status_t ap_bind(struct socket_t *sock)
   {
  -    sock->addr->sin_addr.s_addr = INADDR_ANY;
  -    if (bind(sock->socketdes, (struct sockaddr *)sock->addr, sock->addr_len) 
== -1)
  +    sock->local_addr->sin_addr.s_addr = INADDR_ANY;
  +    if (bind(sock->socketdes, (struct sockaddr *)sock->local_addr, 
sock->addr_len) == -1)
           return errno;
       else
           return APR_SUCCESS;
  @@ -194,17 +153,18 @@
                               sizeof(struct socket_t));
   
       (*new)->cntxt = sock->cntxt;
  -    (*new)->addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt, 
  -                 sizeof(struct sockaddr_in));
  +    (*new)->remote_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  +                          sizeof(struct sockaddr_in));
  +    (*new)->local_addr = sock->local_addr;
       (*new)->addr_len = sizeof(struct sockaddr_in);
   
  -    (*new)->socketdes = accept(sock->socketdes, (struct sockaddr 
*)(*new)->addr,
  +    (*new)->socketdes = accept(sock->socketdes, (struct sockaddr 
*)(*new)->remote_addr,
                           &(*new)->addr_len);
   
       if ((*new)->socketdes < 0) {
           return errno;
       }
  -    
  +
       ap_register_cleanup((*new)->cntxt, (void *)(*new), 
                           socket_cleanup, NULL);
       return APR_SUCCESS;
  @@ -217,7 +177,7 @@
       if (hostname != NULL) {
           hp = gethostbyname(hostname);
   
  -        if ((sock->socketdes < 0) || (!sock->addr)) {
  +        if ((sock->socketdes < 0) || (!sock->remote_addr)) {
               return APR_ENOTSOCK;
           }
           if (!hp)  {
  @@ -227,16 +187,17 @@
               return h_errno;
           }
       
  -        memcpy((char *)&sock->addr->sin_addr, hp->h_addr_list[0], 
hp->h_length);
  -
  -        sock->addr_len = sizeof(*sock->addr);
  +        memcpy((char *)&sock->remote_addr->sin_addr, hp->h_addr_list[0], 
hp->h_length);
  +        sock->addr_len = sizeof(*sock->remote_addr);
       }
   
  -    if ((connect(sock->socketdes, (const struct sockaddr *)sock->addr, 
sock->addr_len) < 0) &&
  +    if ((connect(sock->socketdes, (const struct sockaddr 
*)sock->remote_addr, sock->addr_len) < 0) &&
           (errno != EINPROGRESS)) {
           return errno;
       }
       else {
  +        int namelen = sizeof(*sock->local_addr);
  +        getsockname(sock->socketdes, (struct sockaddr *)sock->local_addr, 
&namelen);
           return APR_SUCCESS;
       }
   }
  
  
  
  1.1                  apache-2.0/src/lib/apr/network_io/os2/sockaddr.c
  
  Index: sockaddr.c
  ===================================================================
  #include "../unix/sockaddr.c"
  
  
  
  1.6       +1 -0      apache-2.0/src/lib/apr/network_io/unix/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/Makefile.in,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Makefile.in       1999/09/23 18:19:07     1.5
  +++ Makefile.in       1999/10/24 05:59:14     1.6
  @@ -19,6 +19,7 @@
        sendrecv.o \
        sockets.o \
        sockopt.o \
  +     sockaddr.o
   
   .c.o:
        $(CC) $(CFLAGS) -c $(INCLUDES) $<
  
  
  
  1.8       +2 -1      apache-2.0/src/lib/apr/network_io/unix/networkio.h
  
  Index: networkio.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/networkio.h,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- networkio.h       1999/10/16 14:07:00     1.7
  +++ networkio.h       1999/10/24 05:59:15     1.8
  @@ -66,7 +66,8 @@
   struct socket_t {
       ap_context_t *cntxt;
       int socketdes;
  -    struct sockaddr_in *addr;
  +    struct sockaddr_in *local_addr;
  +    struct sockaddr_in *remote_addr;
       size_t addr_len;
       int timeout; 
   #ifndef HAVE_POLL
  
  
  
  1.19      +20 -76    apache-2.0/src/lib/apr/network_io/unix/sockets.c
  
  Index: sockets.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- sockets.c 1999/10/19 19:21:18     1.18
  +++ sockets.c 1999/10/24 05:59:15     1.19
  @@ -97,18 +97,21 @@
           return APR_ENOMEM;
       }
       (*new)->cntxt = cont; 
  -    (*new)->addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  -                       sizeof(struct sockaddr_in));
  +    (*new)->local_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  +                         sizeof(struct sockaddr_in));
  +    (*new)->remote_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt,
  +                          sizeof(struct sockaddr_in));
   
  -    if ((*new)->addr == NULL) {
  +    if ((*new)->local_addr == NULL || (*new)->remote_addr == NULL) {
           return APR_ENOMEM;
       }
    
       (*new)->socketdes = socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP);
   
  -    (*new)->addr->sin_family = AF_INET;
  +    (*new)->local_addr->sin_family = AF_INET;
  +    (*new)->remote_addr->sin_family = AF_INET;
   
  -    (*new)->addr_len = sizeof(*(*new)->addr);
  +    (*new)->addr_len = sizeof(*(*new)->local_addr);
       
       if ((*new)->socketdes < 0) {
           return errno;
  @@ -152,69 +155,6 @@
   }
   
   /* ***APRDOC********************************************************
  - * ap_status_t ap_setport(ap_socket_t *, ap_uint32_t)
  - *    Assocaite a port with a socket.
  - * arg 1) The socket use 
  - * arg 2) The port this socket will be dealing with.
  - * NOTE:  This does not bind the two together, it is just telling apr 
  - *        that this socket is going to use this port if possible.  If
  - *        the port is already used, we won't find out about it here.
  - */
  -ap_status_t ap_setport(struct socket_t *sock, ap_uint32_t port)
  -{
  -    sock->addr->sin_port = htons((short)port);
  -    return APR_SUCCESS;
  -}
  -
  -/* ***APRDOC********************************************************
  - * ap_status_t ap_getport(ap_uint32_t *, ap_socket_t *)
  - *    Return the port with a socket.
  - * arg 1) The socket use 
  - * arg 2) The port this socket will be dealing with.
  - */
  -ap_status_t ap_getport(ap_uint32_t *port, struct socket_t *sock)
  -{
  -    *port = ntohs(sock->addr->sin_port);
  -    return APR_SUCCESS;
  -}
  -
  -/* ***APRDOC********************************************************
  - * ap_status_t ap_setipaddr(ap_socket_t *, cont char *addr)
  - *    Assocaite a socket addr with an apr socket.
  - * arg 1) The socket to use 
  - * arg 2) The IP address to attach to the socket.
  - *        Use APR_ANYADDR to use any IP addr on the machine.
  - * NOTE:  This does not bind the two together, it is just telling apr 
  - *        that this socket is going to use this address if possible. 
  - */
  -ap_status_t ap_setipaddr(struct socket_t *sock, const char *addr)
  -{
  -    if (!strcmp(addr, APR_ANYADDR)) {
  -        sock->addr->sin_addr.s_addr = htonl(INADDR_ANY);
  -        return APR_SUCCESS;
  -    }
  -    if (inet_aton(addr, &sock->addr->sin_addr) == 0) {
  -        return errno;
  -    }
  -    return APR_SUCCESS;
  -}
  -
  -/* ***APRDOC********************************************************
  - * ap_status_t ap_getipaddr(char *addr, int len, const ap_socket_t *)
  - *    Return the IP address associated with an apr socket.
  - * arg 1) A buffer for the IP address associated with the socket.
  - * arg 2) The total length of the buffer (including terminating NUL)
  - * arg 3) The socket to use 
  - */
  -ap_status_t ap_getipaddr(char *addr, ap_ssize_t len,
  -                      const struct socket_t *sock)
  -{
  -    char *temp = inet_ntoa(sock->addr->sin_addr);
  -    ap_cpystrn(addr, temp, len - 1);
  -    return APR_SUCCESS;
  -}
  -
  -/* ***APRDOC********************************************************
    * ap_status_t ap_bind(ap_socket_t *)
    *    Bind the socket to it's assocaited port
    * arg 1) The socket to bind 
  @@ -223,8 +163,8 @@
    */
   ap_status_t ap_bind(struct socket_t *sock)
   {
  -    sock->addr->sin_addr.s_addr = INADDR_ANY;
  -    if (bind(sock->socketdes, (struct sockaddr *)sock->addr, sock->addr_len) 
== -1)
  +    sock->local_addr->sin_addr.s_addr = INADDR_ANY;
  +    if (bind(sock->socketdes, (struct sockaddr *)sock->local_addr, 
sock->addr_len) == -1)
           return errno;
       else
           return APR_SUCCESS;
  @@ -260,14 +200,16 @@
                               sizeof(struct socket_t));
   
       (*new)->cntxt = sock->cntxt;
  -    (*new)->addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt, 
  +    (*new)->local_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt, 
  +                 sizeof(struct sockaddr_in));
  +    (*new)->remote_addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt, 
                    sizeof(struct sockaddr_in));
       (*new)->addr_len = sizeof(struct sockaddr_in);
   #ifndef HAVE_POLL
       (*new)->connected = 1;
   #endif
   
  -    (*new)->socketdes = accept(sock->socketdes, (struct sockaddr 
*)(*new)->addr,
  +    (*new)->socketdes = accept(sock->socketdes, (struct sockaddr 
*)(*new)->remote_addr,
                           &(*new)->addr_len);
   
       if ((*new)->socketdes < 0) {
  @@ -295,7 +237,7 @@
       if (hostname != NULL) {
           hp = gethostbyname(hostname);
   
  -        if ((sock->socketdes < 0) || (!sock->addr)) {
  +        if ((sock->socketdes < 0) || (!sock->remote_addr)) {
               return APR_ENOTSOCK;
           }
           if (!hp)  {
  @@ -305,16 +247,18 @@
               return h_errno;
           }
       
  -        memcpy((char *)&sock->addr->sin_addr, hp->h_addr_list[0], 
hp->h_length);
  +        memcpy((char *)&sock->remote_addr->sin_addr, hp->h_addr_list[0], 
hp->h_length);
   
  -        sock->addr_len = sizeof(*sock->addr);
  +        sock->addr_len = sizeof(*sock->remote_addr);
       }
   
  -    if ((connect(sock->socketdes, (const struct sockaddr *)sock->addr, 
sock->addr_len) < 0) &&
  +    if ((connect(sock->socketdes, (const struct sockaddr 
*)sock->remote_addr, sock->addr_len) < 0) &&
           (errno != EINPROGRESS)) {
           return errno;
       }
       else {
  +        int namelen = sizeof(*sock->local_addr);
  +        getsockname(sock->socketdes, (struct sockaddr *)sock->local_addr, 
&namelen);
   #ifndef HAVE_POLL
        sock->connected=1;
   #endif
  
  
  
  1.11      +1 -1      apache-2.0/src/lib/apr/network_io/unix/sockopt.c
  
  Index: sockopt.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/sockopt.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- sockopt.c 1999/10/19 19:21:20     1.10
  +++ sockopt.c 1999/10/24 05:59:15     1.11
  @@ -204,7 +204,7 @@
   {
       struct hostent *hptr;
       
  -    hptr = gethostbyaddr((char *)&(sock->addr->sin_addr), 
  +    hptr = gethostbyaddr((char *)&(sock->remote_addr->sin_addr), 
                            sizeof(struct in_addr), AF_INET);
       if (hptr != NULL) {
           *name = ap_pstrdup(sock->cntxt, hptr->h_name);
  
  
  
  1.1                  apache-2.0/src/lib/apr/network_io/unix/sockaddr.c
  
  Index: sockaddr.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "networkio.h"
  #include "apr_network_io.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #include <errno.h>
  #include <string.h>
  #include <sys/socket.h>
  #include <netinet/tcp.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_set_local_port(ap_socket_t *socket, ap_uint32_t port)
   *    Assocaite a local port with a socket.
   * arg 1) The socket to set
   * arg 2) The local port this socket will be dealing with.
   * NOTE:  This does not bind the two together, it is just telling apr 
   *        that this socket is going to use this port if possible.  If
   *        the port is already used, we won't find out about it here.
   */
  ap_status_t ap_set_local_port(struct socket_t *sock, ap_uint32_t port)
  {
      sock->local_addr->sin_port = htons((short)port);
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_set_remote_port(ap_socket_t *socket, ap_uint32_t port)
   *    Assocaite a remote port with a socket.
   * arg 1) The socket to enquire about.
   * arg 2) The local port this socket will be dealing with.
   * NOTE:  This does not make a connection to the remote port, it is just 
   *        telling apr which port ap_connect() should attempt to connect to.
   */
  ap_status_t ap_set_remote_port(struct socket_t *sock, ap_uint32_t port)
  {
      sock->remote_addr->sin_port = htons((short)port);
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_local_port(ap_uint32_t *port, ap_socket_t *socket)
   *    Return the local port with a socket.
   * arg 1) The local port this socket is associated with.
   * arg 2) The socket to enquire about.
   */
  ap_status_t ap_get_local_port(ap_uint32_t *port, struct socket_t *sock)
  {
      *port = ntohs(sock->local_addr->sin_port);
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_remote_port(ap_uint32_t *port, ap_socket_t *socket)
   *    Return the remote port associated with a socket.
   * arg 1) The remote port this socket is associated with.
   * arg 2) The socket to enquire about.
   */
  ap_status_t ap_get_remote_port(ap_uint32_t *port, struct socket_t *sock)
  {
      *port = ntohs(sock->remote_addr->sin_port);
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_set_local_ipaddr(ap_socket_t *socket, cont char *addr)
   *    Assocaite a local socket addr with an apr socket.
   * arg 1) The socket to use 
   * arg 2) The IP address to attach to the socket.
   *        Use APR_ANYADDR to use any IP addr on the machine.
   * NOTE:  This does not bind the two together, it is just telling apr 
   *        that this socket is going to use this address if possible. 
   */
  ap_status_t ap_set_local_ipaddr(struct socket_t *sock, const char *addr)
  {
      u_long ipaddr;
      
      if (!strcmp(addr, APR_ANYADDR)) {
          sock->local_addr->sin_addr.s_addr = htonl(INADDR_ANY);
          return APR_SUCCESS;
      }
      
      ipaddr = inet_addr(addr);
      
      if (ipaddr == -1) {
          return errno;
      }
      
      sock->local_addr->sin_addr.s_addr = ipaddr;
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_set_remote_ipaddr(ap_socket_t *socket, cont char *addr)
   *    Assocaite a remote socket addr with an apr socket.
   * arg 1) The socket to use 
   * arg 2) The IP address to attach to the socket.
   * NOTE:  This does not make a connection to the remote address, it is just
   *        telling apr which address ap_connect() should attempt to connect to.
   */
  ap_status_t ap_set_remote_ipaddr(struct socket_t *sock, const char *addr)
  {
      u_long ipaddr;
      
      if (!strcmp(addr, APR_ANYADDR)) {
          sock->remote_addr->sin_addr.s_addr = htonl(INADDR_ANY);
          return APR_SUCCESS;
      }
      
      ipaddr = inet_addr(addr);
      
      if (ipaddr == (u_long)-1) {
          return errno;
      }
      
      sock->remote_addr->sin_addr.s_addr = ipaddr;
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_local_ipaddr(char **addr, const ap_socket_t *socket)
   *    Return the local IP address associated with an apr socket.
   * arg 1) The local IP address associated with the socket.
   * arg 2) The socket to use 
   */
  ap_status_t ap_get_local_ipaddr(char **addr, const struct socket_t *sock)
  {
      *addr = ap_pstrdup(sock->cntxt, inet_ntoa(sock->local_addr->sin_addr));
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_remote_ipaddr(char **addr, const ap_socket_t *socket)
   *    Return the remote IP address associated with an apr socket.
   * arg 1) The remote IP address associated with the socket.
   * arg 2) The socket to use 
   */
  ap_status_t ap_get_remote_ipaddr(char **addr, const struct socket_t *sock)
  {
      *addr = ap_pstrdup(sock->cntxt, inet_ntoa(sock->remote_addr->sin_addr));
      return APR_SUCCESS;
  }
  
  
  
  #if HAVE_NETINET_IN_H
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_local_name(struct sockaddr_in **name, const ap_socket_t 
*socket)
   *    Return the local socket name as a BSD style struct sockaddr_in.
   * arg 1) The local name associated with the socket.
   * arg 2) The socket to use 
   */
  ap_status_t ap_get_local_name(struct sockaddr_in **name, const struct 
socket_t *sock)
  {
      *name = sock->local_addr;
      return APR_SUCCESS;
  }
  
  
  
  /* ***APRDOC********************************************************
   * ap_status_t ap_get_remote_name(struct sockaddr_in **name, const 
ap_socket_t *socket)
   *    Return the remote socket name as a BSD style struct sockaddr_in.
   * arg 1) The remote name associated with the socket.
   * arg 2) The socket to use 
   */
  ap_status_t ap_get_remote_name(struct sockaddr_in **name, const struct 
socket_t *sock)
  {
      *name = sock->remote_addr;
      return APR_SUCCESS;
  }
  #endif
  
  
  
  1.10      +1 -1      apache-2.0/src/lib/apr/test/ab_apr.c
  
  Index: ab_apr.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/test/ab_apr.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ab_apr.c  1999/10/15 14:20:17     1.9
  +++ ab_apr.c  1999/10/24 05:59:16     1.10
  @@ -453,7 +453,7 @@
       if (ap_create_tcp_socket(&c->aprsock, cntxt) != APR_SUCCESS) {
           err("Socket:");
       }
  -    if (ap_setport(c->aprsock, port) != APR_SUCCESS) {
  +    if (ap_set_remote_port(c->aprsock, port) != APR_SUCCESS) {
           err("Port:");
       }
       ap_current_time(c->start);
  
  
  
  1.5       +14 -4     apache-2.0/src/lib/apr/test/client.c
  
  Index: client.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/test/client.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- client.c  1999/10/04 16:37:23     1.4
  +++ client.c  1999/10/24 05:59:17     1.5
  @@ -68,6 +68,8 @@
       ap_status_t stat;
       char datasend[STRLEN] = "Send data test";
       char datarecv[STRLEN];
  +    char *local_ipaddr, *remote_ipaddr;
  +    ap_uint32_t local_port, remote_port;
   
       fprintf(stdout, "Creating context.......");
       if (ap_create_context(&context, NULL) != APR_SUCCESS) {
  @@ -92,7 +94,7 @@
       fprintf(stdout, "OK\n");
   
       fprintf(stdout, "\tClient:  Setting port for socket.......");
  -    if (ap_setport(sock, 8021) != APR_SUCCESS) {
  +    if (ap_set_remote_port(sock, 8021) != APR_SUCCESS) {
           ap_close_socket(sock);
           fprintf(stderr, "Couldn't set the port correctly\n");
           exit(-1);
  @@ -100,9 +102,11 @@
       fprintf(stdout, "OK\n");           
   
       fprintf(stdout, "\tClient:  Connecting to socket.......");
  -do {
  -    stat = ap_connect(sock, "127.0.0.1");
  -} while (stat == APR_ECONNREFUSED);
  +
  +    do {
  +      stat = ap_connect(sock, "127.0.0.1");
  +    } while (stat == APR_ECONNREFUSED);
  +
       if (stat != APR_SUCCESS) {
           ap_close_socket(sock);
           fprintf(stderr, "Could not connect  %d\n", stat);
  @@ -110,6 +114,12 @@
           exit(-1);
       }
       fprintf(stdout, "OK\n");
  +
  +    ap_get_remote_ipaddr(&remote_ipaddr, sock);
  +    ap_get_remote_port(&remote_port, sock);
  +    ap_get_local_ipaddr(&local_ipaddr, sock);
  +    ap_get_local_port(&local_port, sock);
  +    fprintf(stdout, "\tClient socket: %s:%u -> %s:%u\n", local_ipaddr, 
local_port, remote_ipaddr, remote_port);
   
       fprintf(stdout, "\tClient:  Trying to send data over socket.......");
       length = STRLEN;
  
  
  
  1.6       +9 -1      apache-2.0/src/lib/apr/test/server.c
  
  Index: server.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/test/server.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- server.c  1999/10/10 20:35:00     1.5
  +++ server.c  1999/10/24 05:59:17     1.6
  @@ -69,6 +69,8 @@
       ap_pollfd_t *sdset;
       char datasend[STRLEN];
       char datarecv[STRLEN] = "Recv data test";
  +    char *local_ipaddr, *remote_ipaddr;
  +    ap_uint32_t local_port, remote_port;
   
       fprintf(stdout, "Creating context.......");
       if (ap_create_context(&context, NULL) != APR_SUCCESS) {
  @@ -93,7 +95,7 @@
       fprintf(stdout, "OK\n");
   
       fprintf(stdout, "\tServer:  Setting port for socket.......");
  -    if (ap_setport(sock, 8021) != APR_SUCCESS) {
  +    if (ap_set_local_port(sock, 8021) != APR_SUCCESS) {
           ap_close_socket(sock);
           fprintf(stderr, "Couldn't set the port correctly\n");
           exit(-1);
  @@ -142,6 +144,12 @@
           exit(-1);
       }
       fprintf(stdout, "OK\n");
  +
  +    ap_get_remote_ipaddr(&remote_ipaddr, sock2);
  +    ap_get_remote_port(&remote_port, sock2);
  +    ap_get_local_ipaddr(&local_ipaddr, sock2);
  +    ap_get_local_port(&local_port, sock2);
  +    fprintf(stdout, "\tServer socket: %s:%u -> %s:%u\n", local_ipaddr, 
local_port, remote_ipaddr, remote_port);
   
       length = STRLEN;
       fprintf(stdout, "\tServer:  Trying to recv data from socket.......");
  
  
  
  1.22      +12 -0     apache-2.0/src/main/http_connection.c
  
  Index: http_connection.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_connection.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- http_connection.c 1999/10/13 05:24:13     1.21
  +++ http_connection.c 1999/10/24 05:59:18     1.22
  @@ -288,3 +288,15 @@
   
       return conn;
   }
  +
  +
  +
  +conn_rec *ap_new_apr_connection(ap_context_t *p, server_rec *server, BUFF 
*inout,
  +                         const ap_socket_t *conn_socket, long id)
  +{
  +    struct sockaddr_in *sa_local, *sa_remote;
  +
  +    ap_get_local_name(&sa_local, conn_socket);
  +    ap_get_remote_name(&sa_remote, conn_socket);
  +    return ap_new_connection(p, server, inout, sa_remote, sa_local, id);
  +}
  
  
  
  1.16      +5 -5      apache-2.0/src/main/listen.c
  
  Index: listen.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/listen.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- listen.c  1999/10/20 12:49:55     1.15
  +++ listen.c  1999/10/24 05:59:18     1.16
  @@ -158,13 +158,13 @@
       ap_listen_rec **walk;
       ap_listen_rec *new;
       ap_status_t status;
  -    char oldaddr[17];
  +    char *oldaddr;
       unsigned int oldport;
   
       /* see if we've got an old listener for this address:port */
       for (walk = &old_listeners; *walk; walk = &(*walk)->next) {
  -        ap_getport(&oldport, (*walk)->sd);
  -     ap_getipaddr(oldaddr,sizeof oldaddr,(*walk)->sd);
  +        ap_get_local_port(&oldport, (*walk)->sd);
  +     ap_get_local_ipaddr(&oldaddr,(*walk)->sd);
        if (!strcmp(oldaddr, addr) && port == oldport) {
            /* re-use existing record */
            new = *walk;
  @@ -184,8 +184,8 @@
                    "make_sock: failed to get a socket for %s", addr);
           return;
       }
  -    ap_setport(new->sd, port);
  -    ap_setipaddr(new->sd, addr);
  +    ap_set_local_port(new->sd, port);
  +    ap_set_local_ipaddr(new->sd, addr);
       new->next = ap_listeners;
       ap_listeners = new;
   }
  
  
  
  1.7       +6 -6      apache-2.0/src/main/rfc1413.c
  
  Index: rfc1413.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/rfc1413.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- rfc1413.c 1999/10/20 12:49:56     1.6
  +++ rfc1413.c 1999/10/24 05:59:18     1.7
  @@ -124,26 +124,26 @@
        * addresses from the query socket.
        */
   
  -    ap_setport(sock, ANY_PORT);
  -    ap_setipaddr(sock, local_ip); 
  +    ap_set_local_port(sock, ANY_PORT);
  +    ap_set_local_ipaddr(sock, local_ip);
   
       if ((status = ap_bind(sock)) != APR_SUCCESS) {
        ap_log_error(APLOG_MARK, APLOG_CRIT, status, srv,
                    "bind: rfc1413: Error binding to local port");
        return -1;
       }
  -    ap_getport(&sav_our_port, sock);
  +    ap_get_local_port(&sav_our_port, sock);
   
   /*
    * errors from connect usually imply the remote machine doesn't support
    * the service
    */
  -    ap_setport(sock, RFC1413_PORT);
  -    ap_setipaddr(sock, rmt_ip); 
  +    ap_set_remote_port(sock, RFC1413_PORT);
  +    ap_set_remote_ipaddr(sock, rmt_ip);
                       
       if (ap_connect(sock, NULL) != APR_SUCCESS)
           return -1;
  -    ap_getport(&sav_rmt_port, sock);
  +    ap_get_remote_port(&sav_rmt_port, sock);
   
   /* send the data */
       buflen = ap_snprintf(buffer, sizeof(buffer), "%u,%u\r\n", sav_rmt_port,
  
  
  
  1.47      +1 -3      apache-2.0/src/modules/mpm/prefork/prefork.c
  
  Index: prefork.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/prefork/prefork.c,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- prefork.c 1999/10/20 12:50:05     1.46
  +++ prefork.c 1999/10/24 05:59:20     1.47
  @@ -2239,9 +2239,7 @@
   
        ap_bpush_iol(conn_io, iol);
   
  -     current_conn = ap_new_connection(ptrans, server_conf, conn_io,
  -                                      (struct sockaddr_in *) &sa_client,
  -                                      (struct sockaddr_in *) &sa_server,
  +     current_conn = ap_new_apr_connection(ptrans, server_conf, conn_io, csd,
                                         my_child_num);
   
        ap_process_connection(current_conn);
  
  
  
  1.17      +2 -4      apache-2.0/src/modules/mpm/spmt_os2/spmt_os2.c
  
  Index: spmt_os2.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/spmt_os2/spmt_os2.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- spmt_os2.c        1999/10/20 15:15:36     1.16
  +++ spmt_os2.c        1999/10/24 05:59:22     1.17
  @@ -1166,10 +1166,8 @@
        conn_io = ap_bcreate(ptrans, B_RDWR);
           ap_bpush_iol(conn_io, iol);
   
  -     current_conn = ap_new_connection(ptrans, server_conf, conn_io,
  -                                      (struct sockaddr_in *) &sa_client,
  -                                      (struct sockaddr_in *) &sa_server,
  -                                      THREAD_GLOBAL(child_num));
  +     current_conn = ap_new_apr_connection(ptrans, server_conf, conn_io, csd,
  +                                             THREAD_GLOBAL(child_num));
   
        ap_process_connection(current_conn);
       }
  
  
  

Reply via email to