You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by David Reid <dr...@jetnet.co.uk> on 2000/12/02 12:12:37 UTC

[PATCH] apr_get_formatted_address

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.......");



Re: [PATCH] apr_get_formatted_address

Posted by Greg Stein <gs...@lyra.org>.
This patch is Big-Time Bad Busted (double-space, no indents). Try again? :-)

Cheers,
-g

On Sat, Dec 02, 2000 at 11:12:37AM -0000, David Reid wrote:
> 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.......");
> 

-- 
Greg Stein, http://www.lyra.org/