]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
natPlainDatagramSocketImplPosix.cc (getOption): Support IP_MULTICAST_LOOP.
authorAnthony Green <green@redhat.com>
Tue, 1 Feb 2005 19:22:47 +0000 (19:22 +0000)
committerAnthony Green <green@gcc.gnu.org>
Tue, 1 Feb 2005 19:22:47 +0000 (19:22 +0000)
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.

From-SVN: r94555

libjava/ChangeLog
libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
libjava/gnu/java/net/natPlainSocketImplPosix.cc

index d90f01f0d9799b07add9df28a523727662f49b3c..972745b5c553fc18bf8bfa29703f127ecedd0a99 100644 (file)
@@ -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
index b1bc514c1986049dd14dee8d76068d89f36cf0ff..5c76779d9dd02d78817bc18d65c3d367f25b0631 100644 (file)
@@ -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);
        
index a62378101ad68616a9ed246a1211899a9cd0f09c..46b56bb6efbf3cfb8f4ba278a93529d2cb8e2aa2 100644 (file)
@@ -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_ :