You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by tr...@apache.org on 2002/03/28 19:17:02 UTC
cvs commit: apr/network_io/unix sa_common.c sockets.c
trawick 02/03/28 10:17:02
Modified: include/arch/os2 networkio.h
include/arch/unix networkio.h
include/arch/win32 networkio.h
network_io/unix sa_common.c sockets.c
Log:
clean up the unix networking code by creating a new function
to set basic info in apr_sockaddr_t and by reducing the amount
of code that messes with the native sockaddrs within the
apr_sockaddr_t
prototypes for the new function -- apr_set_sockaddr_vars() --
were added for Win32 and OS/2 since otherwise they could get
warnings for the lack of a prototype for the non-static function,
which resides in sa_common.c
for long-term, we need to look at using apr_set_sockaddr_vars()
in Win32 and OS/2 code anyway
Revision Changes Path
1.24 +1 -0 apr/include/arch/os2/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apr/include/arch/os2/networkio.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- networkio.h 13 Mar 2002 20:39:18 -0000 1.23
+++ networkio.h 28 Mar 2002 18:17:02 -0000 1.24
@@ -103,6 +103,7 @@
const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size);
int apr_inet_pton(int af, const char *src, void *dst);
+void apr_set_sockaddr_vars(apr_sockaddr_t *, int, apr_port_t);
#endif /* ! NETWORK_IO_H */
1.52 +1 -0 apr/include/arch/unix/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apr/include/arch/unix/networkio.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- networkio.h 13 Mar 2002 20:39:18 -0000 1.51
+++ networkio.h 28 Mar 2002 18:17:02 -0000 1.52
@@ -164,6 +164,7 @@
const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size);
int apr_inet_pton(int af, const char *src, void *dst);
apr_status_t apr_wait_for_io_or_timeout(apr_socket_t *sock, int for_read);
+void apr_set_sockaddr_vars(apr_sockaddr_t *, int, apr_port_t);
#define apr_is_option_set(mask, option) ((mask & option) ==option)
1.22 +1 -0 apr/include/arch/win32/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apr/include/arch/win32/networkio.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- networkio.h 13 Mar 2002 20:39:19 -0000 1.21
+++ networkio.h 28 Mar 2002 18:17:02 -0000 1.22
@@ -86,6 +86,7 @@
const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size);
int apr_inet_pton(int af, const char *src, void *dst);
+void apr_set_sockaddr_vars(apr_sockaddr_t *, int, apr_port_t);
#endif /* ! NETWORK_IO_H */
1.53 +17 -31 apr/network_io/unix/sa_common.c
Index: sa_common.c
===================================================================
RCS file: /home/cvs/apr/network_io/unix/sa_common.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- sa_common.c 14 Mar 2002 19:28:15 -0000 1.52
+++ sa_common.c 28 Mar 2002 18:17:02 -0000 1.53
@@ -139,8 +139,7 @@
APR_DECLARE(apr_status_t) apr_sockaddr_port_get(apr_port_t *port,
apr_sockaddr_t *sockaddr)
{
- /* XXX IPv6 - assumes sin_port and sin6_port at same offset */
- *port = ntohs(sockaddr->sa.sin.sin_port);
+ *port = sockaddr->port;
return APR_SUCCESS;
}
@@ -148,12 +147,12 @@
apr_sockaddr_t *sockaddr)
{
*addr = apr_palloc(sockaddr->pool, sockaddr->addr_str_len);
- apr_inet_ntop(sockaddr->sa.sin.sin_family,
+ apr_inet_ntop(sockaddr->family,
sockaddr->ipaddr_ptr,
*addr,
sockaddr->addr_str_len);
#if APR_HAVE_IPV6
- if (sockaddr->sa.sin.sin_family == AF_INET6 &&
+ if (sockaddr->family == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED((struct in6_addr *)sockaddr->ipaddr_ptr)) {
/* This is an IPv4-mapped IPv6 address; drop the leading
* part of the address string so we're left with the familiar
@@ -165,12 +164,15 @@
return APR_SUCCESS;
}
-static void set_sockaddr_vars(apr_sockaddr_t *addr, int family)
+void apr_set_sockaddr_vars(apr_sockaddr_t *addr, int family, apr_port_t port)
{
addr->family = family;
- /* XXX IPv6: assumes sin_port and sin6_port at same offset */
- addr->port = ntohs(addr->sa.sin.sin_port);
addr->sa.sin.sin_family = family;
+ if (port) {
+ /* XXX IPv6: assumes sin_port and sin6_port at same offset */
+ addr->sa.sin.sin_port = htons(port);
+ addr->port = port;
+ }
if (family == APR_INET) {
addr->salen = sizeof(struct sockaddr_in);
@@ -319,21 +321,16 @@
struct addrinfo *ai, apr_port_t port)
{
sa->pool = p;
- sa->sa.sin.sin_family = ai->ai_family;
memcpy(&sa->sa, ai->ai_addr, ai->ai_addrlen);
- /* XXX IPv6: assumes sin_port and sin6_port at same offset */
- sa->sa.sin.sin_port = htons(port);
- set_sockaddr_vars(sa, sa->sa.sin.sin_family);
+ apr_set_sockaddr_vars(sa, ai->ai_family, port);
}
#else
static void save_addrinfo(apr_pool_t *p, apr_sockaddr_t *sa,
struct in_addr ipaddr, apr_port_t port)
{
sa->pool = p;
- sa->sa.sin.sin_family = AF_INET;
sa->sa.sin.sin_addr = ipaddr;
- sa->sa.sin.sin_port = htons(port);
- set_sockaddr_vars(sa, sa->sa.sin.sin_family);
+ apr_set_sockaddr_vars(sa, AF_INET, port);
}
#endif
@@ -395,16 +392,10 @@
freeaddrinfo(ai_list);
}
else {
- if (family == APR_UNSPEC) {
- (*sa)->sa.sin.sin_family = APR_INET;
- }
- else {
- (*sa)->sa.sin.sin_family = family;
- }
(*sa)->pool = p;
- /* XXX IPv6: assumes sin_port and sin6_port at same offset */
- (*sa)->sa.sin.sin_port = htons(port);
- set_sockaddr_vars(*sa, (*sa)->sa.sin.sin_family);
+ apr_set_sockaddr_vars(*sa,
+ family == APR_UNSPEC ? APR_INET : family,
+ port);
}
#else
if (hostname != NULL) {
@@ -488,15 +479,10 @@
#endif
}
else {
- if (family == APR_UNSPEC) {
- (*sa)->sa.sin.sin_family = APR_INET;
- }
- else {
- (*sa)->sa.sin.sin_family = family;
- }
(*sa)->pool = p;
- (*sa)->sa.sin.sin_port = htons(port);
- set_sockaddr_vars(*sa, (*sa)->sa.sin.sin_family);
+ apr_set_sockaddr_vars(*sa,
+ family == APR_UNSPEC ? APR_INET : family,
+ port);
}
#endif
return APR_SUCCESS;
1.95 +14 -44 apr/network_io/unix/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apr/network_io/unix/sockets.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -r1.94 -r1.95
--- sockets.c 13 Mar 2002 20:39:25 -0000 1.94
+++ sockets.c 28 Mar 2002 18:17:02 -0000 1.95
@@ -57,15 +57,17 @@
#include "apr_portable.h"
#include "inherit.h"
+#if defined(BEOS) && !defined(BEOS_BONE)
+#define close closesocket
+#endif
+
+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;
-#if defined(BEOS) && !defined(BEOS_BONE)
- if (closesocket(thesocket->socketdes) == 0) {
-#else
if (close(thesocket->socketdes) == 0) {
-#endif
thesocket->socketdes = -1;
return APR_SUCCESS;
}
@@ -77,35 +79,8 @@
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 == APR_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 == APR_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_set_sockaddr_vars(sock->local_addr, family, 0);
+ apr_set_sockaddr_vars(sock->remote_addr, family, 0);
sock->netmask = 0;
#if defined(BEOS) && !defined(BEOS_BONE)
/* BeOS pre-BONE has TCP_NODELAY on by default and it can't be
@@ -113,7 +88,8 @@
*/
sock->netmask |= APR_TCP_NODELAY;
#endif
-}
+}
+
static void alloc_socket(apr_socket_t **new, apr_pool_t *p)
{
*new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t));
@@ -203,7 +179,6 @@
apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *connection_context)
{
- static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */
alloc_socket(new, connection_context);
set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM);
@@ -212,7 +187,6 @@
#endif
(*new)->timeout = -1;
- (*new)->remote_addr->salen = sizeof((*new)->remote_addr->sa);
(*new)->socketdes = accept(sock->socketdes,
(struct sockaddr *)&(*new)->remote_addr->sa,
&(*new)->remote_addr->salen);
@@ -307,17 +281,13 @@
}
sock->remote_addr = sa;
- /* XXX IPv6 assumes sin_port and sin6_port at same offset */
- if (sock->local_addr->sa.sin.sin_port == 0) {
+ if (sock->local_addr->port == 0) {
/* connect() got us an ephemeral port */
sock->local_port_unknown = 1;
}
- /* XXX IPv6 to be handled better later... */
- if (
-#if APR_HAVE_IPV6
- sock->local_addr->sa.sin.sin_family == APR_INET6 ||
-#endif
- sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
+ 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
*/
Re: cvs commit: apr/network_io/unix sa_common.c sockets.c
Posted by Jeff Trawick <tr...@attglobal.net>.
Kevin Pilch-Bisson <ke...@pilch-bisson.net> writes:
> On Thu, Mar 28, 2002 at 06:17:02PM -0000, trawick@apache.org wrote:
> >
> > prototypes for the new function -- apr_set_sockaddr_vars() --
>
> Wouldn't apr_sockaddr_vars_set be a more consistent name for the function?
It would be more consistent with the names of APR APIs, but this isn't
an API. I considered such a name before committing, but it seemed
uninteresting given given the lack of consistency in the names of other
helper functions.
But stupidly I've spent more time on this e-mail than it would take to
make the change so I'll do it (and update my patches for OS/2 and
Win32) :)
--
Jeff Trawick | trawick@attglobal.net
Born in Roswell... married an alien...
Re: cvs commit: apr/network_io/unix sa_common.c sockets.c
Posted by Kevin Pilch-Bisson <ke...@pilch-bisson.net>.
On Thu, Mar 28, 2002 at 06:17:02PM -0000, trawick@apache.org wrote:
>
> prototypes for the new function -- apr_set_sockaddr_vars() --
Wouldn't apr_sockaddr_vars_set be a more consistent name for the function?
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Kevin Pilch-Bisson http://www.pilch-bisson.net
"Historically speaking, the presences of wheels in Unix
has never precluded their reinvention." - Larry Wall
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~