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/16 19:25:49 UTC
[PATCH] change apr_connect() to take apr_sockaddr_t, add apr_getaddrinfo()
This started off as David Reid's patch which he posted this a.m. I
renamed his apr_gethostbyname() to apr_getaddrinfo(), added fields
family and port to apr_getaddrinfo(), made some fixes, and changed the
remaining callers of apr_connect() to use the new parameter list.
Changes to the currently-committed API:
. apr_connect() takes an apr_sockaddr_t parameter instead of hostname
. apr_getaddrinfo() is new; this builds an apr_sockaddr_t representing
the peer you wish to communicate with
Suggestions? Concerns?
Index: lib/apr/include/apr_network_io.h
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/include/apr_network_io.h,v
retrieving revision 1.71
diff -u -r1.71 apr_network_io.h
--- lib/apr/include/apr_network_io.h 2000/11/16 14:48:50 1.71
+++ lib/apr/include/apr_network_io.h 2000/11/16 18:07:26
@@ -265,7 +265,7 @@
* APR assumes that the sockaddr_in in the apr_socket is
* completely filled out.
*/
-apr_status_t apr_connect(apr_socket_t *sock, const char *hostname);
+apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa);
/**
* Get name of a machine we are currently connected to.
@@ -274,6 +274,12 @@
* @param sock The socket to examine.
*/
apr_status_t apr_get_hostname(char **name, apr_interface_e which, apr_socket_t *sock);
+
+apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa,
+ const char *hostname,
+ apr_int32_t family,
+ apr_port_t port,
+ apr_pool_t *p);
/**
* Get name of the current machine
Index: lib/apr/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.6
diff -u -r1.6 sa_common.c
--- lib/apr/network_io/unix/sa_common.c 2000/11/16 14:48:49 1.6
+++ lib/apr/network_io/unix/sa_common.c 2000/11/16 18:07:27
@@ -171,3 +171,65 @@
return APR_SUCCESS;
}
+static void set_sockaddr_vars(apr_sockaddr_t *addr, int family)
+{
+ addr->sa.sin.sin_family = family;
+ addr->sa.sin.sin_family = family;
+
+ if (family == AF_INET) {
+ addr->sa_len = sizeof(struct sockaddr_in);
+ addr->addr_str_len = 16;
+ addr->ipaddr_ptr = &(addr->sa.sin.sin_addr);
+ addr->ipaddr_len = sizeof(struct in_addr);
+ }
+#if APR_HAVE_IPV6
+ else if (family == AF_INET6) {
+ addr->sa_len = sizeof(struct sockaddr_in6);
+ addr->addr_str_len = 46;
+ addr->ipaddr_ptr = &(addr->sa.sin6.sin6_addr);
+ addr->ipaddr_len = sizeof(struct in6_addr);
+ }
+#endif
+}
+
+apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa, const char *hostname,
+ apr_int32_t family, apr_port_t port,
+ apr_pool_t *p)
+{
+ struct hostent *hp;
+
+ (*sa) = (apr_sockaddr_t *)apr_pcalloc(p, sizeof(apr_sockaddr_t));
+ if ((*sa) == NULL)
+ return APR_ENOMEM;
+ (*sa)->pool = p;
+ (*sa)->sa.sin.sin_family = AF_INET; /* we don't yet support IPv6 */
+ (*sa)->sa.sin.sin_port = htons(port);
+ set_sockaddr_vars(*sa, (*sa)->sa.sin.sin_family);
+
+ if (hostname != NULL) {
+#ifndef GETHOSTBYNAME_HANDLES_NAS
+ if (*hostname >= '0' && *hostname <= '9' &&
+ strspn(hostname, "0123456789.") == strlen(hostname)) {
+ (*sa)->sa.sin.sin_addr.s_addr = inet_addr(hostname);
+ (*sa)->sa_len = sizeof(struct sockaddr_in);
+ }
+ else {
+#endif
+ hp = gethostbyname(hostname);
+
+ if (!hp) {
+ return (h_errno + APR_OS_START_SYSERR);
+ }
+
+ memcpy((char *)&(*sa)->sa.sin.sin_addr, hp->h_addr_list[0],
+ hp->h_length);
+ (*sa)->sa_len = sizeof(struct sockaddr_in);
+ (*sa)->ipaddr_len = hp->h_length;
+
+#ifndef GETHOSTBYNAME_HANDLES_NAS
+ }
+#endif
+ }
+ (*sa)->hostname = apr_pstrdup(p, hostname);
+ return APR_SUCCESS;
+}
Index: lib/apr/network_io/unix/sockets.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
retrieving revision 1.56
diff -u -r1.56 sockets.c
--- lib/apr/network_io/unix/sockets.c 2000/11/16 14:48:49 1.56
+++ lib/apr/network_io/unix/sockets.c 2000/11/16 18:07:27
@@ -226,57 +226,35 @@
return APR_SUCCESS;
}
-apr_status_t apr_connect(apr_socket_t *sock, const char *hostname)
+apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
{
- struct hostent *hp;
-
if ((sock->socketdes < 0) || (!sock->remote_addr)) {
return APR_ENOTSOCK;
}
- if (hostname != NULL) {
-#ifndef GETHOSTBYNAME_HANDLES_NAS
- if (*hostname >= '0' && *hostname <= '9' &&
- strspn(hostname, "0123456789.") == strlen(hostname)) {
- sock->remote_addr->sa.sin.sin_addr.s_addr = inet_addr(hostname);
- }
- else {
-#endif
- hp = gethostbyname(hostname);
-
- if (!hp) {
- return (h_errno + APR_OS_START_SYSERR);
- }
-
- /* 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);
-
-#ifndef GETHOSTBYNAME_HANDLES_NAS
- }
-#endif
- }
- if ((connect(sock->socketdes,
- (const struct sockaddr *)&sock->remote_addr->sa.sin,
- sock->remote_addr->sa_len) < 0) &&
+ if ((connect(sock->socketdes,
+ (const struct sockaddr *)&sa->sa.sin,
+ sa->sa_len) < 0) &&
(errno != EINPROGRESS)) {
return errno;
}
else {
- /* XXX IPv6 */
+ sock->remote_addr = sa;
+ /* XXX IPv6 assumes sin_port and sin6_port at same offset */
if (sock->local_addr->sa.sin.sin_port == 0) {
/* connect() got us an ephemeral port */
sock->local_port_unknown = 1;
}
- /* XXX IPv6 */
- if (sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
+ /* XXX IPv6 to be handled better later... */
+ if (sock->local_addr->sa.sin.sin_family == AF_INET6 ||
+ sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
/* not bound to specific local interface; connect() had to assign
* one for the socket
*/
sock->local_interface_unknown = 1;
}
#ifndef HAVE_POLL
- sock->connected=1;
+ sock->connected=1;
#endif
return APR_SUCCESS;
}
Index: lib/apr/test/client.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/test/client.c,v
retrieving revision 1.17
diff -u -r1.17 client.c
--- lib/apr/test/client.c 2000/11/09 15:01:35 1.17
+++ lib/apr/test/client.c 2000/11/16 18:07:28
@@ -73,6 +73,7 @@
char *dest = "127.0.0.1";
apr_port_t local_port, remote_port;
apr_interval_time_t read_timeout = -1;
+ apr_sockaddr_t *destsa;
setbuf(stdout, NULL);
if (argc > 1) {
@@ -115,17 +116,18 @@
fprintf(stdout, "OK\n");
}
- fprintf(stdout, "\tClient: Setting port for socket.......");
- if (apr_set_port(sock, APR_REMOTE, 8021) != APR_SUCCESS) {
+ fprintf(stdout,"\tClient: Making socket address...............");
+ if (apr_getaddrinfo(&destsa, dest, AF_INET, 8021, context) != APR_SUCCESS) {
apr_close_socket(sock);
- fprintf(stderr, "Couldn't set the port correctly\n");
+ fprintf(stdout, "Failed!\n");
+ fprintf(stdout, "Couldn't create a socket address structure for %s\n", dest);
exit(-1);
}
- fprintf(stdout, "OK\n");
+ fprintf(stdout,"OK\n");
fprintf(stdout, "\tClient: Connecting to socket.......");
- stat = apr_connect(sock, dest);
+ stat = apr_connect(sock, destsa);
if (stat != APR_SUCCESS) {
apr_close_socket(sock);
Index: lib/apr/test/testsf.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/lib/apr/test/testsf.c,v
retrieving revision 1.13
diff -u -r1.13 testsf.c
--- lib/apr/test/testsf.c 2000/11/14 19:32:26 1.13
+++ lib/apr/test/testsf.c 2000/11/16 18:07:28
@@ -205,6 +205,7 @@
apr_pollfd_t *pfd;
apr_int32_t nsocks;
int i;
+ apr_sockaddr_t *destsa;
apr_setup(&p, &sock);
create_testfile(p, TESTFILE);
@@ -217,15 +218,15 @@
exit(1);
}
- rv = apr_set_port(sock, APR_REMOTE, TESTSF_PORT);
+ rv = apr_getaddrinfo(&destsa, "127.0.0.1", AF_INET, TESTSF_PORT, p);
if (rv != APR_SUCCESS) {
- fprintf(stderr, "apr_set_remote_port()->%d/%s\n",
+ fprintf(stderr, "apr_getaddrinfo()->%d/%s\n",
rv,
apr_strerror(rv, buf, sizeof buf));
exit(1);
}
- rv = apr_connect(sock, "127.0.0.1");
+ rv = apr_connect(sock, destsa);
if (rv != APR_SUCCESS) {
fprintf(stderr, "apr_connect()->%d/%s\n",
rv,
Index: main/rfc1413.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/main/rfc1413.c,v
retrieving revision 1.28
diff -u -r1.28 rfc1413.c
--- main/rfc1413.c 2000/11/09 15:09:50 1.28
+++ main/rfc1413.c 2000/11/16 18:07:30
@@ -108,8 +108,8 @@
/* bind_connect - bind both ends of a socket */
/* Ambarish fix this. Very broken */
-static int get_rfc1413(apr_socket_t *sock, const char *local_ip,
- const char *rmt_ip,
+static int get_rfc1413(apr_socket_t *sock, apr_pool_t *p,
+ const char *local_ip, const char *rmt_ip,
char user[RFC1413_USERLEN+1], server_rec *srv)
{
apr_port_t rmt_port, our_port;
@@ -119,6 +119,7 @@
char *cp;
char buffer[RFC1413_MAXDATA + 1];
int buflen;
+ apr_sockaddr_t *destsa;
/*
* Bind the local and remote ends of the query socket to the same
@@ -138,14 +139,19 @@
return -1;
}
+ if ((status = apr_getaddrinfo(&destsa, rmt_ip, AF_INET, RFC1413_PORT,
+ p)) != APR_SUCCESS) {
+ /* This should not fail since we have a numeric address string
+ * as the host. */
+ ap_log_error(APLOG_MARK, APLOG_CRIT, status, srv,
+ "rfc1413: apr_getaddrinfo() failed");
+ return -1;
+ }
/*
* errors from connect usually imply the remote machine doesn't support
* the service
*/
- apr_set_port(sock, APR_REMOTE, RFC1413_PORT);
- apr_set_ipaddr(sock, APR_REMOTE, rmt_ip);
-
- if (apr_connect(sock, NULL) != APR_SUCCESS)
+ if (apr_connect(sock, destsa) != APR_SUCCESS)
return -1;
apr_get_port(&sav_our_port, APR_LOCAL, sock);
apr_get_port(&sav_rmt_port, APR_REMOTE, sock);
@@ -235,7 +241,7 @@
conn->remote_logname = result;
}
- if (get_rfc1413(sock, conn->local_ip, conn->remote_ip, user, srv) >= 0)
+ if (get_rfc1413(sock, conn->pool, conn->local_ip, conn->remote_ip, user, srv) >= 0)
result = user;
apr_close_socket(sock);
conn->remote_logname = result;
Index: modules/proxy/proxy_util.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/modules/proxy/proxy_util.c,v
retrieving revision 1.26
diff -u -r1.26 proxy_util.c
--- modules/proxy/proxy_util.c 2000/11/16 01:57:46 1.26
+++ modules/proxy/proxy_util.c 2000/11/16 18:07:32
@@ -1135,25 +1135,15 @@
{
apr_status_t rv;
int i;
+ apr_sockaddr_t *destsa;
- for (i = 0; host[i] != '\0'; i++)
- if (!apr_isdigit(host[i]) && host[i] != '.')
- break;
-
- apr_set_port(sock, APR_REMOTE, port);
- if (host[i] == '\0') {
- apr_set_ipaddr(sock, APR_REMOTE, host);
- host = NULL;
+ rv = apr_getaddrinfo(&destsa, host, AF_INET, port, r->pool);
+ if (rv == APR_SUCCESS) {
+ rv = apr_connect(sock, destsa);
}
-
- do
- {
- rv = apr_connect(sock, host);
- } while (APR_STATUS_IS_EINTR(rv));
-
if (rv != APR_SUCCESS)
{
- ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy connect to %s port %d failed", host, port);
}
return rv;
Index: support/ab.c
===================================================================
RCS file: /home/cvspublic/apache-2.0/src/support/ab.c,v
retrieving revision 1.32
diff -u -r1.32 ab.c
--- support/ab.c 2000/11/10 19:01:33 1.32
+++ support/ab.c 2000/11/16 18:07:36
@@ -482,6 +482,7 @@
static void start_connect(struct connection *c)
{
apr_status_t rv;
+ apr_sockaddr_t *destsa;
if(!(started < requests)) return;
@@ -491,14 +492,15 @@
c->cbx = 0;
c->gotheader = 0;
+ if ((rv = apr_getaddrinfo(&destsa, hostname, AF_INET, port, cntxt))
+ != APR_SUCCESS) {
+ apr_err("apr_getaddrinfo()", rv);
+ }
if ((rv = apr_create_tcp_socket(&c->aprsock, cntxt)) != APR_SUCCESS) {
apr_err("Socket:", rv);
}
- if ((rv = apr_set_port(c->aprsock, APR_REMOTE, port)) != APR_SUCCESS) {
- apr_err("Port:", rv);
- }
c->start = apr_now();
- if ((rv = apr_connect(c->aprsock, hostname)) != APR_SUCCESS) {
+ if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) {
if (APR_STATUS_IS_EINPROGRESS(rv)) {
c->state = STATE_CONNECTING;
apr_add_poll_socket(readbits, c->aprsock, APR_POLLOUT);
--
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] change apr_connect() to take apr_sockaddr_t, add apr_getaddrinfo()
Posted by David Reid <dr...@jetnet.co.uk>.
Looks OK with that suplicate line removed.
+1
david
----- Original Message -----
From: "Jeff Trawick" <tr...@bellsouth.net>
To: <de...@apr.apache.org>
Sent: Thursday, November 16, 2000 6:25 PM
Subject: [PATCH] change apr_connect() to take apr_sockaddr_t, add
apr_getaddrinfo()
> This started off as David Reid's patch which he posted this a.m. I
> renamed his apr_gethostbyname() to apr_getaddrinfo(), added fields
> family and port to apr_getaddrinfo(), made some fixes, and changed the
> remaining callers of apr_connect() to use the new parameter list.
>
> Changes to the currently-committed API:
>
> . apr_connect() takes an apr_sockaddr_t parameter instead of hostname
>
> . apr_getaddrinfo() is new; this builds an apr_sockaddr_t representing
> the peer you wish to communicate with
>
> Suggestions? Concerns?
>
> Index: lib/apr/include/apr_network_io.h
> ===================================================================
> RCS file:
/home/cvspublic/apache-2.0/src/lib/apr/include/apr_network_io.h,v
> retrieving revision 1.71
> diff -u -r1.71 apr_network_io.h
> --- lib/apr/include/apr_network_io.h 2000/11/16 14:48:50 1.71
> +++ lib/apr/include/apr_network_io.h 2000/11/16 18:07:26
> @@ -265,7 +265,7 @@
> * APR assumes that the sockaddr_in in the apr_socket is
> * completely filled out.
> */
> -apr_status_t apr_connect(apr_socket_t *sock, const char *hostname);
> +apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa);
>
> /**
> * Get name of a machine we are currently connected to.
> @@ -274,6 +274,12 @@
> * @param sock The socket to examine.
> */
> apr_status_t apr_get_hostname(char **name, apr_interface_e which,
apr_socket_t *sock);
> +
> +apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa,
> + const char *hostname,
> + apr_int32_t family,
> + apr_port_t port,
> + apr_pool_t *p);
>
> /**
> * Get name of the current machine
> Index: lib/apr/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.6
> diff -u -r1.6 sa_common.c
> --- lib/apr/network_io/unix/sa_common.c 2000/11/16 14:48:49 1.6
> +++ lib/apr/network_io/unix/sa_common.c 2000/11/16 18:07:27
> @@ -171,3 +171,65 @@
> return APR_SUCCESS;
> }
>
> +static void set_sockaddr_vars(apr_sockaddr_t *addr, int family)
> +{
> + addr->sa.sin.sin_family = family;
> + addr->sa.sin.sin_family = family;
> +
> + if (family == AF_INET) {
> + addr->sa_len = sizeof(struct sockaddr_in);
> + addr->addr_str_len = 16;
> + addr->ipaddr_ptr = &(addr->sa.sin.sin_addr);
> + addr->ipaddr_len = sizeof(struct in_addr);
> + }
> +#if APR_HAVE_IPV6
> + else if (family == AF_INET6) {
> + addr->sa_len = sizeof(struct sockaddr_in6);
> + addr->addr_str_len = 46;
> + addr->ipaddr_ptr = &(addr->sa.sin6.sin6_addr);
> + addr->ipaddr_len = sizeof(struct in6_addr);
> + }
> +#endif
> +}
> +
> +apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa, const char *hostname,
> + apr_int32_t family, apr_port_t port,
> + apr_pool_t *p)
> +{
> + struct hostent *hp;
> +
> + (*sa) = (apr_sockaddr_t *)apr_pcalloc(p, sizeof(apr_sockaddr_t));
> + if ((*sa) == NULL)
> + return APR_ENOMEM;
> + (*sa)->pool = p;
> + (*sa)->sa.sin.sin_family = AF_INET; /* we don't yet support IPv6 */
> + (*sa)->sa.sin.sin_port = htons(port);
> + set_sockaddr_vars(*sa, (*sa)->sa.sin.sin_family);
> +
> + if (hostname != NULL) {
> +#ifndef GETHOSTBYNAME_HANDLES_NAS
> + if (*hostname >= '0' && *hostname <= '9' &&
> + strspn(hostname, "0123456789.") == strlen(hostname)) {
> + (*sa)->sa.sin.sin_addr.s_addr = inet_addr(hostname);
> + (*sa)->sa_len = sizeof(struct sockaddr_in);
> + }
> + else {
> +#endif
> + hp = gethostbyname(hostname);
> +
> + if (!hp) {
> + return (h_errno + APR_OS_START_SYSERR);
> + }
> +
> + memcpy((char *)&(*sa)->sa.sin.sin_addr, hp->h_addr_list[0],
> + hp->h_length);
> + (*sa)->sa_len = sizeof(struct sockaddr_in);
> + (*sa)->ipaddr_len = hp->h_length;
> +
> +#ifndef GETHOSTBYNAME_HANDLES_NAS
> + }
> +#endif
> + }
> + (*sa)->hostname = apr_pstrdup(p, hostname);
> + return APR_SUCCESS;
> +}
> Index: lib/apr/network_io/unix/sockets.c
> ===================================================================
> RCS file:
/home/cvspublic/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
> retrieving revision 1.56
> diff -u -r1.56 sockets.c
> --- lib/apr/network_io/unix/sockets.c 2000/11/16 14:48:49 1.56
> +++ lib/apr/network_io/unix/sockets.c 2000/11/16 18:07:27
> @@ -226,57 +226,35 @@
> return APR_SUCCESS;
> }
>
> -apr_status_t apr_connect(apr_socket_t *sock, const char *hostname)
> +apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
> {
> - struct hostent *hp;
> -
> if ((sock->socketdes < 0) || (!sock->remote_addr)) {
> return APR_ENOTSOCK;
> }
> - if (hostname != NULL) {
> -#ifndef GETHOSTBYNAME_HANDLES_NAS
> - if (*hostname >= '0' && *hostname <= '9' &&
> - strspn(hostname, "0123456789.") == strlen(hostname)) {
> - sock->remote_addr->sa.sin.sin_addr.s_addr =
inet_addr(hostname);
> - }
> - else {
> -#endif
> - hp = gethostbyname(hostname);
> -
> - if (!hp) {
> - return (h_errno + APR_OS_START_SYSERR);
> - }
> -
> - /* 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);
> -
> -#ifndef GETHOSTBYNAME_HANDLES_NAS
> - }
> -#endif
> - }
>
> - if ((connect(sock->socketdes,
> - (const struct sockaddr *)&sock->remote_addr->sa.sin,
> - sock->remote_addr->sa_len) < 0) &&
> + if ((connect(sock->socketdes,
> + (const struct sockaddr *)&sa->sa.sin,
> + sa->sa_len) < 0) &&
> (errno != EINPROGRESS)) {
> return errno;
> }
> else {
> - /* XXX IPv6 */
> + sock->remote_addr = sa;
> + /* XXX IPv6 assumes sin_port and sin6_port at same offset */
> if (sock->local_addr->sa.sin.sin_port == 0) {
> /* connect() got us an ephemeral port */
> sock->local_port_unknown = 1;
> }
> - /* XXX IPv6 */
> - if (sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
> + /* XXX IPv6 to be handled better later... */
> + if (sock->local_addr->sa.sin.sin_family == AF_INET6 ||
> + sock->local_addr->sa.sin.sin_addr.s_addr == 0) {
> /* not bound to specific local interface; connect() had to
assign
> * one for the socket
> */
> sock->local_interface_unknown = 1;
> }
> #ifndef HAVE_POLL
> - sock->connected=1;
> + sock->connected=1;
> #endif
> return APR_SUCCESS;
> }
> Index: lib/apr/test/client.c
> ===================================================================
> RCS file: /home/cvspublic/apache-2.0/src/lib/apr/test/client.c,v
> retrieving revision 1.17
> diff -u -r1.17 client.c
> --- lib/apr/test/client.c 2000/11/09 15:01:35 1.17
> +++ lib/apr/test/client.c 2000/11/16 18:07:28
> @@ -73,6 +73,7 @@
> char *dest = "127.0.0.1";
> apr_port_t local_port, remote_port;
> apr_interval_time_t read_timeout = -1;
> + apr_sockaddr_t *destsa;
>
> setbuf(stdout, NULL);
> if (argc > 1) {
> @@ -115,17 +116,18 @@
> fprintf(stdout, "OK\n");
> }
>
> - fprintf(stdout, "\tClient: Setting port for socket.......");
> - if (apr_set_port(sock, APR_REMOTE, 8021) != APR_SUCCESS) {
> + fprintf(stdout,"\tClient: Making socket address...............");
> + if (apr_getaddrinfo(&destsa, dest, AF_INET, 8021, context) !=
APR_SUCCESS) {
> apr_close_socket(sock);
> - fprintf(stderr, "Couldn't set the port correctly\n");
> + fprintf(stdout, "Failed!\n");
> + fprintf(stdout, "Couldn't create a socket address structure for
%s\n", dest);
> exit(-1);
> }
> - fprintf(stdout, "OK\n");
> + fprintf(stdout,"OK\n");
>
> fprintf(stdout, "\tClient: Connecting to socket.......");
>
> - stat = apr_connect(sock, dest);
> + stat = apr_connect(sock, destsa);
>
> if (stat != APR_SUCCESS) {
> apr_close_socket(sock);
> Index: lib/apr/test/testsf.c
> ===================================================================
> RCS file: /home/cvspublic/apache-2.0/src/lib/apr/test/testsf.c,v
> retrieving revision 1.13
> diff -u -r1.13 testsf.c
> --- lib/apr/test/testsf.c 2000/11/14 19:32:26 1.13
> +++ lib/apr/test/testsf.c 2000/11/16 18:07:28
> @@ -205,6 +205,7 @@
> apr_pollfd_t *pfd;
> apr_int32_t nsocks;
> int i;
> + apr_sockaddr_t *destsa;
>
> apr_setup(&p, &sock);
> create_testfile(p, TESTFILE);
> @@ -217,15 +218,15 @@
> exit(1);
> }
>
> - rv = apr_set_port(sock, APR_REMOTE, TESTSF_PORT);
> + rv = apr_getaddrinfo(&destsa, "127.0.0.1", AF_INET, TESTSF_PORT, p);
> if (rv != APR_SUCCESS) {
> - fprintf(stderr, "apr_set_remote_port()->%d/%s\n",
> + fprintf(stderr, "apr_getaddrinfo()->%d/%s\n",
> rv,
> apr_strerror(rv, buf, sizeof buf));
> exit(1);
> }
>
> - rv = apr_connect(sock, "127.0.0.1");
> + rv = apr_connect(sock, destsa);
> if (rv != APR_SUCCESS) {
> fprintf(stderr, "apr_connect()->%d/%s\n",
> rv,
> Index: main/rfc1413.c
> ===================================================================
> RCS file: /home/cvspublic/apache-2.0/src/main/rfc1413.c,v
> retrieving revision 1.28
> diff -u -r1.28 rfc1413.c
> --- main/rfc1413.c 2000/11/09 15:09:50 1.28
> +++ main/rfc1413.c 2000/11/16 18:07:30
> @@ -108,8 +108,8 @@
>
> /* bind_connect - bind both ends of a socket */
> /* Ambarish fix this. Very broken */
> -static int get_rfc1413(apr_socket_t *sock, const char *local_ip,
> - const char *rmt_ip,
> +static int get_rfc1413(apr_socket_t *sock, apr_pool_t *p,
> + const char *local_ip, const char *rmt_ip,
> char user[RFC1413_USERLEN+1], server_rec *srv)
> {
> apr_port_t rmt_port, our_port;
> @@ -119,6 +119,7 @@
> char *cp;
> char buffer[RFC1413_MAXDATA + 1];
> int buflen;
> + apr_sockaddr_t *destsa;
>
> /*
> * Bind the local and remote ends of the query socket to the same
> @@ -138,14 +139,19 @@
> return -1;
> }
>
> + if ((status = apr_getaddrinfo(&destsa, rmt_ip, AF_INET, RFC1413_PORT,
> + p)) != APR_SUCCESS) {
> + /* This should not fail since we have a numeric address string
> + * as the host. */
> + ap_log_error(APLOG_MARK, APLOG_CRIT, status, srv,
> + "rfc1413: apr_getaddrinfo() failed");
> + return -1;
> + }
> /*
> * errors from connect usually imply the remote machine doesn't support
> * the service
> */
> - apr_set_port(sock, APR_REMOTE, RFC1413_PORT);
> - apr_set_ipaddr(sock, APR_REMOTE, rmt_ip);
> -
> - if (apr_connect(sock, NULL) != APR_SUCCESS)
> + if (apr_connect(sock, destsa) != APR_SUCCESS)
> return -1;
> apr_get_port(&sav_our_port, APR_LOCAL, sock);
> apr_get_port(&sav_rmt_port, APR_REMOTE, sock);
> @@ -235,7 +241,7 @@
> conn->remote_logname = result;
> }
>
> - if (get_rfc1413(sock, conn->local_ip, conn->remote_ip, user, srv) >=
0)
> + if (get_rfc1413(sock, conn->pool, conn->local_ip, conn->remote_ip,
user, srv) >= 0)
> result = user;
> apr_close_socket(sock);
> conn->remote_logname = result;
> Index: modules/proxy/proxy_util.c
> ===================================================================
> RCS file: /home/cvspublic/apache-2.0/src/modules/proxy/proxy_util.c,v
> retrieving revision 1.26
> diff -u -r1.26 proxy_util.c
> --- modules/proxy/proxy_util.c 2000/11/16 01:57:46 1.26
> +++ modules/proxy/proxy_util.c 2000/11/16 18:07:32
> @@ -1135,25 +1135,15 @@
> {
> apr_status_t rv;
> int i;
> + apr_sockaddr_t *destsa;
>
> - for (i = 0; host[i] != '\0'; i++)
> - if (!apr_isdigit(host[i]) && host[i] != '.')
> - break;
> -
> - apr_set_port(sock, APR_REMOTE, port);
> - if (host[i] == '\0') {
> - apr_set_ipaddr(sock, APR_REMOTE, host);
> - host = NULL;
> + rv = apr_getaddrinfo(&destsa, host, AF_INET, port, r->pool);
> + if (rv == APR_SUCCESS) {
> + rv = apr_connect(sock, destsa);
> }
> -
> - do
> - {
> - rv = apr_connect(sock, host);
> - } while (APR_STATUS_IS_EINTR(rv));
> -
> if (rv != APR_SUCCESS)
> {
> - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
> + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
> "proxy connect to %s port %d failed", host, port);
> }
> return rv;
> Index: support/ab.c
> ===================================================================
> RCS file: /home/cvspublic/apache-2.0/src/support/ab.c,v
> retrieving revision 1.32
> diff -u -r1.32 ab.c
> --- support/ab.c 2000/11/10 19:01:33 1.32
> +++ support/ab.c 2000/11/16 18:07:36
> @@ -482,6 +482,7 @@
> static void start_connect(struct connection *c)
> {
> apr_status_t rv;
> + apr_sockaddr_t *destsa;
>
> if(!(started < requests)) return;
>
> @@ -491,14 +492,15 @@
> c->cbx = 0;
> c->gotheader = 0;
>
> + if ((rv = apr_getaddrinfo(&destsa, hostname, AF_INET, port, cntxt))
> + != APR_SUCCESS) {
> + apr_err("apr_getaddrinfo()", rv);
> + }
> if ((rv = apr_create_tcp_socket(&c->aprsock, cntxt)) != APR_SUCCESS)
{
> apr_err("Socket:", rv);
> }
> - if ((rv = apr_set_port(c->aprsock, APR_REMOTE, port)) != APR_SUCCESS)
{
> - apr_err("Port:", rv);
> - }
> c->start = apr_now();
> - if ((rv = apr_connect(c->aprsock, hostname)) != APR_SUCCESS) {
> + if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) {
> if (APR_STATUS_IS_EINPROGRESS(rv)) {
> c->state = STATE_CONNECTING;
> apr_add_poll_socket(readbits, c->aprsock, APR_POLLOUT);
>
> --
> 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] change apr_connect() to take apr_sockaddr_t, add apr_getaddrinfo()
Posted by Jeff Trawick <tr...@bellsouth.net>.
rbb@covalent.net writes:
> > +
> > +apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa,
> > + const char *hostname,
> > + apr_int32_t family,
> > + apr_port_t port,
> > + apr_pool_t *p);
>
> Can/should we make the hostname, family, port, and pool a complete
> structure that is shared across platforms? Kind of like
> apr_finfo_t?
That common structure is the apr_sockaddr_t, which (supposedly) has
everything needed to represent a peer -- the stuff you mentioned and a
few other things. Since apr_getaddrinfo() is a way to build the
apr_sockaddr_t, it needs that information as parameters.
> > +static void set_sockaddr_vars(apr_sockaddr_t *addr, int family)
> > +{
> > + addr->sa.sin.sin_family = family;
> > + addr->sa.sin.sin_family = family;
>
> Why twice?
for *emphasis* (blush)
Thanks :)
--
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] change apr_connect() to take apr_sockaddr_t, add
apr_getaddrinfo()
Posted by rb...@covalent.net.
> +
> +apr_status_t apr_getaddrinfo(apr_sockaddr_t **sa,
> + const char *hostname,
> + apr_int32_t family,
> + apr_port_t port,
> + apr_pool_t *p);
Can/should we make the hostname, family, port, and pool a complete
structure that is shared across platforms? Kind of like apr_finfo_t?
> +static void set_sockaddr_vars(apr_sockaddr_t *addr, int family)
> +{
> + addr->sa.sin.sin_family = family;
> + addr->sa.sin.sin_family = family;
Why twice?
Ryan
_______________________________________________________________________________
Ryan Bloom rbb@apache.org
406 29th St.
San Francisco, CA 94131
-------------------------------------------------------------------------------