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/