Return-Path: Delivered-To: apmail-apr-commits-archive@www.apache.org Received: (qmail 44807 invoked from network); 9 Sep 2005 08:05:12 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 Sep 2005 08:05:12 -0000 Received: (qmail 65029 invoked by uid 500); 9 Sep 2005 08:05:12 -0000 Delivered-To: apmail-apr-commits-archive@apr.apache.org Received: (qmail 64927 invoked by uid 500); 9 Sep 2005 08:05:11 -0000 Mailing-List: contact commits-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: Reply-To: dev@apr.apache.org List-Id: Delivered-To: mailing list commits@apr.apache.org Received: (qmail 64914 invoked by uid 99); 9 Sep 2005 08:05:11 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Fri, 09 Sep 2005 01:05:11 -0700 Received: (qmail 44780 invoked by uid 65534); 9 Sep 2005 08:05:11 -0000 Message-ID: <20050909080511.44778.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r279727 - in /apr/apr/trunk: CHANGES network_io/unix/sockets.c test/testsock.c Date: Fri, 09 Sep 2005 08:05:10 -0000 To: commits@apr.apache.org From: jorton@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jorton Date: Fri Sep 9 01:05:04 2005 New Revision: 279727 URL: http://svn.apache.org/viewcvs?rev=279727&view=rev Log: Fix apr_socket_addr_get(APR_REMOTE) after a non-blocking connect(): * network_io/unix/sockets.c (alloc_socket): Set remote_addr_unknown. (apr_socket_accept): Clear remote_addr_unknown. (apr_socket_connect): Clear remote_addr_unknown and set remote_addr iff the passed-in address was not the inaddr_any address. * test/testsock.c (test_get_addr): New test. PR: 32737 Modified: apr/apr/trunk/CHANGES apr/apr/trunk/network_io/unix/sockets.c apr/apr/trunk/test/testsock.c Modified: apr/apr/trunk/CHANGES URL: http://svn.apache.org/viewcvs/apr/apr/trunk/CHANGES?rev=279727&r1=279726&r2=279727&view=diff ============================================================================== --- apr/apr/trunk/CHANGES (original) +++ apr/apr/trunk/CHANGES Fri Sep 9 01:05:04 2005 @@ -1,8 +1,11 @@ Changes for APR 1.3.0 - *) Add apr_sockaddr_ip_getbuf() function. [Joe Orton] + *) Fix apr_socket_addr_get(,APR_REMOTE,) after a non-blocking + connection is completed. [Joe Orton] - *) Fix handling of %pI in apr_psprintf. [Joe Orton] + *) Add apr_sockaddr_ip_getbuf() function. [Joe Orton] + + *) Fix handling of %pI in apr_psprintf. [Joe Orton] *) Provide APR_VERSION_AT_LEAST() macro for applications which want to enable features based on a required level of APR. Modified: apr/apr/trunk/network_io/unix/sockets.c URL: http://svn.apache.org/viewcvs/apr/apr/trunk/network_io/unix/sockets.c?rev=279727&r1=279726&r2=279727&view=diff ============================================================================== --- apr/apr/trunk/network_io/unix/sockets.c (original) +++ apr/apr/trunk/network_io/unix/sockets.c Fri Sep 9 01:05:04 2005 @@ -66,6 +66,7 @@ (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->pool, sizeof(apr_sockaddr_t)); (*new)->remote_addr->pool = p; + (*new)->remote_addr_unknown = 1; #ifndef WAITIO_USES_POLL /* Create a pollset with room for one descriptor. */ /* ### check return codes */ @@ -197,6 +198,8 @@ } #endif + (*new)->remote_addr_unknown = 0; + *(*new)->local_addr = *sock->local_addr; /* The above assignment just overwrote the pool entry. Setting the local_addr @@ -289,7 +292,16 @@ return errno; } - sock->remote_addr = sa; + if (memcmp(sa->ipaddr_ptr, generic_inaddr_any, sa->ipaddr_len)) { + /* A real remote address was passed in. If the unspecified + * address was used, the actual remote addr will have to be + * determined using getpeername() if required. */ + /* ### this should probably be a structure copy + fixup as per + * _accept()'s handling of local_addr */ + sock->remote_addr = sa; + sock->remote_addr_unknown = 0; + } + if (sock->local_addr->port == 0) { /* connect() got us an ephemeral port */ sock->local_port_unknown = 1; Modified: apr/apr/trunk/test/testsock.c URL: http://svn.apache.org/viewcvs/apr/apr/trunk/test/testsock.c?rev=279727&r1=279726&r2=279727&view=diff ============================================================================== --- apr/apr/trunk/test/testsock.c (original) +++ apr/apr/trunk/test/testsock.c Fri Sep 9 01:05:04 2005 @@ -22,6 +22,7 @@ #include "apr_general.h" #include "apr_lib.h" #include "apr_strings.h" +#include "apr_poll.h" static void launch_child(abts_case *tc, apr_proc_t *proc, const char *arg1, apr_pool_t *p) { @@ -216,6 +217,64 @@ ABTS_STR_EQUAL(tc, "foo 0.0.0.0:80 bar", s); } +static void test_get_addr(abts_case *tc, void *data) +{ + apr_status_t rv; + apr_socket_t *ld, *sd, *cd; + apr_sockaddr_t *sa, *ca; + char *a, *b; + + ld = setup_socket(tc); + + APR_ASSERT_SUCCESS(tc, + "get local address of bound socket", + apr_socket_addr_get(&sa, APR_LOCAL, ld)); + + rv = apr_socket_create(&cd, sa->family, SOCK_STREAM, + APR_PROTO_TCP, p); + APR_ASSERT_SUCCESS(tc, "create client socket", rv); + + APR_ASSERT_SUCCESS(tc, "enable non-block mode", + apr_socket_opt_set(cd, APR_SO_NONBLOCK, 1)); + + /* initiate connection */ + apr_socket_connect(cd, sa); + + APR_ASSERT_SUCCESS(tc, "accept connection", + apr_socket_accept(&sd, ld, p)); + + { + /* wait for writability */ + apr_pollfd_t pfd; + int n; + + pfd.p = p; + pfd.desc_type = APR_POLL_SOCKET; + pfd.reqevents = APR_POLLOUT|APR_POLLHUP; + pfd.desc.s = cd; + pfd.client_data = NULL; + + APR_ASSERT_SUCCESS(tc, "poll for connect completion", + apr_poll(&pfd, 1, &n, 5 * APR_USEC_PER_SEC)); + + } + + APR_ASSERT_SUCCESS(tc, "get local address of server socket", + apr_socket_addr_get(&sa, APR_LOCAL, sd)); + + APR_ASSERT_SUCCESS(tc, "get remote address of client socket", + apr_socket_addr_get(&ca, APR_REMOTE, cd)); + + a = apr_psprintf(p, "%pI", sa); + b = apr_psprintf(p, "%pI", ca); + + ABTS_STR_EQUAL(tc, a, b); + + apr_socket_close(cd); + apr_socket_close(sd); + apr_socket_close(ld); +} + abts_suite *testsock(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -226,6 +285,7 @@ abts_run_test(suite, test_recv, NULL); abts_run_test(suite, test_timeout, NULL); abts_run_test(suite, test_print_addr, NULL); + abts_run_test(suite, test_get_addr, NULL); return suite; }