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