Hi
Classpath 0.98 doesn't even compile nowdays, giving various pointer
aliasing errors on GCC 4.4.3 and later. One of the affected files,
native/jni/native-lib/cpnet.c, has already been patched in CVS (so why
hasn't it been released yet?), and I am attaching a patch for the
other.
Regards
Damjan Jovanovic
diff -ur classpath-0.98/native/jni/java-nio/gnu_java_nio_VMChannel.c
classpath-0.98-patched/native/jni/java-nio/gnu_java_nio_VMChannel.c
--- classpath-0.98/native/jni/java-nio/gnu_java_nio_VMChannel.c 2007-12-28
19:49:56.000000000 +0200
+++ classpath-0.98-patched/native/jni/java-nio/gnu_java_nio_VMChannel.c
2011-03-03 11:06:15.000000000 +0200
@@ -761,9 +761,11 @@
struct sockaddr_in6 sock_storage;
struct sockaddr_in6 *sock6;
socklen_t slen = sizeof (struct sockaddr_in6);
+#define SIN_FAMILY sin6_family
#else
struct sockaddr_in sock_storage;
socklen_t slen = sizeof (struct sockaddr_in);
+#define SIN_FAMILY sin_family
#endif /* HAVE_INET6 */
struct sockaddr *sockaddr = (struct sockaddr *) &sock_storage;
struct sockaddr_in *sock4;
@@ -801,7 +803,7 @@
return 0;
}
- if (sockaddr->sa_family == AF_INET)
+ if (sock_storage.SIN_FAMILY == AF_INET)
{
sock4 = (struct sockaddr_in *) sockaddr;
memcpy (addrPortPtr, &(sock4->sin_addr.s_addr), 4);
@@ -809,7 +811,7 @@
result = 4;
}
#ifdef HAVE_INET6
- else if (sockaddr->sa_family == AF_INET6)
+ else if (sock_storage.SIN_FAMILY == AF_INET6)
{
sock6 = (struct sockaddr_in6 *) sockaddr;
memcpy (addrPortPtr, &(sock6->sin6_addr.s6_addr), 16);
@@ -829,6 +831,7 @@
buf.count += ret;
JCL_release_buffer (env, &buf, dst, 0);
+#undef SIN_FAMILY
return result;
#else
(void) fd;
@@ -1362,9 +1365,11 @@
struct sockaddr_in6 *addr6;
struct sockaddr_in6 sock_storage;
socklen_t socklen = sizeof (struct sockaddr_in6);
+#define SIN_FAMILY sin6_family
#else
struct sockaddr_in sock_storage;
socklen_t socklen = sizeof (struct sockaddr_in);
+#define SIN_FAMILY sin_family
#endif /* HAVE_INET6 */
struct sockaddr *sockaddr = (struct sockaddr *) &sock_storage;
@@ -1379,7 +1384,7 @@
return 0;
}
- if (sockaddr->sa_family == AF_INET)
+ if (sock_storage.SIN_FAMILY == AF_INET)
{
addr4 = (struct sockaddr_in *) sockaddr;
memcpy (nameptr, &(addr4->sin_addr.s_addr), 4);
@@ -1389,7 +1394,7 @@
#ifdef HAVE_INET6
/* IPv6 */
- if (sockaddr->sa_family == AF_INET6)
+ if (sock_storage.SIN_FAMILY == AF_INET6)
{
addr6 = (struct sockaddr_in6 *) sockaddr;
memcpy (nameptr, &(addr6->sin6_addr.s6_addr), 16);
@@ -1404,6 +1409,7 @@
(void) name;
JCL_ThrowException (env, IO_EXCEPTION, "getsockname not supported");
return -1;
+#undef SIN_FAMILY
#endif /* HAVE_GETSOCKNAME */
}
@@ -1422,9 +1428,11 @@
struct sockaddr_in6 *addr6;
struct sockaddr_in6 sock_storage;
socklen_t socklen = sizeof (struct sockaddr_in6);
+#define SIN_FAMILY sin6_family
#else
struct sockaddr_in sock_storage;
socklen_t socklen = sizeof (struct sockaddr_in);
+#define SIN_FAMILY sin_family
#endif /* HAVE_INET6 */
struct sockaddr *sockaddr = (struct sockaddr *) &sock_storage;
@@ -1440,7 +1448,7 @@
return 0;
}
- if (sockaddr->sa_family == AF_INET)
+ if (sock_storage.SIN_FAMILY == AF_INET)
{
addr4 = (struct sockaddr_in *) sockaddr;
memcpy (nameptr, &(addr4->sin_addr.s_addr), 4);
@@ -1448,7 +1456,7 @@
return 4;
}
#ifdef HAVE_INET6
- else if (sockaddr->sa_family == AF_INET6)
+ else if (sock_storage.SIN_FAMILY == AF_INET6)
{
addr6 = (struct sockaddr_in6 *) sockaddr;
memcpy (nameptr, &(addr6->sin6_addr.s6_addr), 16);