summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2002-04-01 14:18:22 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2002-04-01 14:18:22 +0000
commit910da4cb602df8f3d3004e2d9435239298fcc3b7 (patch)
treede27796faa2808009e25a3df85d9b14af4e2eed4
parent2c8ea0ae2b128d21de318d408eaa51991e8644bb (diff)
downloadlibapr-910da4cb602df8f3d3004e2d9435239298fcc3b7.tar.gz
simplify sockaddr manipulation code a little bit
point out some possible bugs (see "XXX" comments) git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@63211 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--network_io/os2/sockets.c33
-rw-r--r--network_io/win32/sockets.c46
2 files changed, 18 insertions, 61 deletions
diff --git a/network_io/os2/sockets.c b/network_io/os2/sockets.c
index aab2d2edc..96eb1cef0 100644
--- a/network_io/os2/sockets.c
+++ b/network_io/os2/sockets.c
@@ -87,35 +87,8 @@ static apr_status_t socket_cleanup(void *sock)
static void set_socket_vars(apr_socket_t *sock, int family, int type)
{
sock->type = type;
- sock->local_addr->family = family;
- sock->local_addr->sa.sin.sin_family = family;
- sock->remote_addr->family = family;
- sock->remote_addr->sa.sin.sin_family = family;
-
- if (family == AF_INET) {
- sock->local_addr->salen = sizeof(struct sockaddr_in);
- sock->local_addr->addr_str_len = 16;
- sock->local_addr->ipaddr_ptr = &(sock->local_addr->sa.sin.sin_addr);
- sock->local_addr->ipaddr_len = sizeof(struct in_addr);
-
- sock->remote_addr->salen = sizeof(struct sockaddr_in);
- sock->remote_addr->addr_str_len = 16;
- sock->remote_addr->ipaddr_ptr = &(sock->remote_addr->sa.sin.sin_addr);
- sock->remote_addr->ipaddr_len = sizeof(struct in_addr);
- }
-#if APR_HAVE_IPV6
- else if (family == AF_INET6) {
- sock->local_addr->salen = sizeof(struct sockaddr_in6);
- sock->local_addr->addr_str_len = 46;
- sock->local_addr->ipaddr_ptr = &(sock->local_addr->sa.sin6.sin6_addr);
- sock->local_addr->ipaddr_len = sizeof(struct in6_addr);
-
- sock->remote_addr->salen = sizeof(struct sockaddr_in6);
- sock->remote_addr->addr_str_len = 46;
- sock->remote_addr->ipaddr_ptr = &(sock->remote_addr->sa.sin6.sin6_addr);
- sock->remote_addr->ipaddr_len = sizeof(struct in6_addr);
- }
-#endif
+ apr_sockaddr_vars_set(sock->local_addr, family, 0);
+ apr_sockaddr_vars_set(sock->remote_addr, family, 0);
}
static void alloc_socket(apr_socket_t **new, apr_pool_t *p)
@@ -223,6 +196,8 @@ APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new, apr_socket_t *sock, apr
if ((*new)->socketdes < 0) {
return APR_OS2_STATUS(sock_errno());
}
+ /* XXX fix up any pointers which are no longer valid (or just call
+ * apr_sockaddr_vars_set() to do it */
(*new)->remote_addr->port = ntohs((*new)->remote_addr->sa.sin.sin_port);
apr_pool_cleanup_register((*new)->cntxt, (void *)(*new),
socket_cleanup, apr_pool_cleanup_null);
diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c
index f329fda3f..c1db154e9 100644
--- a/network_io/win32/sockets.c
+++ b/network_io/win32/sockets.c
@@ -59,6 +59,8 @@
#include "apr_portable.h"
#include <string.h>
+static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */
+
static apr_status_t socket_cleanup(void *sock)
{
apr_socket_t *thesocket = sock;
@@ -75,35 +77,8 @@ static apr_status_t socket_cleanup(void *sock)
static void set_socket_vars(apr_socket_t *sock, int family, int type)
{
sock->type = type;
- sock->local_addr->family = family;
- sock->local_addr->sa.sin.sin_family = family;
- sock->remote_addr->family = family;
- sock->remote_addr->sa.sin.sin_family = family;
-
- if (family == AF_INET) {
- sock->local_addr->salen = sizeof(struct sockaddr_in);
- sock->local_addr->addr_str_len = 16;
- sock->local_addr->ipaddr_ptr = &(sock->local_addr->sa.sin.sin_addr);
- sock->local_addr->ipaddr_len = sizeof(struct in_addr);
-
- sock->remote_addr->salen = sizeof(struct sockaddr_in);
- sock->remote_addr->addr_str_len = 16;
- sock->remote_addr->ipaddr_ptr = &(sock->remote_addr->sa.sin.sin_addr);
- sock->remote_addr->ipaddr_len = sizeof(struct in_addr);
- }
-#if APR_HAVE_IPV6
- else if (family == AF_INET6) {
- sock->local_addr->salen = sizeof(struct sockaddr_in6);
- sock->local_addr->addr_str_len = 46;
- sock->local_addr->ipaddr_ptr = &(sock->local_addr->sa.sin6.sin6_addr);
- sock->local_addr->ipaddr_len = sizeof(struct in6_addr);
-
- sock->remote_addr->salen = sizeof(struct sockaddr_in6);
- sock->remote_addr->addr_str_len = 46;
- sock->remote_addr->ipaddr_ptr = &(sock->remote_addr->sa.sin6.sin6_addr);
- sock->remote_addr->ipaddr_len = sizeof(struct in6_addr);
- }
-#endif
+ apr_sockaddr_vars_set(sock->local_addr, family, 0);
+ apr_sockaddr_vars_set(sock->remote_addr, family, 0);
}
static void alloc_socket(apr_socket_t **new, apr_pool_t *p)
{
@@ -244,6 +219,7 @@ APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new, apr_socket_t *sock,
(*new)->disconnected = 0;
(*new)->sock = s;
+ /* XXX next line looks bogus w.r.t. AF_INET6 support */
(*new)->remote_addr->salen = sizeof((*new)->remote_addr->sa);
memcpy (&(*new)->remote_addr->sa, &sa, salen);
*(*new)->local_addr = *sock->local_addr;
@@ -270,7 +246,9 @@ APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new, apr_socket_t *sock,
}
if (sock->local_interface_unknown ||
- sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
+ !memcmp(sock->local_addr->ipaddr_ptr,
+ generic_inaddr_any,
+ sock->local_addr->ipaddr_len)) {
/* If the interface address inside the listening socket's local_addr wasn't
* up-to-date, we don't know local interface of the connected socket either.
*
@@ -349,8 +327,12 @@ APR_DECLARE(apr_status_t) apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
if (sock->local_addr->sa.sin.sin_port == 0) {
sock->local_port_unknown = 1;
}
- if (sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
- /* must be using free-range port */
+ if (!memcmp(sock->local_addr->ipaddr_ptr,
+ generic_inaddr_any,
+ sock->local_addr->ipaddr_len) {
+ /* not bound to specific local interface; connect() had to assign
+ * one for the socket
+ */
sock->local_interface_unknown = 1;
}
return APR_SUCCESS;