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);

Reply via email to