diff options
author | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2000-11-16 01:51:36 +0000 |
---|---|---|
committer | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2000-11-16 01:51:36 +0000 |
commit | d9ad3b349120f6878f078161e8080d1ca92ff5c7 (patch) | |
tree | 069da2925ff9bfa0f6170731273b2e5afb442921 | |
parent | 16daafd3201070bda2856b797a99e192f9550ba2 (diff) | |
download | libapr-d9ad3b349120f6878f078161e8080d1ca92ff5c7.tar.gz |
This is a small step toward's David Reid's IPv6 patch. I started
with the part of David's patch which uses apr_sockaddr_t instead of
sockaddr_in inside apr_socket_t, got everything to compile (and seem
to run properly on Unix), and simplified some of the code which
allocates storage for apr_socket_t and fills out fields in
apr_sockaddr_t.
I didn't add all the code from the patch that supports IPv6
throughout. I didn't add any of the API enhancements.
This includes a port of the code to Win32. I'll later commit the
required changes for OS/2.
Submitted by: David Reid
Reviewed by: Jeff Trawick
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@60737 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | include/apr_network_io.h | 5 | ||||
-rw-r--r-- | include/arch/unix/networkio.h | 5 | ||||
-rw-r--r-- | include/arch/win32/networkio.h | 5 | ||||
-rw-r--r-- | network_io/unix/sa_common.c | 22 | ||||
-rw-r--r-- | network_io/unix/sockaddr.c | 16 | ||||
-rw-r--r-- | network_io/unix/sockets.c | 125 | ||||
-rw-r--r-- | network_io/unix/sockopt.c | 4 | ||||
-rw-r--r-- | network_io/win32/sockaddr.c | 12 | ||||
-rw-r--r-- | network_io/win32/sockets.c | 118 | ||||
-rw-r--r-- | network_io/win32/sockopt.c | 4 |
10 files changed, 178 insertions, 138 deletions
diff --git a/include/apr_network_io.h b/include/apr_network_io.h index ea9d14a8e..dd9080db0 100644 --- a/include/apr_network_io.h +++ b/include/apr_network_io.h @@ -158,11 +158,14 @@ typedef struct apr_sockaddr_t { #endif } sa; apr_socklen_t sa_len; /* How big is the sockaddr we're using? */ + int ipaddr_len; /* How big is the ip address structure + * we're using? + */ int addr_str_len; /* How big should the address buffer be? * 16 for v4 or 46 for v6 * used in inet_ntop... */ - void *ipaddr_ptr; /* This points to the IP address + void *ipaddr_ptr; /* This points to the IP address * structure within the appropriate * sockaddr structure. */ diff --git a/include/arch/unix/networkio.h b/include/arch/unix/networkio.h index 3fdc52e2a..45a768e64 100644 --- a/include/arch/unix/networkio.h +++ b/include/arch/unix/networkio.h @@ -122,9 +122,8 @@ struct apr_socket_t { apr_pool_t *cntxt; int socketdes; - struct sockaddr_in *local_addr; - struct sockaddr_in *remote_addr; - apr_socklen_t addr_len; + apr_sockaddr_t *local_addr; + apr_sockaddr_t *remote_addr; apr_interval_time_t timeout; #ifndef HAVE_POLL int connected; diff --git a/include/arch/win32/networkio.h b/include/arch/win32/networkio.h index 3d5897a62..e7657d126 100644 --- a/include/arch/win32/networkio.h +++ b/include/arch/win32/networkio.h @@ -61,9 +61,8 @@ struct apr_socket_t { apr_pool_t *cntxt; SOCKET sock; - struct sockaddr_in *local_addr; - struct sockaddr_in *remote_addr; - size_t addr_len; + apr_sockaddr_t *local_addr; + apr_sockaddr_t *remote_addr; apr_interval_time_t timeout; apr_int32_t disconnected; int local_port_unknown; diff --git a/network_io/unix/sa_common.c b/network_io/unix/sa_common.c index fec3eb8cc..fbf25473d 100644 --- a/network_io/unix/sa_common.c +++ b/network_io/unix/sa_common.c @@ -68,10 +68,11 @@ apr_status_t apr_set_port(apr_socket_t *sock, apr_interface_e which, apr_port_t port) { + /* XXX IPv6 */ if (which == APR_LOCAL) - sock->local_addr->sin_port = htons(port); + sock->local_addr->sa.sin.sin_port = htons(port); else if (which == APR_REMOTE) - sock->remote_addr->sin_port = htons(port); + sock->remote_addr->sa.sin.sin_port = htons(port); else return APR_EINVAL; return APR_SUCCESS; @@ -89,9 +90,10 @@ apr_status_t apr_get_port(apr_port_t *port, apr_interface_e which, apr_socket_t } } - *port = ntohs(sock->local_addr->sin_port); + /* XXX IPv6 */ + *port = ntohs(sock->local_addr->sa.sin.sin_port); } else if (which == APR_REMOTE) - *port = ntohs(sock->remote_addr->sin_port); + *port = ntohs(sock->remote_addr->sa.sin.sin_port); else return APR_EINVAL; return APR_SUCCESS; @@ -107,9 +109,11 @@ apr_status_t apr_get_ipaddr(char **addr, apr_interface_e which, apr_socket_t *so return rv; } } - *addr = apr_pstrdup(sock->cntxt, inet_ntoa(sock->local_addr->sin_addr)); + /* XXX IPv6 */ + *addr = apr_pstrdup(sock->cntxt, inet_ntoa(sock->local_addr->sa.sin.sin_addr)); } else if (which == APR_REMOTE) - *addr = apr_pstrdup(sock->cntxt, inet_ntoa(sock->remote_addr->sin_addr)); + /* XXX IPv6 */ + *addr = apr_pstrdup(sock->cntxt, inet_ntoa(sock->remote_addr->sa.sin.sin_addr)); else return APR_EINVAL; @@ -149,9 +153,11 @@ apr_status_t apr_get_socket_inaddr(apr_in_addr_t *addr, apr_interface_e which, } } - *addr = *(apr_in_addr_t*)&sock->local_addr->sin_addr; + /* XXX IPv6 */ + *addr = *(apr_in_addr_t *)&sock->local_addr->sa.sin.sin_addr; } else if (which == APR_REMOTE) { - *addr = *(apr_in_addr_t*)&sock->remote_addr->sin_addr; + /* XXX IPv6 */ + *addr = *(apr_in_addr_t *)&sock->remote_addr->sa.sin.sin_addr; } else { return APR_EINVAL; } diff --git a/network_io/unix/sockaddr.c b/network_io/unix/sockaddr.c index 99738f027..14b93d629 100644 --- a/network_io/unix/sockaddr.c +++ b/network_io/unix/sockaddr.c @@ -75,12 +75,13 @@ static apr_status_t get_local_addr(apr_socket_t *sock) apr_status_t apr_set_ipaddr(apr_socket_t *sock, apr_interface_e which, const char *addr) { u_long ipaddr; - struct sockaddr_in* sa_ptr; - + struct sockaddr_in *sa_ptr; + + /* XXX IPv6 */ if (which == APR_LOCAL) - sa_ptr = sock->local_addr; + sa_ptr = &sock->local_addr->sa.sin; else if (which == APR_REMOTE) - sa_ptr = sock->remote_addr; + sa_ptr = &sock->remote_addr->sa.sin; else return APR_EINVAL; @@ -100,6 +101,7 @@ apr_status_t apr_set_ipaddr(apr_socket_t *sock, apr_interface_e which, const cha } #if APR_HAVE_NETINET_IN_H +/* XXX IPv6 */ apr_status_t apr_get_local_name(struct sockaddr_in **name, apr_socket_t *sock) { if (sock->local_port_unknown || sock->local_interface_unknown) { @@ -110,15 +112,15 @@ apr_status_t apr_get_local_name(struct sockaddr_in **name, apr_socket_t *sock) } } - *name = sock->local_addr; + *name = &sock->local_addr->sa.sin; return APR_SUCCESS; } - +/* XXX IPv6 */ apr_status_t apr_get_remote_name(struct sockaddr_in **name, apr_socket_t *sock) { - *name = sock->remote_addr; + *name = &sock->remote_addr->sa.sin; return APR_SUCCESS; } #endif diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c index 4e5c37e0c..ed2ba7814 100644 --- a/network_io/unix/sockets.c +++ b/network_io/unix/sockets.c @@ -67,33 +67,65 @@ static apr_status_t socket_cleanup(void *sock) } } -apr_status_t apr_create_tcp_socket(apr_socket_t **new, apr_pool_t *cont) +static void set_socket_vars(apr_socket_t *sock, int family) { - (*new) = (apr_socket_t *)apr_pcalloc(cont, sizeof(apr_socket_t)); + sock->local_addr->sa.sin.sin_family = family; + sock->remote_addr->sa.sin.sin_family = family; - if ((*new) == NULL) { - return APR_ENOMEM; + if (family == AF_INET) { + sock->local_addr->sa_len = 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->sa_len = 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->sa_len = 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->sa_len = 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); } - (*new)->cntxt = cont; - (*new)->local_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - (*new)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); +#endif +} +static void alloc_socket(apr_socket_t **new, apr_pool_t *p) +{ + *new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t)); + (*new)->cntxt = p; + (*new)->local_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); +} + +apr_status_t apr_create_tcp_socket(apr_socket_t **new, apr_pool_t *cont) +{ + int family = AF_INET; + int proto = IPPROTO_TCP; + int type = SOCK_STREAM; + + alloc_socket(new, cont); if ((*new)->local_addr == NULL || (*new)->remote_addr == NULL) { return APR_ENOMEM; } - - (*new)->socketdes = socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP); - (*new)->local_addr->sin_family = AF_INET; - (*new)->remote_addr->sin_family = AF_INET; + (*new)->socketdes = socket(family, type, proto); - (*new)->addr_len = sizeof(*(*new)->local_addr); - if ((*new)->socketdes < 0) { return errno; } + set_socket_vars(*new, family); + (*new)->timeout = -1; apr_register_cleanup((*new)->cntxt, (void *)(*new), socket_cleanup, apr_null_cleanup); @@ -113,10 +145,12 @@ apr_status_t apr_close_socket(apr_socket_t *thesocket) apr_status_t apr_bind(apr_socket_t *sock) { - if (bind(sock->socketdes, (struct sockaddr *)sock->local_addr, sock->addr_len) == -1) + if (bind(sock->socketdes, + (struct sockaddr *)&sock->local_addr->sa, sock->local_addr->sa_len) == -1) return errno; else { - if (sock->local_addr->sin_port == 0) { /* no need for ntohs() when comparing w/ 0 */ + /* XXX fix me for IPv6 */ + if (sock->local_addr->sa.sin.sin_port == 0) { /* no need for ntohs() when comparing w/ 0 */ sock->local_port_unknown = 1; /* kernel got us an ephemeral port */ } return APR_SUCCESS; @@ -133,28 +167,22 @@ apr_status_t apr_listen(apr_socket_t *sock, apr_int32_t backlog) apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *connection_context) { - (*new) = (apr_socket_t *)apr_pcalloc(connection_context, - sizeof(apr_socket_t)); - - (*new)->cntxt = connection_context; - (*new)->local_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); + alloc_socket(new, connection_context); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family); - (*new)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - (*new)->addr_len = sizeof(struct sockaddr_in); #ifndef HAVE_POLL (*new)->connected = 1; #endif (*new)->timeout = -1; - (*new)->socketdes = accept(sock->socketdes, (struct sockaddr *)(*new)->remote_addr, - &(*new)->addr_len); + (*new)->remote_addr->sa_len = sizeof((*new)->remote_addr->sa); + (*new)->socketdes = accept(sock->socketdes, + (struct sockaddr *)&(*new)->remote_addr->sa, + &(*new)->remote_addr->sa_len); if ((*new)->socketdes < 0) { return errno; } - *(*new)->local_addr = *sock->local_addr; if (sock->local_port_unknown) { @@ -163,7 +191,8 @@ apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *conn } if (sock->local_interface_unknown || - sock->local_addr->sin_addr.s_addr == 0) { + /* XXX IPv6 issue */ + sock->local_addr->sa.sin.sin_addr.s_addr == 0) { /* 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. * @@ -189,8 +218,7 @@ apr_status_t apr_connect(apr_socket_t *sock, const char *hostname) #ifndef GETHOSTBYNAME_HANDLES_NAS if (*hostname >= '0' && *hostname <= '9' && strspn(hostname, "0123456789.") == strlen(hostname)) { - sock->remote_addr->sin_addr.s_addr = inet_addr(hostname); - sock->addr_len = sizeof(*sock->remote_addr); + sock->remote_addr->sa.sin.sin_addr.s_addr = inet_addr(hostname); } else { #endif @@ -199,26 +227,30 @@ apr_status_t apr_connect(apr_socket_t *sock, const char *hostname) if (!hp) { return (h_errno + APR_OS_START_SYSERR); } - - memcpy((char *)&sock->remote_addr->sin_addr, hp->h_addr_list[0], + + /* XXX IPv6: move name resolution out of this function */ + memcpy((char *)&sock->remote_addr->sa.sin.sin_addr, hp->h_addr_list[0], hp->h_length); - sock->addr_len = sizeof(*sock->remote_addr); #ifndef GETHOSTBYNAME_HANDLES_NAS } #endif } - if ((connect(sock->socketdes, (const struct sockaddr *)sock->remote_addr, - sock->addr_len) < 0) && (errno != EINPROGRESS)) { + if ((connect(sock->socketdes, + (const struct sockaddr *)&sock->remote_addr->sa.sin, + sock->remote_addr->sa_len) < 0) && + (errno != EINPROGRESS)) { return errno; } else { - if (sock->local_addr->sin_port == 0) { + /* XXX IPv6 */ + if (sock->local_addr->sa.sin.sin_port == 0) { /* connect() got us an ephemeral port */ sock->local_port_unknown = 1; } - if (sock->local_addr->sin_addr.s_addr == 0) { + /* XXX IPv6 */ + if (sock->local_addr->sa.sin.sin_addr.s_addr == 0) { /* not bound to specific local interface; connect() had to assign * one for the socket */ @@ -252,18 +284,9 @@ apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock, apr_pool_t *cont) { if ((*sock) == NULL) { - (*sock) = (apr_socket_t *)apr_pcalloc(cont, sizeof(apr_socket_t)); - (*sock)->cntxt = cont; - (*sock)->local_addr = (struct sockaddr_in *)apr_pcalloc((*sock)->cntxt, - sizeof(struct sockaddr_in)); - (*sock)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*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); + alloc_socket(sock, cont); + /* XXX IPv6 figure out the family here! */ + set_socket_vars(*sock, AF_INET); (*sock)->timeout = -1; } (*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1; diff --git a/network_io/unix/sockopt.c b/network_io/unix/sockopt.c index dd4e2c4c3..3829efae9 100644 --- a/network_io/unix/sockopt.c +++ b/network_io/unix/sockopt.c @@ -208,9 +208,9 @@ apr_status_t apr_get_hostname(char **name, apr_interface_e which, apr_socket_t * apr_in_addr_t sa_ptr; if (which == APR_LOCAL) - sa_ptr = sock->local_addr->sin_addr; + sa_ptr = sock->local_addr->sa.sin.sin_addr; else if (which == APR_REMOTE) - sa_ptr = sock->remote_addr->sin_addr; + sa_ptr = sock->remote_addr->sa.sin.sin_addr; else return APR_EINVAL; diff --git a/network_io/win32/sockaddr.c b/network_io/win32/sockaddr.c index 336b6edb3..8257752bd 100644 --- a/network_io/win32/sockaddr.c +++ b/network_io/win32/sockaddr.c @@ -60,9 +60,9 @@ static apr_status_t get_local_addr(apr_socket_t *sock) { - size_t namelen = sizeof(*sock->local_addr); + size_t namelen = sizeof(sock->local_addr->sa); - if (getsockname(sock->sock, (struct sockaddr *)sock->local_addr, + if (getsockname(sock->sock, (struct sockaddr *)&sock->local_addr->sa, &namelen) < 0) { return apr_get_netos_error(); } @@ -81,9 +81,9 @@ apr_status_t apr_set_ipaddr(apr_socket_t *sock, apr_interface_e which, const cha struct sockaddr_in *ptr; if (which == APR_LOCAL) - ptr = sock->local_addr; + ptr = &sock->local_addr->sa.sin; else if (which == APR_REMOTE) - ptr = sock->remote_addr; + ptr = &sock->remote_addr->sa.sin; else return APR_EINVAL; @@ -112,7 +112,7 @@ apr_status_t apr_get_local_name(struct sockaddr_in **name, apr_socket_t *sock) } } - *name = sock->local_addr; + *name = &sock->local_addr->sa.sin; return APR_SUCCESS; } @@ -120,6 +120,6 @@ apr_status_t apr_get_local_name(struct sockaddr_in **name, apr_socket_t *sock) apr_status_t apr_get_remote_name(struct sockaddr_in **name, apr_socket_t *sock) { - *name = sock->remote_addr; + *name = &sock->remote_addr->sa.sin; return APR_SUCCESS; } diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c index e65d908cb..405985e5b 100644 --- a/network_io/win32/sockets.c +++ b/network_io/win32/sockets.c @@ -59,7 +59,6 @@ #include "apr_portable.h" #include <string.h> - static apr_status_t socket_cleanup(void *sock) { apr_socket_t *thesocket = sock; @@ -73,22 +72,57 @@ static apr_status_t socket_cleanup(void *sock) return APR_SUCCESS; } +static void set_socket_vars(apr_socket_t *sock, int family) +{ + sock->local_addr->sa.sin.sin_family = family; + sock->remote_addr->sa.sin.sin_family = family; + + if (family == AF_INET) { + sock->local_addr->sa_len = 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->sa_len = 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->sa_len = 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->sa_len = 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 +} +static void alloc_socket(apr_socket_t **new, apr_pool_t *p) +{ + *new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t)); + (*new)->cntxt = p; + (*new)->local_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); +} + apr_status_t apr_create_tcp_socket(apr_socket_t **new, apr_pool_t *cont) { - (*new) = (apr_socket_t *)apr_pcalloc(cont, sizeof(apr_socket_t)); + alloc_socket(new, cont); if ((*new) == NULL) { return APR_ENOMEM; } - (*new)->cntxt = cont; - (*new)->local_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - (*new)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - if (((*new)->local_addr == NULL) || ((*new)->remote_addr == NULL)) { return APR_ENOMEM; } + /* For right now, we are not using socket groups. We may later. * No flags to use when creating a socket, so use 0 for that parameter as well. */ @@ -96,13 +130,7 @@ apr_status_t apr_create_tcp_socket(apr_socket_t **new, apr_pool_t *cont) if ((*new)->sock == INVALID_SOCKET) { return apr_get_netos_error(); } - - (*new)->local_addr->sin_family = AF_INET; - (*new)->remote_addr->sin_family = AF_INET; - - (*new)->addr_len = sizeof(*(*new)->local_addr); - - (*new)->local_addr->sin_port = 0; + set_socket_vars(*new, AF_INET); (*new)->timeout = -1; (*new)->disconnected = 0; @@ -147,11 +175,13 @@ apr_status_t apr_close_socket(apr_socket_t *thesocket) apr_status_t apr_bind(apr_socket_t *sock) { - if (bind(sock->sock, (struct sockaddr *)sock->local_addr, sock->addr_len) == -1) { + if (bind(sock->sock, + (struct sockaddr *)&sock->local_addr->sa, + sock->local_addr->sa_len) == -1) { return apr_get_netos_error(); } else { - if (sock->local_addr->sin_port == 0) { + if (sock->local_addr->sa.sin.sin_port == 0) { sock->local_port_unknown = 1; /* ephemeral port */ } return APR_SUCCESS; @@ -168,27 +198,20 @@ apr_status_t apr_listen(apr_socket_t *sock, apr_int32_t backlog) apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *connection_context) { - (*new) = (apr_socket_t *)apr_pcalloc(connection_context, - sizeof(apr_socket_t)); - - (*new)->cntxt = connection_context; - (*new)->local_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - (*new)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*new)->cntxt, - sizeof(struct sockaddr_in)); - memcpy((*new)->local_addr, sock->local_addr, sizeof(struct sockaddr_in)); + alloc_socket(new, connection_context); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family); - (*new)->addr_len = sizeof(struct sockaddr_in); (*new)->timeout = -1; (*new)->disconnected = 0; - (*new)->sock = accept(sock->sock, (struct sockaddr *)(*new)->local_addr, - &(*new)->addr_len); + (*new)->remote_addr->sa_len = sizeof((*new)->remote_addr->sa); + (*new)->sock = accept(sock->sock, + (struct sockaddr *)&(*new)->remote_addr->sa, + &(*new)->remote_addr->sa_len); if ((*new)->sock == INVALID_SOCKET) { return apr_get_netos_error(); } - *(*new)->local_addr = *sock->local_addr; if (sock->local_port_unknown) { @@ -197,7 +220,7 @@ apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *conn } if (sock->local_interface_unknown || - sock->local_addr->sin_addr.s_addr == 0) { + sock->local_addr->sa.sin.sin_addr.s_addr == 0) { /* 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. * @@ -225,22 +248,20 @@ apr_status_t apr_connect(apr_socket_t *sock, const char *hostname) if (hostname != NULL) { if (*hostname >= '0' && *hostname <= '9' && strspn(hostname, "0123456789.") == strlen(hostname)) { - sock->remote_addr->sin_addr.s_addr = inet_addr(hostname); + sock->remote_addr->sa.sin.sin_addr.s_addr = inet_addr(hostname); } else { hp = gethostbyname(hostname); if (!hp) { return apr_get_netos_error(); } - memcpy((char *)&sock->remote_addr->sin_addr, hp->h_addr_list[0], hp->h_length); - sock->addr_len = sizeof(*sock->remote_addr); + memcpy((char *)&sock->remote_addr->sa.sin.sin_addr, hp->h_addr_list[0], + hp->h_length); } } - sock->remote_addr->sin_family = AF_INET; - - if (connect(sock->sock, (const struct sockaddr *)sock->remote_addr, - sock->addr_len) == SOCKET_ERROR) { + if (connect(sock->sock, (const struct sockaddr *)&sock->remote_addr->sa.sin, + sock->remote_addr->sa_len) == SOCKET_ERROR) { lasterror = apr_get_netos_error(); if (lasterror != APR_FROM_OS_ERROR(WSAEWOULDBLOCK)) { return lasterror; @@ -253,10 +274,10 @@ apr_status_t apr_connect(apr_socket_t *sock, const char *hostname) } } /* connect was OK .. amazing */ - if (sock->local_addr->sin_port == 0) { + if (sock->local_addr->sa.sin.sin_port == 0) { sock->local_port_unknown = 1; } - if (sock->local_addr->sin_addr.s_addr == 0) { + if (sock->local_addr->sa.sin.sin_addr.s_addr == 0) { /* must be using free-range port */ sock->local_interface_unknown = 1; } @@ -283,22 +304,9 @@ apr_status_t apr_get_os_sock(apr_os_sock_t *thesock, apr_socket_t *sock) apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock, apr_pool_t *cont) { - if (cont == NULL) { - return APR_ENOPOOL; - } if ((*sock) == NULL) { - (*sock) = (apr_socket_t *)apr_pcalloc(cont, sizeof(apr_socket_t)); - (*sock)->cntxt = cont; - (*sock)->local_addr = (struct sockaddr_in *)apr_pcalloc((*sock)->cntxt, - sizeof(struct sockaddr_in)); - (*sock)->remote_addr = (struct sockaddr_in *)apr_pcalloc((*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); + alloc_socket(sock, cont); + set_socket_vars(*sock, AF_INET); (*sock)->timeout = -1; (*sock)->disconnected = 0; } diff --git a/network_io/win32/sockopt.c b/network_io/win32/sockopt.c index 5a7638365..0926d20e0 100644 --- a/network_io/win32/sockopt.c +++ b/network_io/win32/sockopt.c @@ -207,9 +207,9 @@ apr_status_t apr_get_hostname(char **name, apr_interface_e which, apr_socket_t * apr_in_addr_t sa_ptr; if (which == APR_LOCAL) - sa_ptr = sock->local_addr->sin_addr; + sa_ptr = sock->local_addr->sa.sin.sin_addr; else if (which == APR_REMOTE) - sa_ptr = sock->remote_addr->sin_addr; + sa_ptr = sock->remote_addr->sa.sin.sin_addr; else return APR_EINVAL; |