You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2013/09/06 09:04:28 UTC
svn commit: r1520501 - in /tomcat/jk/trunk/native/common: jk_ajp_common.c
jk_connect.c jk_global.h jk_status.c
Author: mturk
Date: Fri Sep 6 07:04:28 2013
New Revision: 1520501
URL: http://svn.apache.org/r1520501
Log:
IPV6 support - use inet_ntop from APR. Stil no funtional changes
Modified:
tomcat/jk/trunk/native/common/jk_ajp_common.c
tomcat/jk/trunk/native/common/jk_connect.c
tomcat/jk/trunk/native/common/jk_global.h
tomcat/jk/trunk/native/common/jk_status.c
Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1520501&r1=1520500&r2=1520501&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Fri Sep 6 07:04:28 2013
@@ -1002,7 +1002,7 @@ static int ajp_handle_cping_cpong(ajp_en
*/
int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_logger_t *l)
{
- char buf[32];
+ char buf[64];
int rc = JK_TRUE;
JK_TRACE_ENTER(l);
@@ -1264,7 +1264,7 @@ int ajp_connection_tcp_get_message(ajp_e
int rc;
int msglen;
unsigned int header;
- char buf[32];
+ char buf[64];
JK_TRACE_ENTER(l);
Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=1520501&r1=1520500&r2=1520501&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Fri Sep 6 07:04:28 2013
@@ -59,6 +59,18 @@ static apr_pool_t *jk_apr_pool = NULL;
#define USE_SOCK_CLOEXEC
#endif
+#ifndef IN6ADDRSZ
+#define IN6ADDRSZ 16
+#endif
+
+#ifndef INT16SZ
+#define INT16SZ sizeof(apr_int16_t)
+#endif
+
+#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT)
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#endif
+
/* our compiler cant deal with char* <-> const char* ... */
#if defined(NETWARE) && !defined(__NOVELL_LIBC__)
typedef char* SET_TYPE;
@@ -328,21 +340,16 @@ int jk_resolve(const char *host, int por
void *pool, int prefer_ipv6, jk_logger_t *l)
{
int x;
- struct in_addr laddr;
- struct sockaddr_in *rc;
+ struct in_addr laddr4;
+ struct sockaddr_in *rc4;
JK_TRACE_ENTER(l);
memset(saddr, 0, sizeof(jk_sockaddr_t));
- /* TODO:
- * This will depend on IPV4/IPV6 resolving
- * and prefer_ipv6
- */
- saddr->salen = (int)sizeof(struct sockaddr_in);
- rc = &saddr->sa.sin;
- rc->sin_port = htons((short)port);
- rc->sin_family = AF_INET;
+ rc4 = &saddr->sa.sin;
+ rc4->sin_port = htons((short)port);
+ rc4->sin_family = AF_INET;
/* Check if we only have digits in the string */
for (x = 0; host[x] != '\0'; x++) {
@@ -389,7 +396,7 @@ int jk_resolve(const char *host, int por
apr_sockaddr_ip_get(&remote_ipaddr, remote_sa);
- laddr.s_addr = jk_inet_addr(remote_ipaddr);
+ laddr4.s_addr = jk_inet_addr(remote_ipaddr);
#else /* HAVE_APR */
@@ -405,18 +412,27 @@ int jk_resolve(const char *host, int por
return JK_FALSE;
}
- laddr = *((struct in_addr *)hoste->h_addr_list[0]);
+ laddr4 = *((struct in_addr *)hoste->h_addr_list[0]);
#endif /* HAVE_APR */
}
else {
/* If we found only digits we use inet_addr() */
- laddr.s_addr = jk_inet_addr(host);
+ laddr4.s_addr = jk_inet_addr(host);
}
- memcpy(&(rc->sin_addr), &laddr, sizeof(laddr));
+ /* TODO:
+ * This will depend on IPV4/IPV6 resolving
+ * and prefer_ipv6
+ */
+ saddr->ipaddr_ptr = &rc4->sin_addr;
+ saddr->ipaddr_len = (int)sizeof(struct in_addr);
+ saddr->salen = (int)sizeof(struct sockaddr_in);
+ saddr->port = port;
+ saddr->host = host;
+ saddr->family = rc4->sin_family;
+
+ memcpy(saddr->ipaddr_ptr, &laddr4, saddr->ipaddr_len);
- saddr->port = port;
- saddr->host = host;
JK_TRACE_EXIT(l);
return JK_TRUE;
}
@@ -931,19 +947,178 @@ int jk_tcp_socket_recvfull(jk_sock_t sd,
return rdlen;
}
+/* const char *
+ * inet_ntop4(src, dst, size)
+ * format an IPv4 address, more or less like inet_ntoa()
+ * return:
+ * `dst' (as a const)
+ * notes:
+ * (1) uses no statics
+ * (2) takes a u_char* not an in_addr as input
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size)
+{
+ const apr_size_t MIN_SIZE = 16; /* space for 255.255.255.255\0 */
+ int n = 0;
+ char *next = dst;
+
+ if (size < MIN_SIZE) {
+ errno = ENOSPC;
+ return NULL;
+ }
+ do {
+ unsigned char u = *src++;
+ if (u > 99) {
+ *next++ = '0' + u/100;
+ u %= 100;
+ *next++ = '0' + u/10;
+ u %= 10;
+ }
+ else if (u > 9) {
+ *next++ = '0' + u/10;
+ u %= 10;
+ }
+ *next++ = '0' + u;
+ *next++ = '.';
+ n++;
+ } while (n < 4);
+ *--next = '\0';
+ return dst;
+}
+
+#if JK_HAVE_IPV6
+/* const char *
+ * inet_ntop6(src, dst, size)
+ * convert IPv6 binary address into presentation (printable) format
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size)
+{
+ /*
+ * Note that int32_t and int16_t need only be "at least" large enough
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * Keep this in mind if you think this function should have been coded
+ * to use pointer overlays. All the world's not a VAX.
+ */
+ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
+ struct { int base, len; } best = {-1, 0}, cur = {-1, 0};
+ unsigned int words[IN6ADDRSZ / INT16SZ];
+ int i;
+ const unsigned char *next_src, *src_end;
+ unsigned int *next_dest;
+
+ /*
+ * Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ next_src = src;
+ src_end = src + IN6ADDRSZ;
+ next_dest = words;
+ i = 0;
+ do {
+ unsigned int next_word = (unsigned int)*next_src++;
+ next_word <<= 8;
+ next_word |= (unsigned int)*next_src++;
+ *next_dest++ = next_word;
+
+ if (next_word == 0) {
+ if (cur.base == -1) {
+ cur.base = i;
+ cur.len = 1;
+ }
+ else {
+ cur.len++;
+ }
+ } else {
+ if (cur.base != -1) {
+ if (best.base == -1 || cur.len > best.len) {
+ best = cur;
+ }
+ cur.base = -1;
+ }
+ }
+
+ i++;
+ } while (next_src < src_end);
+
+ if (cur.base != -1) {
+ if (best.base == -1 || cur.len > best.len) {
+ best = cur;
+ }
+ }
+ if (best.base != -1 && best.len < 2) {
+ best.base = -1;
+ }
+
+ /*
+ * Format the result.
+ */
+ tp = tmp;
+ for (i = 0; i < (IN6ADDRSZ / INT16SZ);) {
+ /* Are we inside the best run of 0x00's? */
+ if (i == best.base) {
+ *tp++ = ':';
+ i += best.len;
+ continue;
+ }
+ /* Are we following an initial run of 0x00s or any real hex? */
+ if (i != 0) {
+ *tp++ = ':';
+ }
+ /* Is this address an encapsulated IPv4? */
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
+ if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) {
+ return (NULL);
+ }
+ tp += strlen(tp);
+ break;
+ }
+ tp += sprintf(tp, "%x", words[i]);
+ i++;
+ }
+ /* Was it a trailing run of 0x00's? */
+ if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) {
+ *tp++ = ':';
+ }
+ *tp++ = '\0';
+
+ /*
+ * Check for overflow, copy, and we're done.
+ */
+ if ((size_t)(tp - tmp) > size) {
+ errno = ENOSPC;
+ return NULL;
+ }
+ strcpy(dst, tmp);
+ return dst;
+}
+#endif
+
/**
* dump a sockaddr_in in A.B.C.D:P in ASCII buffer
*
*/
char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf)
{
- unsigned long laddr = (unsigned long)htonl(saddr->sa.sin.sin_addr.s_addr);
- unsigned short lport = (unsigned short)htons(saddr->sa.sin.sin_port);
+ char pb[8];
- sprintf(buf, "%d.%d.%d.%d:%d",
- (int)(laddr >> 24), (int)((laddr >> 16) & 0xff),
- (int)((laddr >> 8) & 0xff), (int)(laddr & 0xff), (int)lport);
+ if (saddr->family == AF_INET) {
+ inet_ntop4(saddr->ipaddr_ptr, buf, 16);
+ }
+#if APR_HAVE_IPV6
+ else {
+ inet_ntop6(saddr->ipaddr_ptr, buf, 64);
+ }
+#endif
+ sprintf(pb, ":%d", saddr->port);
+ strcat(buf, pb);
return buf;
}
Modified: tomcat/jk/trunk/native/common/jk_global.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_global.h?rev=1520501&r1=1520500&r2=1520501&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_global.h (original)
+++ tomcat/jk/trunk/native/common/jk_global.h Fri Sep 6 07:04:28 2013
@@ -411,12 +411,17 @@ typedef int jk_sock_t;
#endif
#endif
+
typedef struct jk_sockaddr_t jk_sockaddr_t;
struct jk_sockaddr_t {
int family;
int port;
- const char *host;
int salen;
+ int ipaddr_len;
+ /** This points to the IP address structure within the appropriate
+ * sockaddr structure. */
+ void *ipaddr_ptr;
+ const char *host;
/** Union of either IPv4 or IPv6 sockaddr. */
union {
/** IPv4 sockaddr structure */
Modified: tomcat/jk/trunk/native/common/jk_status.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_status.c?rev=1520501&r1=1520500&r2=1520501&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_status.c (original)
+++ tomcat/jk/trunk/native/common/jk_status.c Fri Sep 6 07:04:28 2013
@@ -1727,7 +1727,7 @@ static void display_worker_ajp_conf_deta
int type,
jk_logger_t *l)
{
- char buf[32];
+ char buf[64];
JK_TRACE_ENTER(l);
@@ -1770,7 +1770,7 @@ static void display_worker_ajp_details(j
int map_count,
jk_logger_t *l)
{
- char buf[32];
+ char buf[64];
char buf_rd[32];
char buf_rd_sec[32];
char buf_wr[32];
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org