aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorgreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>2005-02-01 19:22:47 +0000
committergreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>2005-02-01 19:22:47 +0000
commit611bd8f1bc1725cd72aa9d296a9f2497cebca777 (patch)
treeffd71d91b383945d5a4c9caacc285a2bf8c5e3c3 /libjava
parent136bf51c5cc9884840d7585a91710785c8236353 (diff)
2005-01-31 Anthony Green <green@redhat.com>
* gnu/java/net/natPlainDatagramSocketImplPosix.cc (getOption): Support IP_MULTICAST_LOOP. (setOption): Support IP_MULTICAST_LOOP. * gnu/java/net/natPlainSocketImplPosix.cc (setOption): Add SO_REUSEADDR support. (getOption): Support SO_REUSEADDR. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94555 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc68
-rw-r--r--libjava/gnu/java/net/natPlainSocketImplPosix.cc21
3 files changed, 89 insertions, 10 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index d90f01f0d97..972745b5c55 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2005-01-31 Anthony Green <green@redhat.com>
+
+ * gnu/java/net/natPlainDatagramSocketImplPosix.cc (getOption):
+ Support IP_MULTICAST_LOOP.
+ (setOption): Support IP_MULTICAST_LOOP.
+
+ * gnu/java/net/natPlainSocketImplPosix.cc (setOption): Add
+ SO_REUSEADDR support.
+ (getOption): Support SO_REUSEADDR.
+
2004-01-28 Jeroen Frijters <jeroen@frijters.net>
PR libgcj/19649
diff --git a/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc b/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
index b1bc514c198..5c76779d9dd 100644
--- a/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
+++ b/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
@@ -602,9 +602,27 @@ gnu::java::net::PlainDatagramSocketImpl::setOption (jint optID,
return;
case _Jv_IP_MULTICAST_LOOP_ :
- throw new ::java::net::SocketException (
- JvNewStringUTF ("IP_MULTICAST_LOOP: not yet implemented"));
- return;
+ haddress = ((::java::net::InetAddress *) value)->addr;
+ len = haddress->length;
+ if (len == 4)
+ {
+ level = IPPROTO_IP;
+ opname = IP_MULTICAST_LOOP;
+ }
+#if defined (HAVE_INET6) && defined (IPV6_MULTICAST_LOOP)
+ else if (len == 16)
+ {
+ level = IPPROTO_IPV6;
+ opname = IPV6_MULTICAST_LOOP;
+ }
+#endif
+ else
+ throw
+ new ::java::net::SocketException (JvNewStringUTF ("invalid address length"));
+ if (::setsockopt (native_fd, level, opname, (char *) &val,
+ val_len) != 0)
+ goto error;
+ return;
case _Jv_IP_TOS_ :
if (::setsockopt (native_fd, SOL_SOCKET, IP_TOS, (char *) &val,
@@ -631,6 +649,7 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
socklen_t val_len = sizeof(val);
union SockAddr u;
socklen_t addrlen = sizeof(u);
+ int level, opname;
switch (optID)
{
@@ -738,8 +757,47 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
break;
case _Jv_IP_MULTICAST_LOOP_ :
- if (::getsockopt (native_fd, SOL_SOCKET, IP_MULTICAST_LOOP, (char *) &val,
- &val_len) != 0)
+ // cache the local address
+ if (localAddress == NULL)
+ {
+ jbyteArray laddr;
+ if (::getsockname (native_fd, (sockaddr*) &u, &addrlen) != 0)
+ goto error;
+ if (u.address.sin_family == AF_INET)
+ {
+ laddr = JvNewByteArray (4);
+ memcpy (elements (laddr), &u.address.sin_addr, 4);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ laddr = JvNewByteArray (16);
+ memcpy (elements (laddr), &u.address6.sin6_addr, 16);
+ }
+#endif
+ else
+ throw new ::java::net::SocketException (
+ JvNewStringUTF ("invalid family"));
+ localAddress = new ::java::net::InetAddress (laddr, NULL);
+
+ }
+ if (localAddress->addr->length == 4)
+ {
+ level = IPPROTO_IP;
+ opname = IP_MULTICAST_LOOP;
+ }
+#if defined (HAVE_INET6) && defined (IPV6_MULTICAST_LOOP)
+ else if (localAddress->addr->length == 16)
+ {
+ level = IPPROTO_IPV6;
+ opname = IPV6_MULTICAST_LOOP;
+ }
+#endif
+ else
+ throw
+ new ::java::net::SocketException (JvNewStringUTF ("invalid address length"));
+ if (::getsockopt (native_fd, level, opname, (char *) &val,
+ &val_len) != 0)
goto error;
return new ::java::lang::Boolean (val != 0);
diff --git a/libjava/gnu/java/net/natPlainSocketImplPosix.cc b/libjava/gnu/java/net/natPlainSocketImplPosix.cc
index a62378101ad..46b56bb6efb 100644
--- a/libjava/gnu/java/net/natPlainSocketImplPosix.cc
+++ b/libjava/gnu/java/net/natPlainSocketImplPosix.cc
@@ -637,9 +637,14 @@ gnu::java::net::PlainSocketImpl::setOption (jint optID, ::java::lang::Object *va
return;
case _Jv_SO_REUSEADDR_ :
- throw new ::java::net::SocketException (
- JvNewStringUTF ("SO_REUSEADDR: not valid for TCP"));
- return;
+#if defined(SO_REUSEADDR)
+ if (::setsockopt (native_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &val,
+ val_len) != 0)
+ goto error;
+#else
+ throw new ::java::lang::InternalError (
+ JvNewStringUTF ("SO_REUSEADDR not supported"));
+#endif
case _Jv_SO_TIMEOUT_ :
timeout = val;
@@ -780,8 +785,14 @@ gnu::java::net::PlainSocketImpl::getOption (jint optID)
break;
case _Jv_SO_REUSEADDR_ :
- throw new ::java::net::SocketException
- (JvNewStringUTF ("SO_REUSEADDR: not valid for TCP"));
+#if defined(SO_REUSEADDR)
+ if (::getsockopt (native_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &val,
+ &val_len) != 0)
+ goto error;
+#else
+ throw new ::java::lang::InternalError (
+ JvNewStringUTF ("SO_REUSEADDR not supported"));
+#endif
break;
case _Jv_SO_TIMEOUT_ :