$OpenBSD: patch-j2se_src_solaris_native_java_net_PlainDatagramSocketImpl_c,v 1.1 2007/09/06 15:46:19 kurt Exp $
--- j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c.orig	Thu Aug  2 03:52:40 2007
+++ j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Fri Aug  3 18:03:01 2007
@@ -23,12 +23,12 @@
  *
  */
 
+#include <sys/types.h>
+#include <sys/socket.h>
 #include <errno.h>
 #include <netinet/in.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
 
 #ifdef __solaris__
 #include <fcntl.h>
@@ -335,7 +335,7 @@ Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIE
     /* The fdObj'fd */
     jint fd;
 
-#ifdef __linux__
+#if defined(__linux__) || defined(_ALLBSD_SOURCE)
     SOCKADDR addr;
     int len;
 #endif
@@ -345,26 +345,39 @@ Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIE
     }
     fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
 
+#if defined(__linux__) || defined(_ALLBSD_SOURCE)
 #ifdef __linux__
     if (isOldKernel) {
 	int t = 1;
         setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, (char*) &t, sizeof(int));
     } else {
+#endif /* __linux__ */
         memset(&addr, 0, sizeof(addr));
 #ifdef AF_INET6
         if (ipv6_available()) {
             struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&addr;
+#ifdef __FreeBSD__
+            him6->sin6_family = AF_INET6;
+#else
             him6->sin6_family = AF_UNSPEC;
+#endif
             len = sizeof(struct sockaddr_in6);
         } else
 #endif
         {
             struct sockaddr_in *him4 = (struct sockaddr_in*)&addr;
+#ifdef __FreeBSD__
+            him4->sin_family = AF_INET;
+#else
             him4->sin_family = AF_UNSPEC;
+#endif
             len = sizeof(struct sockaddr_in);
         }
         JVM_Connect(fd, (struct sockaddr *)&addr, len);
+	/* XXXBSD: here we can get EADDRNOTAVAIL which need to be ignored
+	   but since return value is not checked, ignore it */
 
+#ifdef __linux__
         // After disconnecting a UDP socket, Linux kernel will set
         // local port to zero if the port number comes from implicit
         // bind. Successive send/recv on the same socket will fail.
@@ -387,6 +400,7 @@ Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIE
             NET_Bind(fd, (struct sockaddr *)&addr, len);
         }
     }
+#endif
 #else
     JVM_Connect(fd, 0, 0);
 #endif
@@ -2374,18 +2388,30 @@ static void mcast_join_leave(JNIEnv *env, jobject this
 	    mname6.ipv6mr_interface = idx;
 	}
 
+#if defined(_ALLBSD_SOURCE)
+#define ADD_MEMBERSHIP		IPV6_JOIN_GROUP
+#define DRP_MEMBERSHIP		IPV6_LEAVE_GROUP
+#define S_ADD_MEMBERSHIP	"IPV6_JOIN_GROUP"
+#define S_DRP_MEMBERSHIP	"IPV6_LEAVE_GROUP"
+#else
+#define ADD_MEMBERSHIP		IPV6_ADD_MEMBERSHIP
+#define DRP_MEMBERSHIP		IPV6_DROP_MEMBERSHIP
+#define S_ADD_MEMBERSHIP	"IPV6_ADD_MEMBERSHIP"
+#define S_DRP_MEMBERSHIP	"IPV6_DROP_MEMBERSHIP"
+#endif
+
 	/* Join the multicast group */
-	if (JVM_SetSockOpt(fd, IPPROTO_IPV6, (join ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP), 
+	if (JVM_SetSockOpt(fd, IPPROTO_IPV6, (join ? ADD_MEMBERSHIP : DRP_MEMBERSHIP), 
 			   (char *) &mname6, sizeof (mname6)) < 0) {
 
 	    if (join) {
-		NET_ThrowCurrent(env, "setsockopt IPV6_ADD_MEMBERSHIP failed");
+		NET_ThrowCurrent(env, "setsockopt " S_ADD_MEMBERSHIP " failed");
 	    } else {
 		if (errno == ENOENT) {
 		   JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
 			"Not a member of the multicast group");
 		} else {
-		    NET_ThrowCurrent(env, "setsockopt IPV6_DROP_MEMBERSHIP failed");
+		    NET_ThrowCurrent(env, "setsockopt " S_DRP_MEMBERSHIP"  failed");
 		}
 	    }
 	}
