[OK, I'm getting better at this Reply To All stuff...] > > 1. Modify connect to take an apr_sockaddr_t instead of a hostname... This > > is a simple change so I'll make it sooner rather than later. > > yes...
OK, I've done some work on this but am getting an error now Could not connect: Can't assign requested address (49) I've got to drive to Suffolk in a short while so I'll post the patch at the end of this message and let someone else figure out where I've screwed up! :) > > > ??? Do we change apr_gethostbyname to return an apr_sockaddr_t? > > yes... > > > This would then give > > apr_sockaddr_t *sa; > > apr_gethostbyname(&sa, "hostname", pool); > > apr_connect(sock, sa); > > We need to add more arguments: address family for sure and possibly > flags. Look at getaddrinfo(). And do we want to add an optional > service name/port number parameter? That would build the complete > sockaddr for us. OK. Care to suggest the definition? > > > 2. Are we agreed on Jeff's suggestions of > > Add apr_pool_t * to apr_sockaddr_t. > > apr_status_t apr_get_address(char **hostname, apr_interface_e which, > > apr_socket_t *sock); > > apr_status_t apr_get_nas(char **addr, apr_sockaddr_t *sa); > > These are new additions sos houldn't interfere with any existing > > code. > > I am. Good. > > In addition to the changes you mentioned, I see apr_create_socket() as > extremely important in the short run and I think we should think about > apr_bind() working like apr_connect() (in other words, taking an > apr_sockaddr_t). That makes sense when the user has told us the local > interface address and we have to resolve it anyway. We have to keep > it from being painful when we just have the port number. OK, so again care to suggest the API definitions? > > > 3. Before we can take this further, I guess we need to add the following > > though... > > I'll let others comment on this stuff. I'm much more concerned about > getting enough IPv6 enabled in APR so we can test it properly. Apache > needs can come a little later (for me, at least). Agreed in principal... However, we are about to beta Apache 2.0 (I did wanr that this change would screw things up a while back) so I'm not sure if the timing is good for stopping apache building. then again if we break it they'll have to fix it... :) david Index: include/apr_network_io.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_network_io.h,v retrieving revision 1.70 diff -u -r1.70 apr_network_io.h --- include/apr_network_io.h 2000/11/16 01:51:33 1.70 +++ include/apr_network_io.h 2000/11/16 13:40:54 @@ -255,7 +255,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. +apr_status_t apr_gethostbyname(apr_sockaddr_t **sa, const char *hostname, apr_pool_t *p); Modify apr_connect... apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa) { if ((sock->socketdes < 0) || (!sock->remote_addr)) { return APR_ENOTSOCK; } if ((connect(sock->socketdes, (const struct sockaddr *)&sa->sa.sin, sa->sa_len) < 0) && (errno != EINPROGRESS)) { return errno; } else { sock->remote_addr = sa; /* XXX IPv6 */ 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) { /* 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; #endif return APR_SUCCESS; } } This into sa_common.c apr_status_t apr_gethostbyname(apr_sockaddr_t **sa, const char *hostname, 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 */ 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); } /* XXX IPv6: move name resolution out of this function */ 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: test/client.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/test/client.c,v retrieving revision 1.17 diff -u -r1.17 client.c --- test/client.c 2000/11/09 15:01:35 1.17 +++ test/client.c 2000/11/16 13:36:45 @@ -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) { @@ -123,9 +124,18 @@ } fprintf(stdout, "OK\n"); + fprintf(stdout,"\tClient: Making socket address..............."); + if (apr_gethostbyname(&destsa, dest, context) != APR_SUCCESS){ + apr_close_socket(sock); + 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, "\tClient: Connecting to socket......."); - stat = apr_connect(sock, dest); + stat = apr_connect(sock, destsa); if (stat != APR_SUCCESS) { apr_close_socket(sock);