summaryrefslogtreecommitdiff
path: root/srclib/apr/network_io/unix
diff options
context:
space:
mode:
Diffstat (limited to 'srclib/apr/network_io/unix')
-rw-r--r--srclib/apr/network_io/unix/sockaddr.c28
-rw-r--r--srclib/apr/network_io/unix/sockets.c25
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