diff options
Diffstat (limited to 'srclib/apr/network_io/unix')
| -rw-r--r-- | srclib/apr/network_io/unix/sockaddr.c | 28 | ||||
| -rw-r--r-- | srclib/apr/network_io/unix/sockets.c | 25 | 
2 files changed, 38 insertions, 15 deletions
| diff --git a/srclib/apr/network_io/unix/sockaddr.c b/srclib/apr/network_io/unix/sockaddr.c index 335fa71f..ed4c474d 100644 --- a/srclib/apr/network_io/unix/sockaddr.c +++ b/srclib/apr/network_io/unix/sockaddr.c @@ -58,6 +58,15 @@ struct apr_ipsubnet_t {  #define GETHOSTBYNAME_BUFLEN 512  #endif +#ifdef _AIX +/* Some levels of AIX getaddrinfo() don't like servname = "0", so + * set servname to "1" when port is 0 and fix it up later. + */ +#define AIX_SERVNAME_HACK 1 +#else +#define AIX_SERVNAME_HACK 0 +#endif +  #ifdef _WIN32_WCE  /* XXX: BS solution.  Need an HAVE_GETSERVBYNAME and actually   * do something here, to provide the obvious proto mappings. @@ -138,6 +147,11 @@ void apr_sockaddr_vars_set(apr_sockaddr_t *addr, int family, apr_port_t port)          addr->sa.sin.sin_port = htons(port);          addr->port = port;      } +#if AIX_SERVNAME_HACK +    else { +        addr->sa.sin.sin_port = htons(port); +    } +#endif      if (family == APR_INET) {          addr->salen = sizeof(struct sockaddr_in); @@ -331,16 +345,12 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,          hints.ai_flags |= AI_NUMERICHOST;  #endif  #else -#ifdef _AIX -        /* But current AIX getaddrinfo() doesn't like servname = "0"; -         * the "1" won't hurt since we use the port parameter to fill -         * in the returned socket addresses later -         */ +#if AIX_SERVNAME_HACK          if (!port) {              servname = "1";          }          else -#endif /* _AIX */ +#endif /* AIX_SERVNAME_HACK */          servname = apr_itoa(p, port);  #endif /* OSF1 */      } @@ -353,12 +363,13 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,      }  #endif      if (error) { -#ifndef WIN32 +#if defined(WIN32) +        return apr_get_netos_error(); +#else          if (error == EAI_SYSTEM) {              return errno;          }          else  -#endif          {              /* issues with representing this with APR's error scheme:               * glibc uses negative values for these numbers, perhaps so  @@ -370,6 +381,7 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,  #endif              return error + APR_OS_START_EAIERR;          } +#endif /* WIN32 */      }      prev_sa = NULL; diff --git a/srclib/apr/network_io/unix/sockets.c b/srclib/apr/network_io/unix/sockets.c index 5552460e..748dd707 100644 --- a/srclib/apr/network_io/unix/sockets.c +++ b/srclib/apr/network_io/unix/sockets.c @@ -222,7 +222,13 @@ apr_status_t apr_socket_accept(apr_socket_t **new, apr_socket_t *sock,      }  #endif      alloc_socket(new, connection_context); -    set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol); + +    /* Set up socket variables -- note that it may be possible for +     * *new to be an AF_INET socket when sock is AF_INET6 in some +     * dual-stack configurations, so ensure that the remote_/local_addr +     * structures are adjusted for the family of the accepted +     * socket: */ +    set_socket_vars(*new, sa.sa.sin.sin_family, SOCK_STREAM, sock->protocol);  #ifndef HAVE_POLL      (*new)->connected = 1; @@ -338,18 +344,18 @@ apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa)  #endif /* SO_ERROR */      } -    if (rc == -1 && errno != EISCONN) { -        return errno; -    }      if (memcmp(sa->ipaddr_ptr, generic_inaddr_any, sa->ipaddr_len)) {          /* A real remote address was passed in.  If the unspecified           * address was used, the actual remote addr will have to be           * determined using getpeername() if required. */ -        /* ### this should probably be a structure copy + fixup as per -         * _accept()'s handling of local_addr */ -        sock->remote_addr = sa;          sock->remote_addr_unknown = 0; + +        /* Copy the address structure details in. */ +        sock->remote_addr->sa = sa->sa; +        sock->remote_addr->salen = sa->salen; +        /* Adjust ipaddr_ptr et al. */ +        apr_sockaddr_vars_set(sock->remote_addr, sa->family, sa->port);      }      if (sock->local_addr->port == 0) { @@ -364,6 +370,11 @@ apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa)           */          sock->local_interface_unknown = 1;      } + +    if (rc == -1 && errno != EISCONN) { +        return errno; +    } +  #ifndef HAVE_POLL      sock->connected=1;  #endif | 
