From dreid@jetnet.co.uk Sat Dec 2 11:14:46 2000 Return-Path: Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Delivered-To: mailing list dev@apr.apache.org Received: (qmail 16717 invoked from network); 2 Dec 2000 11:14:46 -0000 Received: from www.jetnet.co.uk (root@62.172.71.4) by locus.apache.org with SMTP; 2 Dec 2000 11:14:46 -0000 Received: from godzilla (ppp162.dialin.co.uk [194.73.252.162]) by www.jetnet.co.uk (8.11.1/8.11.1) with SMTP id eB2BEjl17362 for ; Sat, 2 Dec 2000 11:14:45 GMT Message-ID: <029201c05c50$ca724780$011aa8c0@godzilla> From: "David Reid" To: "APR Development List" Subject: [PATCH] apr_get_formatted_address Date: Sat, 2 Dec 2000 11:12:37 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.00.2919.6700 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700 X-Spam-Rating: locus.apache.org 1.6.2 0/1000/N Index: include/apr_network_io.h =================================================================== RCS file: /home/cvs/apr/include/apr_network_io.h,v retrieving revision 1.85 diff -u -r1.85 apr_network_io.h --- include/apr_network_io.h 2000/12/01 18:47:28 1.85 +++ include/apr_network_io.h 2000/12/02 10:23:00 @@ -134,6 +134,16 @@ APR_REMOTE } apr_interface_e; +/* An enum that is used to tell us what format the user wants us to + * use when formatting an apr_sockaddr_t + */ +typedef enum { + APR_FORMAT_ADDR_ONLY, /* numeric address only */ + APR_FORMAT_HOST_ONLY, /* hostname or numeric address only */ + APR_FORMAT_PORT_ONLY, /* port number or service name only */ + APR_FORMAT_ALL /* address/hostname and port */ +} apr_address_format_e; + /* I guess not everybody uses inet_addr. This defines apr_inet_addr * appropriately. */ @@ -632,6 +642,15 @@ apr_status_t apr_getservbyname(apr_sockaddr_t *sockaddr, const char *servname); +/** + * Given an apr_sockaddr_t return a formatted string representation of the + * address in the format specified + * @param string The formatted string + * @param sa The apr_sockaddr_t to use + * @param how The format to use + */ +apr_status_t apr_get_formatted_address(char **string, apr_sockaddr_t *sa, + apr_address_format_e how); #ifdef __cplusplus } #endif Index: network_io/unix/sa_common.c =================================================================== RCS file: /home/cvs/apr/network_io/unix/sa_common.c,v retrieving revision 1.15 diff -u -r1.15 sa_common.c --- network_io/unix/sa_common.c 2000/12/01 18:47:31 1.15 +++ network_io/unix/sa_common.c 2000/12/02 10:23:02 @@ -175,6 +175,7 @@ *sa = NULL; return APR_EINVAL; } + (*sa)->pool = sock->cntxt; return APR_SUCCESS; } @@ -286,5 +287,52 @@ return APR_SUCCESS; } return errno; +} + +apr_status_t apr_get_formatted_address(char **string, apr_sockaddr_t *sa, + apr_address_format_e how) +{ + if (sa->hostname == NULL){ + sa->hostname = apr_palloc(sa->pool, sizeof(char) * sa->addr_str_len); + apr_inet_ntop(sa->sa.sin.sin_family, sa->ipaddr_ptr, + sa->hostname, sa->addr_str_len); + } + + if (how == APR_FORMAT_ADDR_ONLY){ + if (!isdigit(*sa->hostname) && *sa->hostname != ':'){ + /* stored hostname is not a numeric representation */ + (*string) = apr_palloc(sa->pool, sizeof(char) * sa->addr_str_len); + apr_inet_ntop(sa->sa.sin.sin_family, sa->ipaddr_ptr, + (*string), sa->addr_str_len); + return APR_SUCCESS; + } + } + if (how == APR_FORMAT_ADDR_ONLY || how == APR_FORMAT_HOST_ONLY){ + (*string) = apr_pstrdup(sa->pool, sa->hostname); + } + if (how == APR_FORMAT_PORT_ONLY){ + if (sa->servname == NULL) + (*string) = apr_psprintf(sa->pool, "%d", ntohs(sa->sa.sin.sin_port)); + else + (*string) = apr_pstrdup(sa->pool, sa->servname); + return APR_SUCCESS; + } + if (how == APR_FORMAT_ALL){ +#if APR_HAVE_IPV6 + if ((isdigit(*sa->hostname) || *sa->hostname == ':') && + sa->sa.sin.sin_family == APR_INET6) + (*string) = apr_psprintf(sa->pool, "[%s]:",sa->hostname); + else +#endif + (*string) = apr_psprintf(sa->pool, "%s:", sa->hostname); + + if (sa->servname == NULL){ + char *sp = apr_psprintf(sa->pool, "%d", ntohs(sa->sa.sin.sin_port)); + (*string) = apr_pstrcat(sa->pool, (*string), sp, NULL); + } else + (*string) = apr_pstrcat(sa->pool, (*string), sa->servname, NULL); + return APR_SUCCESS; + } + return APR_EINVAL; } Index: test/client.c =================================================================== RCS file: /home/cvs/apr/test/client.c,v retrieving revision 1.21 diff -u -r1.21 client.c --- test/client.c 2000/11/21 19:15:27 1.21 +++ test/client.c 2000/12/02 10:23:06 @@ -71,7 +71,6 @@ char msgbuf[80]; char *local_ipaddr, *remote_ipaddr; char *dest = "127.0.0.1"; - apr_port_t local_port, remote_port; apr_interval_time_t read_timeout = -1; apr_sockaddr_t *local_sa, *remote_sa; @@ -141,12 +140,10 @@ } apr_get_sockaddr(&remote_sa, APR_REMOTE, sock); - apr_get_ipaddr(&remote_ipaddr, remote_sa); - apr_get_port(&remote_port, remote_sa); + apr_get_formatted_address(&remote_ipaddr, remote_sa, APR_FORMAT_ALL); apr_get_sockaddr(&local_sa, APR_LOCAL, sock); - apr_get_ipaddr(&local_ipaddr, local_sa); - apr_get_port(&local_port, local_sa); - fprintf(stdout, "\tClient socket: %s:%u -> %s:%u\n", local_ipaddr, local_port, remote_ipaddr, remote_port); + apr_get_formatted_address(&local_ipaddr, local_sa, APR_FORMAT_ALL); + fprintf(stdout, "\tClient socket: %s -> %s\n", local_ipaddr, remote_ipaddr); fprintf(stdout, "\tClient: Trying to send data over socket......."); length = STRLEN; Index: test/server.c =================================================================== RCS file: /home/cvs/apr/test/server.c,v retrieving revision 1.21 diff -u -r1.21 server.c --- test/server.c 2000/11/21 19:15:27 1.21 +++ test/server.c 2000/12/02 10:23:07 @@ -72,7 +72,6 @@ char datarecv[STRLEN] = "Recv data test"; const char *bind_to_ipaddr = NULL; char *local_ipaddr, *remote_ipaddr; - apr_port_t local_port, remote_port; apr_sockaddr_t *localsa = NULL, *remotesa; apr_status_t stat; int family = APR_UNSPEC; @@ -204,12 +203,10 @@ fprintf(stdout, "OK\n"); apr_get_sockaddr(&remotesa, APR_REMOTE, sock2); - apr_get_ipaddr(&remote_ipaddr, remotesa); - apr_get_port(&remote_port, remotesa); + apr_get_formatted_address(&remote_ipaddr, remotesa, APR_FORMAT_ALL); apr_get_sockaddr(&localsa, APR_LOCAL, sock2); - apr_get_ipaddr(&local_ipaddr, localsa); - apr_get_port(&local_port, localsa); - fprintf(stdout, "\tServer socket: %s:%u -> %s:%u\n", local_ipaddr, local_port, remote_ipaddr, remote_port); + apr_get_formatted_address(&local_ipaddr, localsa, APR_FORMAT_ALL); + fprintf(stdout, "\tServer socket: %s -> %s\n", local_ipaddr, remote_ipaddr); length = STRLEN; fprintf(stdout, "\tServer: Trying to recv data from socket.......");