Hi, this is the patch which removes VMPlainDatagramSocketImpl. However I tried getting the multicast stuff working. So far I succeeded for IP4 sockets. Running in Azureus I get a "Protocol not available" in the native part of setMulticastInterface6.
Casey, can you help me with this stuff? I am feeling lost here :|
Here is the how the ChangeLog would look like:
2006-10-09 Robert Schuster <[EMAIL PROTECTED]>
* gnu/java/net/PlainDatagramSocketImpl.java:
(connect): Use VMChannel instance for connect call.
(getTimeToLive): Call VMPlainSocketImpl.getTimeToLive.
(setTimeToLive): Call VMPlainSocketImpl.setTimeToLive.
(setOption): Handle multicast options.
(getOption): Handle multicast options.
* gnu/java/net/PlainSocketImpl.java:
(getTimeToLive): Call VMPlainSocketImpl.getTimeToLive.
(setTimeToLive): Call VMPlainSocketImpl.setTimeToLive.
(setOption): Handle multicast options.
(getOption): Handle multicast options.
* include/Makefile.am: Removed all occurences of
gnu_java_net_VMPlainDatagramSocketImpl.h.
* include/gnu_java_net_VMPlainDatagramSocketImpl.h: Removed.
* native/jni/java-net/Makefile.am: Removed
gnu_java_net_VMPlainDatagramSocketImpl.c from sources.
* native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c:
Removed.
as SocketException, declare to throw SocketException.
* native/jni/java-nio/gnu_java_nio_VMChannel.c: Added definitions
for SocketException and ConnectException.
(Java_gnu_java_nio_VMChannel_connect): Throw SocketException instead
of IOException.
(Java_gnu_java_nio_VMChannel_connect6): Throw SocketException instead
of IOException.
* native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c: Added
CPNET_IP_TTL to java_sockopt enum.
(Java_gnu_java_net_VMPlainSocketImpl_setOption): Handle CPNET_IP_TTL
case.
(Java_gnu_java_net_VMPlainSocketImpl_getOption): Handle CPNET_IP_TTL
case.
(Java_gnu_java_net_VMPlainSocketImpl_getMulticastInterface): New
function.
(Java_gnu_java_net_VMPlainSocketImpl_setMulticastInterface): New
function.
(Java_gnu_java_net_VMPlainSocketImpl_setMulticastInterface6): New
function.
* vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java: Removed.
* vm/reference/gnu/java/nio/VMChannel.java:
(connect(int, byte[], int, int)): Declare to throw SocketException.
(connect6): Declare to throw SocketException.
(connect(InetSocketAddress, int)): Catch IOException and rethrow
* vm/reference/gnu/java/net/VMPlainSocketImpl.java:
(setTimeToLive): New method.
(getTimeToLive): New method.
(setMulticastInterface(int, InetAddress)): New method.
(setMulticastInterface(int, int, Inet4Address): New method.
(setMulticastInterface6(int, int, Inet6Address): New method.
* NEWS: Documented VM interface changes.
Index: gnu/java/net/PlainSocketImpl.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/net/PlainSocketImpl.java,v
retrieving revision 1.14
diff -u -r1.14 PlainSocketImpl.java
--- gnu/java/net/PlainSocketImpl.java 17 Sep 2006 07:31:41 -0000 1.14
+++ gnu/java/net/PlainSocketImpl.java 9 Oct 2006 23:58:11 -0000
@@ -150,7 +150,8 @@
{
case IP_MULTICAST_IF:
case IP_MULTICAST_IF2:
- throw new UnsupportedOperationException("FIXME");
+ impl.setMulticastInterface(optionId, (InetAddress) value);
+ break;
case IP_MULTICAST_LOOP:
case SO_BROADCAST:
@@ -198,8 +199,8 @@
}
}
if (optionId == IP_MULTICAST_IF || optionId == IP_MULTICAST_IF2)
- throw new UnsupportedOperationException ("can't get option " +
- optionId + " yet");
+ return impl.getMulticastInterface(optionId);
+
return impl.getOption(optionId);
}
Index: gnu/java/net/PlainDatagramSocketImpl.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/net/PlainDatagramSocketImpl.java,v
retrieving revision 1.13
diff -u -r1.13 PlainDatagramSocketImpl.java
--- gnu/java/net/PlainDatagramSocketImpl.java 22 Sep 2006 00:11:56 -0000 1.13
+++ gnu/java/net/PlainDatagramSocketImpl.java 9 Oct 2006 23:58:11 -0000
@@ -42,7 +42,6 @@
import java.io.IOException;
import java.io.InterruptedIOException;
-import java.lang.reflect.Field;
import java.net.DatagramPacket;
import java.net.DatagramSocketImpl;
import java.net.InetAddress;
@@ -69,7 +68,6 @@
*/
public final class PlainDatagramSocketImpl extends DatagramSocketImpl
{
-
private final VMChannel channel;
/**
@@ -171,7 +169,7 @@
*/
protected void connect(InetAddress addr, int port) throws SocketException
{
- VMPlainDatagramSocketImpl.connect(this, addr, port);
+ channel.connect(new InetSocketAddress(addr, port), 0);
}
/**
@@ -203,7 +201,7 @@
*/
protected synchronized void setTimeToLive(int ttl) throws IOException
{
- setOption(VMPlainDatagramSocketImpl.IP_TTL, new Integer(ttl));
+ impl.setTimeToLive(ttl);
}
/**
@@ -215,12 +213,7 @@
*/
protected synchronized int getTimeToLive() throws IOException
{
- Object obj = getOption(VMPlainDatagramSocketImpl.IP_TTL);
-
- if (! (obj instanceof Integer))
- throw new IOException("Internal Error");
-
- return ((Integer) obj).intValue();
+ return impl.getTimeToLive();
}
protected int getLocalPort()
@@ -318,15 +311,38 @@
/**
* Sets the value of an option on the socket
*
- * @param option_id The identifier of the option to set
- * @param val The value of the option to set
+ * @param optionId The identifier of the option to set
+ * @param value The value of the option to set
*
* @exception SocketException If an error occurs
*/
- public synchronized void setOption(int option_id, Object val)
+ public synchronized void setOption(int optionId, Object value)
throws SocketException
{
- impl.setOption(option_id, val);
+ switch (optionId)
+ {
+ case IP_MULTICAST_IF:
+ case IP_MULTICAST_IF2:
+ impl.setMulticastInterface(optionId, (InetAddress) value);
+ break;
+
+ case IP_MULTICAST_LOOP:
+ case SO_BROADCAST:
+ case SO_KEEPALIVE:
+ case SO_OOBINLINE:
+ case TCP_NODELAY:
+ case IP_TOS:
+ case SO_LINGER:
+ case SO_RCVBUF:
+ case SO_SNDBUF:
+ case SO_TIMEOUT:
+ case SO_REUSEADDR:
+ impl.setOption(optionId, value);
+ return;
+
+ default:
+ throw new SocketException("cannot set option " + optionId);
+ }
}
/**
Index: include/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/include/Makefile.am,v
retrieving revision 1.71
diff -u -r1.71 Makefile.am
--- include/Makefile.am 20 Sep 2006 21:39:41 -0000 1.71
+++ include/Makefile.am 9 Oct 2006 23:58:11 -0000
@@ -125,7 +125,6 @@
$(GTKPEER_H_FILES) \
$(QTPEER_H_FILES) \
$(GCONF_PREFS_FILES) \
-$(top_srcdir)/include/gnu_java_net_VMPlainDatagramSocketImpl.h \
$(top_srcdir)/include/gnu_java_net_VMPlainSocketImpl.h \
$(top_srcdir)/include/gnu_java_net_local_LocalSocketImpl.h \
$(top_srcdir)/include/gnu_java_nio_EpollSelectorImpl.h \
@@ -180,8 +179,6 @@
$(top_srcdir)/include/gnu_java_util_prefs_gconf_%.h: $(top_builddir)/$(CLASSDIR)/gnu/java/util/prefs/gconf/%.class
$(JAVAH) -o $@ gnu.java.util.prefs.gconf.$*
-$(top_srcdir)/include/gnu_java_net_VMPlainDatagramSocketImpl.h: $(top_srcdir)/vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java
- $(JAVAH) -o $@ gnu.java.net.VMPlainDatagramSocketImpl
$(top_srcdir)/include/gnu_java_net_VMPlainSocketImpl.h: $(top_srcdir)/vm/reference/gnu/java/net/VMPlainSocketImpl.java
$(JAVAH) -o $@ gnu.java.net.VMPlainSocketImpl
$(top_srcdir)/include/gnu_java_net_local_LocalSocketImpl.h: $(top_srcdir)/gnu/java/net/local/LocalSocketImpl.java
Index: include/gnu_java_net_VMPlainDatagramSocketImpl.h
===================================================================
RCS file: include/gnu_java_net_VMPlainDatagramSocketImpl.h
diff -N include/gnu_java_net_VMPlainDatagramSocketImpl.h
--- include/gnu_java_net_VMPlainDatagramSocketImpl.h 19 Mar 2006 23:17:16 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __gnu_java_net_VMPlainDatagramSocketImpl__
-#define __gnu_java_net_VMPlainDatagramSocketImpl__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_bind (JNIEnv *env, jclass, jobject, jint, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_create (JNIEnv *env, jclass, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_connect (JNIEnv *env, jclass, jobject, jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo (JNIEnv *env, jclass, jobject, jobject, jint, jbyteArray, jint, jint);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive (JNIEnv *env, jclass, jobject, jbyteArray, jint, jint, jbyteArray, jintArray, jintArray);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_setOption (JNIEnv *env, jclass, jobject, jint, jobject);
-JNIEXPORT jobject JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_getOption (JNIEnv *env, jclass, jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_close (JNIEnv *env, jclass, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_join (JNIEnv *env, jclass, jobject, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_leave (JNIEnv *env, jclass, jobject, jobject);
-#undef gnu_java_net_VMPlainDatagramSocketImpl_IP_TTL
-#define gnu_java_net_VMPlainDatagramSocketImpl_IP_TTL 7777L
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __gnu_java_net_VMPlainDatagramSocketImpl__ */
Index: native/jni/java-net/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-net/Makefile.am,v
retrieving revision 1.18
diff -u -r1.18 Makefile.am
--- native/jni/java-net/Makefile.am 21 Aug 2006 23:34:45 -0000 1.18
+++ native/jni/java-net/Makefile.am 9 Oct 2006 23:58:11 -0000
@@ -13,7 +13,6 @@
java_net_VMInetAddress.c \
java_net_VMNetworkInterface.c \
java_net_VMURLConnection.c \
- gnu_java_net_VMPlainDatagramSocketImpl.c \
gnu_java_net_VMPlainSocketImpl.c \
$(local_sources)
Index: native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
===================================================================
RCS file: native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
diff -N native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
--- native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c 21 Aug 2006 23:34:45 -0000 1.6
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,406 +0,0 @@
-/* VMPlainDatagramSocketImpl.c - Native methods for PlainDatagramSocketImpl
- Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-/* do not move; needed here because of some macro definitions */
-#include <config.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <jni.h>
-#include <jcl.h>
-
-#include "cpnative.h"
-#include "cpnet.h"
-
-#include "javanet.h"
-
-#include "gnu_java_net_VMPlainDatagramSocketImpl.h"
-
-/*
- * Note that most of the functions in this module simply redirect to another
- * internal function. Why? Because many of these functions are shared
- * with PlainSocketImpl.
- */
-
-/*************************************************************************/
-
-/*
- * Creates a new datagram socket
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_create(JNIEnv *env,
- jclass klass __attribute__ ((__unused__))
- , jobject obj)
-{
-
-#ifndef WITHOUT_NETWORK
- _javanet_create(env, obj, 0);
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Close the socket.
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_close(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj)
-{
-
-#ifndef WITHOUT_NETWORK
- _javanet_close(env, obj, 0);
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Connects to the specified destination.
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_connect(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jobject addr, jint port)
-{
-#ifndef WITHOUT_NETWORK
-
- _javanet_connect(env, obj, addr, port, 0);
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * This method binds the specified address to the specified local port.
- * Note that we have to set the local address and local port public instance
- * variables.
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_bind(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jint port, jobject addr)
-{
-
-#ifndef WITHOUT_NETWORK
- _javanet_bind(env, obj, addr, port, 0);
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * This method sets the specified option for a socket
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_setOption(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jint option_id,
- jobject val)
-{
-
-#ifndef WITHOUT_NETWORK
- _javanet_set_option(env, obj, option_id, val);
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * This method sets the specified option for a socket
- */
-JNIEXPORT jobject JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_getOption(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jint option_id)
-{
-
-#ifndef WITHOUT_NETWORK
- return(_javanet_get_option(env, obj, option_id));
-#else /* not WITHOUT_NETWORK */
- return NULL;
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Reads a buffer from a remote host
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jbyteArray arr,
- jint offset,
- jint length,
- jbyteArray receivedFromAddress,
- jintArray receivedFromPort,
- jintArray receivedLength)
-{
-#ifndef WITHOUT_NETWORK
- jint *port, *bytes_read;
- cpnet_address *addr;
- jbyte *addressBytes;
-
- addr = 0;
-
- port = (jint*)(*env)->GetIntArrayElements(env, receivedFromPort, NULL);
- if (port == NULL)
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error: could not access receivedFromPort array");
- return;
- }
-
- bytes_read = (jint*)(*env)->GetIntArrayElements(env, receivedLength, NULL);
- if (bytes_read == NULL)
- {
- (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0);
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error: could not access receivedLength array");
- return;
- }
-
- /* Receive the packet */
- /* should we try some sort of validation on the length? */
- (*bytes_read) = _javanet_recvfrom(env, obj, arr, offset, length, &addr);
-
- /* Special case the strange situation where the receiver didn't want any
- bytes. */
- if (length == 0 && (*bytes_read) == -1)
- *bytes_read = 0;
-
- if ((*bytes_read) == -1)
- {
- (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0);
- (*env)->ReleaseIntArrayElements(env, receivedLength, (jint*)bytes_read, 0);
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error: receive");
- return;
- }
-
- if ((*env)->ExceptionOccurred(env))
- return;
-
- *port = cpnet_addressGetPort (addr);
-
- /* Store the address */
- addressBytes = (jbyte*)(*env)->GetPrimitiveArrayCritical(env, receivedFromAddress, NULL);
- cpnet_IPV4AddressToBytes (addr, addressBytes);
- (*env)->ReleasePrimitiveArrayCritical(env, receivedFromAddress, addressBytes, 0);
-
- cpnet_freeAddress (env, addr);
-
- (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0);
- (*env)->ReleaseIntArrayElements(env, receivedLength, (jint*)bytes_read, 0);
-
- DBG("PlainDatagramSocketImpl.receive(): Received packet\n");
-
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Writes a buffer to the remote host
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jobject addr,
- jint port,
- jarray buf,
- jint offset,
- jint len)
-{
-#ifndef WITHOUT_NETWORK
- cpnet_address *netAddress;
-
- /* check if address given, tr 7.3.2005 */
- if (addr != NULL )
- {
- netAddress = _javanet_get_ip_netaddr(env, addr);
- if ((*env)->ExceptionOccurred(env))
- {
- return;
- }
- if (port == 0)
- {
- JCL_ThrowException(env, IO_EXCEPTION,
- "Invalid port number");
- cpnet_freeAddress(env, netAddress);
- return;
- }
- cpnet_addressSetPort (netAddress, port);
- }
- else
- {
- netAddress = NULL;
- }
-
- DBG("PlainDatagramSocketImpl.sendto(): have addr\n");
-
- _javanet_sendto(env, obj, buf, offset, len, netAddress);
- if (netAddress != NULL)
- cpnet_freeAddress(env, netAddress);
- if ((*env)->ExceptionOccurred(env))
- {
- return;
- }
-
- DBG("PlainDatagramSocketImpl.sendto(): finished\n");
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Joins a multicast group
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_join(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jobject addr)
-{
-#ifndef WITHOUT_NETWORK
- cpnet_address *netAddress;
- int fd;
- int result;
-
- /* check if address given, tr 7.3.2005 */
- if (addr != NULL)
- {
- netAddress = _javanet_get_ip_netaddr(env, addr);
- if ((*env)->ExceptionOccurred(env))
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error");
- return;
- }
- }
- else
- {
- netAddress = NULL;
- }
-
- fd = _javanet_get_int_field(env, obj, "native_fd");
- if ((*env)->ExceptionOccurred(env))
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error");
- return;
- }
-
- DBG("PlainDatagramSocketImpl.join(): have native fd\n");
-
- result = cpnet_addMembership (env, fd, netAddress);
- if (result != CPNATIVE_OK)
- {
- JCL_ThrowException(env, IO_EXCEPTION,
- cpnative_getErrorString (result));
- return;
- }
-
- DBG("PlainDatagramSocketImpl.join(): finished\n");
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Leaves a multicast group
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_VMPlainDatagramSocketImpl_leave(JNIEnv *env,
- jclass klass __attribute__ ((__unused__)),
- jobject obj,
- jobject addr)
-{
-#ifndef WITHOUT_NETWORK
- cpnet_address *netAddress;
- int fd;
- int result;
-
- /* check if address given, tr 7.3.2005 */
- if (addr != NULL)
- {
- netAddress = _javanet_get_ip_netaddr(env, addr);
- if ((*env)->ExceptionOccurred(env))
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error");
- return;
- }
- }
- else
- {
- netAddress = 0;
- }
-
- fd = _javanet_get_int_field(env, obj, "native_fd");
- if ((*env)->ExceptionOccurred(env))
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error");
- return;
- }
-
- DBG("PlainDatagramSocketImpl.leave(): have native fd\n");
-
- result = cpnet_dropMembership (env, fd, netAddress);
- if (result != CPNATIVE_OK)
- {
- JCL_ThrowException(env, IO_EXCEPTION, cpnative_getErrorString (result));
- return;
- }
-
- DBG("PlainDatagramSocketImpl.leave(): finished\n");
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
Index: native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_net_VMPlainSocketImpl.c
--- native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c 9 Oct 2006 11:10:41 -0000 1.11
+++ native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c 9 Oct 2006 23:58:11 -0000
@@ -56,16 +56,13 @@
#include <jni.h>
#include <jcl.h>
-/* #include "javanet.h" */
+#include "cpnative.h"
+#include "cpnet.h"
+#include "javanet.h"
#include "gnu_java_net_VMPlainSocketImpl.h"
-#define IO_EXCEPTION "java/io/IOException"
-#define SOCKET_EXCEPTION "java/net/SocketException"
-#define BIND_EXCEPTION "java/net/BindException"
-
-#define THROW_NO_NETWORK(env) JCL_ThrowException (env, "java/lang/InternalError", "this platform not configured for network support")
-
+#define THROW_NO_NETWORK(env) JCL_ThrowException (env, "java/lang/InternalError", "this platform not configured for network support")
/*
* Class: gnu_java_net_VMPlainSocketImpl
@@ -158,7 +155,10 @@
}
-/* These constants are also defined in java/net/SocketOptions.java */
+/* These constants are also defined in java/net/SocketOptions.java.
+ * Except for CPNET_IP_TTL which is defined in
+ * vm/reference/gnu/java/net/VMPlainSocketImpl.java .
+ */
enum java_sockopt {
CPNET_SO_KEEPALIVE = 0x8,
CPNET_SO_LINGER = 0x80,
@@ -173,7 +173,8 @@
CPNET_IP_MULTICAST_IF = 0x10,
CPNET_IP_MULTICAST_IF2 = 0x1F,
CPNET_IP_MULTICAST_LOOP = 0x12,
- CPNET_IP_TOS = 0x03
+ CPNET_IP_TOS = 0x03,
+ CPNET_IP_TTL = 0x1E61
};
@@ -195,7 +196,9 @@
struct timeval _timeo;
void *optval = (void *) &_value;
socklen_t optlen = sizeof (int);
-
+
+ int isIPv6 = get_family(fd) == AF_INET;
+
switch (joption)
{
case CPNET_IP_MULTICAST_LOOP:
@@ -256,6 +259,11 @@
optname = IP_TOS;
break;
+ case CPNET_IP_TTL:
+ level = IPPROTO_IP;
+ optname = IP_TTL;
+ break;
+
case CPNET_SO_BINDADDR:
case CPNET_IP_MULTICAST_IF:
case CPNET_IP_MULTICAST_IF2:
@@ -339,6 +347,11 @@
optname = IP_TOS;
break;
+ case CPNET_IP_TTL:
+ level = IPPROTO_IP;
+ optname = IP_TTL;
+ break;
+
case CPNET_SO_BINDADDR:
case CPNET_IP_MULTICAST_IF:
case CPNET_IP_MULTICAST_IF2:
@@ -357,6 +370,85 @@
return value;
}
+JNIEXPORT void JNICALL
+Java_gnu_java_net_VMPlainSocketImpl_setMulticastInterface (JNIEnv *env,
+ jclass c __attribute__((unused)),
+ jint fd,
+ jint optionId __attribute__((unused)),
+ jobject addr)
+{
+ int result;
+ cpnet_address *cpaddr = _javanet_get_ip_netaddr (env, addr);
+
+ if ((*env)->ExceptionOccurred (env))
+ return;
+
+ result = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
+ (struct sockaddr *) cpaddr->data, cpaddr->len);
+
+ cpnet_freeAddress (env, cpaddr);
+
+ if (result == -1)
+ JCL_ThrowException (env, SOCKET_EXCEPTION, cpnative_getErrorString (errno));
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_net_VMPlainSocketImpl_setMulticastInterface6 (JNIEnv *env,
+ jclass c __attribute__((unused)),
+ jint fd,
+ jint optionId __attribute__((unused)),
+ jobject addr)
+{
+#ifdef HAVE_SETSOCKOPT
+#ifdef HAVE_INET6
+ int result;
+ cpnet_address *cpaddr = _javanet_get_ip_netaddr (env, addr);
+
+ if ((*env)->ExceptionOccurred (env))
+ return;
+
+ result = setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+ (struct sockaddr *) cpaddr->data, cpaddr->len);
+
+ cpnet_freeAddress (env, cpaddr);
+
+ if (result == -1)
+ JCL_ThrowException (env, SOCKET_EXCEPTION, cpnative_getErrorString (errno));
+#else
+ (void) fd;
+ JCL_ThrowException (env, "java/lang/InternalError",
+ "IPv6 support not available");
+#endif /* HAVE_INET6 */
+#else
+ (void) fd;
+ JCL_ThrowException (env, "java/lang/InternalError",
+ "socket options not supported");
+#endif /* HAVE_SETSOCKOPT */
+}
+
+JNIEXPORT jobject JNICALL
+Java_gnu_java_net_VMPlainSocketImpl_getMulticastInterface (JNIEnv *env,
+ jclass c __attribute__((unused)),
+ jint fd,
+ jint optionId __attribute__((unused)))
+{
+ jobject obj;
+ cpnet_address *cpaddr;
+ int result = cpnet_getMulticastIF (env, fd, &cpaddr);
+
+ if (result != CPNATIVE_OK)
+ {
+ JCL_ThrowException (env, SOCKET_EXCEPTION,
+ cpnative_getErrorString (result));
+ return (0);
+ }
+
+ obj = _javanet_create_inetaddress (env, cpaddr);
+ cpnet_freeAddress (env, cpaddr);
+
+ return obj;
+}
+
/*
* Class: gnu_java_net_VMPlainSocketImpl
Index: native/jni/java-nio/gnu_java_nio_VMChannel.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_nio_VMChannel.c
--- native/jni/java-nio/gnu_java_nio_VMChannel.c 17 Sep 2006 22:49:52 -0000 1.4
+++ native/jni/java-nio/gnu_java_nio_VMChannel.c 9 Oct 2006 23:58:11 -0000
@@ -64,7 +64,9 @@
#include <fcntl.h>
#endif /* HAVE_FCNTL_H */
+#define CONNECT_EXCEPTION "java/net/ConnectException"
#define IO_EXCEPTION "java/io/IOException"
+#define SOCKET_EXCEPTION "java/net/SocketException"
#define INTERRUPTED_IO_EXCEPTION "java/io/InterruptedIOException"
#define NON_READABLE_CHANNEL_EXCEPTION "java/nio/channels/NonReadableChannelException"
#define NON_WRITABLE_CHANNEL_EXCEPTION "java/nio/channels/NonWritableChannelException"
@@ -119,7 +121,7 @@
/* NIODBG("name: %s; sig: %s", name, sig); */
if (mid == NULL)
{
- JCL_ThrowException(env, "java/lang/InternalError", name);
+ JCL_ThrowException(env, "java/lang/InternalError", name);
return NULL;
}
@@ -973,7 +975,8 @@
if ((*env)->GetArrayLength (env, addr) != 4)
{
- JCL_ThrowException (env, "java/io/IOException", "expecting 4-byte address");
+ JCL_ThrowException (env, SOCKET_EXCEPTION,
+ "expecting 4-byte address");
return JNI_FALSE;
}
@@ -984,7 +987,7 @@
origflags = fcntl (fd, F_GETFL, 0);
if (origflags == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
/* Set nonblocking mode, if not already set. */
@@ -993,7 +996,7 @@
flags = origflags | O_NONBLOCK;
if (fcntl (fd, F_SETFL, flags) == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1022,7 +1025,7 @@
if (fcntl (fd, F_SETFL, origflags) == -1)
{
/* oops */
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1033,7 +1036,7 @@
ret = cpnio_select (fd + 1, NULL, &wrfds, NULL, &timeo);
if (ret == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
if (ret == 0) /* connect timed out */
@@ -1046,13 +1049,13 @@
}
else if (ECONNREFUSED == errno)
{
- JCL_ThrowException (env, "java/net/ConnectException",
+ JCL_ThrowException (env, CONNECT_EXCEPTION,
strerror (errno));
return JNI_FALSE;
}
else
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1063,13 +1066,13 @@
return JNI_FALSE;
else if (ECONNREFUSED == errno)
{
- JCL_ThrowException (env, "java/net/ConnectException",
+ JCL_ThrowException (env, CONNECT_EXCEPTION,
strerror (errno));
return JNI_FALSE;
}
else
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1080,7 +1083,7 @@
(void) addr;
(void) port;
(void) timeout;
- JCL_ThrowException (env, IO_EXCEPTION, "connect not supported");
+ JCL_ThrowException (env, SOCKET_EXCEPTION, "connect not supported");
return JNI_FALSE;
#endif /* HAVE_CONNECT */
}
@@ -1109,7 +1112,7 @@
origflags = fcntl (fd, F_GETFL, 0);
if (origflags == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
/* Set nonblocking mode, if not already set. */
@@ -1118,7 +1121,7 @@
flags = origflags | O_NONBLOCK;
if (fcntl (fd, F_SETFL, flags) == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1146,7 +1149,7 @@
if (fcntl (fd, F_SETFL, origflags) == -1)
{
/* oops */
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1157,7 +1160,7 @@
ret = cpnio_select (fd + 1, NULL, &wrfds, NULL, &timeo);
if (ret == -1)
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
if (ret == 0) /* connect timed out */
@@ -1170,13 +1173,13 @@
}
else if (ECONNREFUSED == errno)
{
- JCL_ThrowException (env, "java/net/ConnectException",
+ JCL_ThrowException (env, CONNECT_EXCEPTION,
strerror (errno));
return JNI_FALSE;
}
else
{
- JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1187,13 +1190,13 @@
return JNI_FALSE;
else if (ECONNREFUSED == errno)
{
- JCL_ThrowException (env, "java/net/ConnectException",
+ JCL_ThrowException (env, CONNECT_EXCEPTION,
strerror (errno));
return JNI_FALSE;
}
else
{
- JCL_ThrowException (env, "java/io/IOException", strerror (errno));
+ JCL_ThrowException (env, SOCKET_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
}
@@ -1204,7 +1207,7 @@
(void) addr;
(void) port;
(void) timeout;
- JCL_ThrowException (env, IO_EXCEPTION, "IPv6 connect not supported");
+ JCL_ThrowException (env, SOCKET_EXCEPTION, "IPv6 connect not supported");
return JNI_FALSE;
#endif /* HAVE_CONNECT && HAVE_INET6 */
}
Index: vm/reference/gnu/java/nio/VMChannel.java
===================================================================
RCS file: /cvsroot/classpath/classpath/vm/reference/gnu/java/nio/VMChannel.java,v
retrieving revision 1.4
diff -u -r1.4 VMChannel.java
--- vm/reference/gnu/java/nio/VMChannel.java 27 Sep 2006 21:30:44 -0000 1.4
+++ vm/reference/gnu/java/nio/VMChannel.java 9 Oct 2006 23:58:11 -0000
@@ -379,23 +379,37 @@
* @throws IOException If an error occurs while connecting.
*/
public boolean connect(InetSocketAddress saddr, int timeout)
- throws IOException
+ throws SocketException
{
+ int fd;
+
InetAddress addr = saddr.getAddress();
+
+ // Translates an IOException into a SocketException to conform
+ // to the throws clause.
+ try
+ {
+ fd = nfd.getNativeFD();
+ }
+ catch (IOException ioe)
+ {
+ throw new SocketException(ioe.getMessage());
+ }
+
if (addr instanceof Inet4Address)
- return connect(nfd.getNativeFD(), addr.getAddress(), saddr.getPort(),
+ return connect(fd, addr.getAddress(), saddr.getPort(),
timeout);
if (addr instanceof Inet6Address)
- return connect6(nfd.getNativeFD(), addr.getAddress(), saddr.getPort(),
+ return connect6(fd, addr.getAddress(), saddr.getPort(),
timeout);
- throw new IOException("unsupported internet address");
+ throw new SocketException("unsupported internet address");
}
private static native boolean connect(int fd, byte[] addr, int port, int timeout)
- throws IOException;
+ throws SocketException;
private static native boolean connect6(int fd, byte[] addr, int port, int timeout)
- throws IOException;
+ throws SocketException;
/**
* Disconnect this channel, if it is a datagram socket. Disconnecting
Index: vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java
===================================================================
RCS file: vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java
diff -N vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java
--- vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java 12 Jan 2006 11:56:08 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,260 +0,0 @@
-/* PlainDatagramSocketImpl.java -- VM interface for DatagramSocket impl
- Copyright (C) 2005 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.net;
-
-import gnu.classpath.Configuration;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketAddress;
-import java.net.SocketException;
-
-/**
- * The VM interface for [EMAIL PROTECTED] gnu.java.net.PlainDatagramSocketImpl}.
- *
- * @author Ingo Proetel ([EMAIL PROTECTED])
- * @author Roman Kennke ([EMAIL PROTECTED])
- */
-public final class VMPlainDatagramSocketImpl
-{
- /**
- * Option id for the IP_TTL (time to live) value.
- */
- static final int IP_TTL = 0x1E61; // 7777
-
-
- // Static initializer to load native library
- static
- {
- if (Configuration.INIT_LOAD_LIBRARY)
- {
- System.loadLibrary("javanet");
- }
- }
-
- /**
- * Binds this socket to a particular port and interface
- *
- * @param socket the socket object
- * @param port the port to bind to
- * @param addr the address to bind to
- *
- * @throws SocketException If an error occurs
- */
- static native void bind(PlainDatagramSocketImpl socket, int port,
- InetAddress addr)
- throws SocketException;
-
- /**
- * Creates a new datagram socket.
- *
- * @param socket the socket object
- *
- * @throws SocketException If an error occurs
- */
- static native void create(PlainDatagramSocketImpl socket)
- throws SocketException;
-
- /**
- * Connects to the remote address and port specified as arguments.
- *
- * @param socket the socket object
- * @param addr the remote address to connect to
- * @param port the remote port to connect to
- *
- * @throws SocketException If an error occurs
- */
- static native void connect(PlainDatagramSocketImpl socket, InetAddress addr,
- int port)
- throws SocketException;
-
- /**
- * Sends a packet of data to a remote host.
- *
- * @param socket the socket object
- * @param packet the packet to send
- *
- * @throws IOException If an error occurs
- */
- static void send(PlainDatagramSocketImpl socket, DatagramPacket packet)
- throws IOException
- {
- nativeSendTo(socket, packet.getAddress(), packet.getPort(),
- packet.getData(), packet.getOffset(), packet.getLength());
- }
-
-
- /**
- * Sends a packet of data to a remote host.
- *
- * @param socket the socket object
- * @param addr the address to send to
- * @param port the port to send to
- * @param buf the buffer to send
- * @param offset the offset of the data in the buffer to send
- * @param len the length of the data to send
- *
- * @throws IOException If an error occurs
- */
- private static native void nativeSendTo(PlainDatagramSocketImpl socket,
- InetAddress addr, int port,
- byte[] buf, int offset, int len)
- throws IOException;
-
- /**
- * Receives a UDP packet from the network
- *
- * @param socket the socket object
- * @param packet the packet to fill in with the data received
- *
- * @throws IOException IOException If an error occurs
- */
- static void receive(PlainDatagramSocketImpl socket, DatagramPacket packet)
- throws IOException
- {
- byte[] receiveFromAddress = new byte[4];
- int[] receiveFromPort = new int[1];
- int[] receivedLength = new int[1];
-
- nativeReceive(socket, packet.getData(), packet.getOffset(),
- packet.getLength(),
- receiveFromAddress, receiveFromPort, receivedLength);
-
- packet.setAddress(InetAddress.getByAddress(receiveFromAddress));
- packet.setPort(receiveFromPort[0]);
- packet.setLength(receivedLength[0]);
- }
-
- private static native void nativeReceive(PlainDatagramSocketImpl socket,
- byte[] buf, int offset, int len,
- byte[] receiveFromAddress,
- int[] receiveFromPort,
- int[] receivedLength)
- throws IOException;
-
- /**
- * Sets the value of an option on the socket
- *
- * @param socket the socket object
- * @param optionId the identifier of the option to set
- * @param value the value of the option to set
- *
- * @exception SocketException If an error occurs
- */
- static native void setOption(PlainDatagramSocketImpl socket, int optionId,
- Object value)
- throws SocketException;
-
- /**
- * Retrieves the value of an option on the socket.
- *
- * @param socket the socket object
- * @param optionId the identifier of the option to retrieve
- *
- * @return the value of the option
- *
- * @throws SocketException if an error occurs
- */
- static native Object getOption(PlainDatagramSocketImpl socket, int optionId)
- throws SocketException;
-
- /**
- * Closes the socket.
- *
- * @param socket the socket object
- */
- static native void close(PlainDatagramSocketImpl socket);
-
- /**
- * Joins a multicast group
- *
- * @param addr The group to join
- *
- * @exception IOException If an error occurs
- */
- static native void join(PlainDatagramSocketImpl socket, InetAddress addr)
- throws IOException;
-
- /**
- * Leaves a multicast group
- *
- * @param addr The group to leave
- *
- * @exception IOException If an error occurs
- */
- static native void leave(PlainDatagramSocketImpl socket, InetAddress addr)
- throws IOException;
-
- /**
- * Joins a multicast group.
- *
- * @param socket the socket object
- * @param address the socket address
- * @param netIf the network interface
- *
- * @throws IOException if I/O errors occur
- */
- static void joinGroup(PlainDatagramSocketImpl socket, SocketAddress address,
- NetworkInterface netIf)
- throws IOException
- {
- throw new InternalError
- ("PlainDatagramSocketImpl::joinGroup is not implemented");
- }
-
- /**
- * Leaves a multicast group.
- *
- * @param socket the socket object
- * @param address the socket address
- * @param netIf the network interface
- *
- * @throws IOException if I/O errors occur
- */
- static void leaveGroup(PlainDatagramSocketImpl socket, SocketAddress address,
- NetworkInterface netIf)
- throws IOException
- {
- throw new InternalError
- ("PlainDatagramSocketImpl::leaveGroup is not implemented");
- }
-
-}
Index: vm/reference/gnu/java/net/VMPlainSocketImpl.java
===================================================================
RCS file: /cvsroot/classpath/classpath/vm/reference/gnu/java/net/VMPlainSocketImpl.java,v
retrieving revision 1.4
diff -u -r1.4 VMPlainSocketImpl.java
--- vm/reference/gnu/java/net/VMPlainSocketImpl.java 17 Sep 2006 07:31:43 -0000 1.4
+++ vm/reference/gnu/java/net/VMPlainSocketImpl.java 9 Oct 2006 23:58:11 -0000
@@ -61,6 +61,10 @@
*/
public final class VMPlainSocketImpl
{
+ /** Option id for time to live
+ */
+ private static final int CP_IP_TTL = 0x1E61;
+
private final State nfd;
/**
@@ -91,6 +95,41 @@
return nfd;
}
+ /** This method exists to hide the CP_IP_TTL value from
+ * higher levels.
+ *
+ * Always think of JNode ... :)
+ */
+ public void setTimeToLive(int ttl)
+ throws SocketException
+ {
+ try
+ {
+ setOption(nfd.getNativeFD(), CP_IP_TTL, ttl);
+ }
+ catch (IOException ioe)
+ {
+ SocketException se = new SocketException();
+ se.initCause(ioe);
+ throw se;
+ }
+ }
+
+ public int getTimeToLive()
+ throws SocketException
+ {
+ try
+ {
+ return getOption(nfd.getNativeFD(), CP_IP_TTL);
+ }
+ catch (IOException ioe)
+ {
+ SocketException se = new SocketException();
+ se.initCause(ioe);
+ throw se;
+ }
+ }
+
public void setOption(int optionId, Object optionValue)
throws SocketException
{
@@ -118,6 +157,38 @@
private static native void setOption(int fd, int id, int value)
throws SocketException;
+ public void setMulticastInterface(int optionId, InetAddress addr)
+ throws SocketException
+ {
+ try
+ {
+ if (addr instanceof Inet4Address)
+ setMulticastInterface(nfd.getNativeFD(), optionId, (Inet4Address) addr);
+ else if (addr instanceof Inet6Address)
+ setMulticastInterface6(nfd.getNativeFD(), optionId, (Inet6Address) addr);
+ else
+ throw new SocketException("Unknown address format: " + addr);
+ }
+ catch (SocketException se)
+ {
+ throw se;
+ }
+ catch (IOException ioe)
+ {
+ SocketException se = new SocketException();
+ se.initCause(ioe);
+ throw se;
+ }
+ }
+
+ private static native void setMulticastInterface(int fd,
+ int optionId,
+ Inet4Address addr);
+
+ private static native void setMulticastInterface6(int fd,
+ int optionId,
+ Inet6Address addr);
+
/**
* Get a socket option. This implementation is only required to support
* socket options that are boolean values, which include:
@@ -178,6 +249,33 @@
}
private static native int getOption(int fd, int id) throws SocketException;
+
+ /**
+ * Returns an Inet4Address or Inet6Address instance belonging to the
+ * interface which is set as the multicast interface.
+ *
+ * The optionId is provided to make it possible that the native
+ * implementation may do something different depending on whether
+ * the value is SocketOptions.IP_MULTICAST_IF or
+ * SocketOptions.IP_MULTICAST_IF2.
+ */
+ public InetAddress getMulticastInterface(int optionId)
+ throws SocketException
+ {
+ try
+ {
+ return getMulticastInterface(nfd.getNativeFD(), optionId);
+ }
+ catch (IOException ioe)
+ {
+ SocketException se = new SocketException();
+ se.initCause(ioe);
+ throw se;
+ }
+ }
+
+ private static native InetAddress getMulticastInterface(int fd,
+ int optionId);
/**
* Binds this socket to the given local address and port.
@@ -402,4 +500,4 @@
}
}
}
-}
\ No newline at end of file
+}
Index: NEWS
===================================================================
RCS file: /cvsroot/classpath/classpath/NEWS,v
retrieving revision 1.169
diff -u -r1.169 NEWS
--- NEWS 20 Sep 2006 22:35:55 -0000 1.169
+++ NEWS 9 Oct 2006 23:58:11 -0000
@@ -39,11 +39,13 @@
* gnu.java.nio.VMPipe has been similarly changed.
* gnu.java.net.VMPlainSocketImpl has been changed to remove some
functionality now provided by VMChannel; datagram socket-specific
- methods have also been moved here, deprecating
- VMPlainDatagramSocketImpl.
+ methods have also been moved here, deprecating VMPlainDatagramSocketImpl.
+* gnu.java.net.VMPlainDatagramSocketImpl removed.
New in release 0.92 (Aug 9, 2006)
+* GConf is used as a backend for java.util.prefs. GNU Classpath
+ thanks to Mario Torre for this contribution!
* libjawtgnu.so has been renamed libjawt.so for binary compatibility.
libjawt.so should be installed in a VM-specific directory rather
than directly in /usr/lib. Proprietary VMs put their libjawt.so
signature.asc
Description: OpenPGP digital signature
