This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat-native.git


The following commit(s) were added to refs/heads/main by this push:
     new 73c347b  Revert "Simplify Address#getInfo() native implementation"
73c347b is described below

commit 73c347b8d2565a87e5a5d98bfa1f89eef71c6211
Author: Michael Osipov <micha...@apache.org>
AuthorDate: Wed May 26 11:31:18 2021 +0200

    Revert "Simplify Address#getInfo() native implementation"
    
    This reverts commit 420cd1c159e4f27bb5d2a873dbd1fb7ea5d3473c.
---
 native/src/address.c              | 42 ++++++++++++++++++++++++++++++++++++++-
 xdocs/miscellaneous/changelog.xml |  5 -----
 2 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/native/src/address.c b/native/src/address.c
index fb17431..87a8771 100644
--- a/native/src/address.c
+++ b/native/src/address.c
@@ -23,19 +23,59 @@ TCN_IMPLEMENT_CALL(jlong, Address, info)(TCN_STDARGS,
 {
     apr_pool_t *p = J2P(pool, apr_pool_t *);
     TCN_ALLOC_CSTRING(hostname);
+    char *sp = NULL;
+    int   scope_id = 0;
     apr_sockaddr_t *sa = NULL;
+    apr_sockaddr_t *sl = NULL;
     apr_int32_t f;
 
 
     UNREFERENCED(o);
     GET_S_FAMILY(f, family);
+#if APR_HAVE_IPV6
+    if (hostname) {
+        /* XXX: This only works for real scope_id's
+         */
+        if ((sp = strchr(J2S(hostname), '%'))) {
+            *sp++ = '\0';
+            scope_id = atoi(sp);
+        }
+    }
+#endif
     TCN_THROW_IF_ERR(apr_sockaddr_info_get(&sa,
             J2S(hostname), f, (apr_port_t)port,
             (apr_int32_t)flags, p), sa);
+    sl = sa;
+    /* 
+     * apr_sockaddr_info_get may return several address so this is not
+     * go to work in some cases (but as least it works for Linux)
+     * XXX: with AP_ENABLE_V4_MAPPED it is going to work otherwise it won't.
+     */
+#if APR_HAVE_IPV6
+    if (hostname == NULL) {
+        /* Try all address using IPV6 one */
+        while (sl) {
+            if (sl->family == APR_INET6)
+                break; /* Done */
+            sl = sl->next;
+        }
+        /* If we don't find an IPv6 address, use the original one */
+        if (sl == NULL) {
+            sl = sa;
+        }
+    }
+    if (sp) {
+        /* Set the provided scope id
+         * APR lack the api for setting this directly so lets presume
+         * the sin6_scope_id is present everywhere
+         */
+        sl->sa.sin6.sin6_scope_id = scope_id;
+    }
+#endif
 
 cleanup:
     TCN_FREE_CSTRING(hostname);
-    return P2J(sa);
+    return P2J(sl);
 }
 
 TCN_IMPLEMENT_CALL(jstring, Address, getnameinfo)(TCN_STDARGS,
diff --git a/xdocs/miscellaneous/changelog.xml 
b/xdocs/miscellaneous/changelog.xml
index c735980..9f35b6e 100644
--- a/xdocs/miscellaneous/changelog.xml
+++ b/xdocs/miscellaneous/changelog.xml
@@ -35,11 +35,6 @@
   </p>
 </section>
 <section name="Changes in 1.2.29">
-  <changelog>
-    <update>
-      Simplify <code>Address.getInfo()<code> native implementation. (michaelo)
-    </update>
-  </changelog>
 </section>
 <section name="Changes in 1.2.28">
   <changelog>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to