You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Jeff Trawick <tr...@bellsouth.net> on 2000/11/15 20:35:56 UTC
[PATCH] 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), 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.
Is this bit easier to review perhaps?
Real deviations from David's (AFAIK):
. I got rid of the addr_len field in apr_socket_t.
Index: include/apr_network_io.h
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/include/apr_network_io.h,v
retrieving revision 1.69
diff -u -r1.69 apr_network_io.h
--- include/apr_network_io.h 2000/11/15 18:11:34 1.69
+++ include/apr_network_io.h 2000/11/15 19:21:20
@@ -162,10 +162,11 @@
* 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.
*/
+ int ipaddr_len;
} apr_sockaddr_t;
#if APR_HAS_SENDFILE
Index: include/arch/unix/networkio.h
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/include/arch/unix/networkio.h,v
retrieving revision 1.33
diff -u -r1.33 networkio.h
--- include/arch/unix/networkio.h 2000/09/29 04:03:20 1.33
+++ include/arch/unix/networkio.h 2000/11/15 19:21:20
@@ -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;
@@ -149,6 +148,9 @@
apr_int16_t *revents;
};
#endif /* ! NETWORK_IO_H */
Index: network_io/unix/sa_common.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sa_common.c,v
retrieving revision 1.4
diff -u -r1.4 sa_common.c
--- network_io/unix/sa_common.c 2000/11/11 06:05:59 1.4
+++ network_io/unix/sa_common.c 2000/11/15 19:21:21
@@ -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 @@
}
}
- *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 @@
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 @@
}
}
- *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;
}
Index: network_io/unix/sockaddr.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sockaddr.c,v
retrieving revision 1.19
diff -u -r1.19 sockaddr.c
--- network_io/unix/sockaddr.c 2000/11/09 15:01:26 1.19
+++ network_io/unix/sockaddr.c 2000/11/15 19:21:21
@@ -75,12 +75,13 @@
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 @@
}
#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 @@
}
}
- *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
Index: network_io/unix/sockets.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
retrieving revision 1.54
diff -u -r1.54 sockets.c
--- network_io/unix/sockets.c 2000/11/02 03:02:49 1.54
+++ network_io/unix/sockets.c 2000/11/15 19:21:21
@@ -67,33 +67,65 @@
}
}
-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_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_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));
+ alloc_socket(new, connection_context);
+ set_socket_vars(*new, sock->local_addr->sa.sin.sin_family);
- (*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));
- (*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 @@
}
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.
*
@@ -199,26 +228,30 @@
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,19 +285,9 @@
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);
(*sock)->timeout = -1;
+ /* XXX IPv6 figure out the family here! */
}
(*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1;
(*sock)->socketdes = *thesock;
Index: network_io/unix/sockopt.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sockopt.c,v
retrieving revision 1.36
diff -u -r1.36 sockopt.c
--- network_io/unix/sockopt.c 2000/11/10 16:11:13 1.36
+++ network_io/unix/sockopt.c 2000/11/15 19:21:21
@@ -208,9 +208,9 @@
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;
--
Jeff Trawick | trawick@ibm.net | PGP public key at web site:
http://www.geocities.com/SiliconValley/Park/9289/
Born in Roswell... married an alien...
Re: [PATCH] small step toward's David Reid's IPv6 patch
Posted by Jeff Trawick <tr...@bellsouth.net>.
Greg Stein <gs...@lyra.org> writes:
> On Wed, Nov 15, 2000 at 02:35:56PM -0500, Jeff Trawick wrote:
> > 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), and simplified some of the code which
> > allocates storage for apr_socket_t and fills out fields in
> > apr_sockaddr_t.
>
> Looks fine to me. Go for it.
will-do, but I'll wait until later this evening or tomorrow a.m. when
I will get a chance to get Win32 building with the changes...
the use of sa_common.c assumes that certain fields in apr_socket_t are
the same across platforms, which means that the same sort of changes
are needed in the Win32, BeOS, and OS/2 code also...
it is one thing to break the build for a platform I don't have
in-house, but yet another to break the build for a platform that sits
silent across the room :)
--
Jeff Trawick | trawick@ibm.net | PGP public key at web site:
http://www.geocities.com/SiliconValley/Park/9289/
Born in Roswell... married an alien...
Re: [PATCH] small step toward's David Reid's IPv6 patch
Posted by Greg Stein <gs...@lyra.org>.
On Wed, Nov 15, 2000 at 02:35:56PM -0500, Jeff Trawick wrote:
> 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), 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.
>
> Is this bit easier to review perhaps?
Looks fine to me. Go for it.
Cheers,
-g
--
Greg Stein, http://www.lyra.org/