summaryrefslogtreecommitdiff
path: root/native
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2006-01-04 20:46:16 +0000
committerRoman Kennke <roman@kennke.org>2006-01-04 20:46:16 +0000
commit9ff80c73c85971b3d5bf1b317bcc9f2193473d44 (patch)
treeeca39d0abd6c525876dbd923eb30877c463c3772 /native
parenta82b606be8017296ce467a6ea2a0dc5f2fe959f7 (diff)
downloadclasspath-9ff80c73c85971b3d5bf1b317bcc9f2193473d44.tar.gz
2006-01-04 Roman Kennke <kennke@aicas.com>
* vm/reference/gnu/java/net/VMPlainSocketImpl.java: New VM class. * vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java: New VM class. * native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c: New file. * native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c: New file. * native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c: Removed. * native/jni/java-net/gnu_java_net_PlainSocketImpl.c: Removed. * native/jni/java-net/Makefile.am: Adjusted for new source files. * gnu/java/net/PlainDatagramSocketImpl.java: Use new VM interface. * gnu/java/net/PlainSocketImpl.java: Use new VM interface. * include/gnu_java_net_PlainDatagramSocketImpl.h: Removed. * include/gnu_java_net_PlainSocketImpl.h: Removed. * include/gnu_java_net_VMPlainDatagramSocketImpl.h: New header file. * include/gnu_java_net_VMPlainSocketImpl.h: New header file.
Diffstat (limited to 'native')
-rw-r--r--native/jni/java-net/Makefile.am4
-rw-r--r--native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c452
-rw-r--r--native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c402
-rw-r--r--native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c (renamed from native/jni/java-net/gnu_java_net_PlainSocketImpl.c)149
4 files changed, 476 insertions, 531 deletions
diff --git a/native/jni/java-net/Makefile.am b/native/jni/java-net/Makefile.am
index bf7a92bbf..4bca9511e 100644
--- a/native/jni/java-net/Makefile.am
+++ b/native/jni/java-net/Makefile.am
@@ -4,8 +4,8 @@ libjavanet_la_SOURCES = javanet.c \
javanet.h \
java_net_VMInetAddress.c \
java_net_VMNetworkInterface.c \
- gnu_java_net_PlainDatagramSocketImpl.c \
- gnu_java_net_PlainSocketImpl.c
+ gnu_java_net_VMPlainDatagramSocketImpl.c \
+ gnu_java_net_VMPlainSocketImpl.c
libjavanet_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo
diff --git a/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c b/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
deleted file mode 100644
index 5bc284f64..000000000
--- a/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
+++ /dev/null
@@ -1,452 +0,0 @@
-/* PlainDatagramSocketImpl.c - Native methods for PlainDatagramSocketImpl class
- Copyright (C) 1998 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 <assert.h>
-
-#include <jni.h>
-#include <jcl.h>
-
-#include "javanet.h"
-
-#include "target_native.h"
-#ifndef WITHOUT_NETWORK
-#include "target_native_network.h"
-#endif /* WITHOUT_NETWORK */
-
-#include "gnu_java_net_PlainDatagramSocketImpl.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_PlainDatagramSocketImpl_create (JNIEnv * env, jobject obj)
-{
- assert (env != NULL);
- assert ((*env) != NULL);
-
-#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_PlainDatagramSocketImpl_close (JNIEnv * env, jobject obj)
-{
- assert (env != NULL);
- assert ((*env) != NULL);
-
-#ifndef WITHOUT_NETWORK
- _javanet_close (env, obj, 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_PlainDatagramSocketImpl_bind (JNIEnv * env, jobject obj,
- jint port, jobject addr)
-{
- assert (env != NULL);
- assert ((*env) != NULL);
-
-#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_PlainDatagramSocketImpl_setOption (JNIEnv * env,
- jobject obj,
- jint option_id,
- jobject val)
-{
- assert (env != NULL);
- assert ((*env) != NULL);
-
-#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_PlainDatagramSocketImpl_getOption (JNIEnv * env,
- jobject obj,
- jint option_id)
-{
- assert (env != NULL);
- assert ((*env) != NULL);
-
-#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_PlainDatagramSocketImpl_receive0 (JNIEnv * env, jobject obj,
- jobject packet)
-{
-#ifndef WITHOUT_NETWORK
- int addr, port, bytes_read;
- unsigned int maxlen, offset;
- jclass cls, addr_cls;
- jfieldID fid;
- jmethodID mid;
- jarray arr;
- unsigned char octets[4];
- char ip_str[16];
- jobject ip_str_obj, addr_obj;
-
- assert (env != NULL);
- assert ((*env) != NULL);
-
- addr = 0;
- port = 0;
- maxlen = 0;
- offset = 0;
- bytes_read = 0;
-
- if (packet == NULL)
- {
- JCL_ThrowException (env, "java/lang/NullPointerException",
- "Null datagram packet");
- return;
- }
-
- /* Get the buffer from the packet */
- cls = (*env)->GetObjectClass (env, packet);
- if (cls == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error");
- return;
- }
-
- mid = (*env)->GetMethodID (env, cls, "getData", "()[B");
- if (mid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: getData");
- return;
- }
-
- arr = (*env)->CallObjectMethod (env, packet, mid);
- if ((*env)->ExceptionOccurred (env))
- return;
- if (arr == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: call getData");
- return;
- }
-
- /* Now get the offset from the packet */
- mid = (*env)->GetMethodID (env, cls, "getOffset", "()I");
- if (mid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: getOffset");
- return;
- }
-
- offset = (*env)->CallIntMethod (env, packet, mid);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.receive(): Got the offset\n");
-
- /* Now get the maximal available length from the packet */
- fid = (*env)->GetFieldID (env, cls, "maxlen", "I");
- if (fid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: maxlen");
- return;
- }
-
- maxlen = (*env)->GetIntField (env, packet, fid);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- /* Receive the packet */
- /* should we try some sort of validation on the length? */
- bytes_read =
- _javanet_recvfrom (env, obj, arr, offset, maxlen, &addr, &port);
- if ((*env)->ExceptionOccurred (env))
- return;
- if (bytes_read == -1)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: receive");
- return;
- }
-
- DBG ("PlainDatagramSocketImpl.receive(): Received packet\n");
-
- /* Store the address */
- TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (addr,
- octets[0],
- octets[1],
- octets[2], octets[3]);
- sprintf (ip_str, "%d.%d.%d.%d", octets[0], octets[1], octets[2], octets[3]);
- ip_str_obj = (*env)->NewStringUTF (env, ip_str);
- if (ip_str_obj == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: new string");
- return;
- }
-
- addr_cls = (*env)->FindClass (env, "java/net/InetAddress");
- if (addr_cls == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION,
- "Internal error: InetAddress class");
- return;
- }
- DBG ("PlainDatagramSocketImpl.receive(): Found InetAddress class\n");
-
- mid = (*env)->GetStaticMethodID (env, addr_cls, "getByName",
- "(Ljava/lang/String;)Ljava/net/InetAddress;");
- if (mid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal Error");
- return;
- }
- DBG
- ("PlainDatagramSocketImpl.receive(): Found InetAddress.getByName method\n");
-
- addr_obj = (*env)->CallStaticObjectMethod (env, addr_cls, mid, ip_str_obj);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- mid = (*env)->GetMethodID (env, cls, "setAddress",
- "(Ljava/net/InetAddress;)V");
- if (mid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: setAddress");
- return;
- }
-
- (*env)->CallVoidMethod (env, packet, mid, addr_obj);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.receive(): Stored the address\n");
-
- /* Store the port */
- mid = (*env)->GetMethodID (env, cls, "setPort", "(I)V");
- if (mid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: setPort");
- return;
- }
-
- (*env)->CallVoidMethod (env, packet, mid, port);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.receive(): Stored the port\n");
-
- /* Store back the length */
- fid = (*env)->GetFieldID (env, cls, "length", "I");
- if (fid == NULL)
- {
- JCL_ThrowException (env, IO_EXCEPTION, "Internal error: length");
- return;
- }
-
- (*env)->SetIntField (env, packet, fid, bytes_read);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.receive(): Stored the length\n");
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
-
-/*************************************************************************/
-
-/*
- * Writes a buffer to the remote host
- */
-JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainDatagramSocketImpl_sendto (JNIEnv * env, jobject obj,
- jobject addr, jint port,
- jarray buf, jint offset,
- jint len)
-{
-#ifndef WITHOUT_NETWORK
- jint netAddress;
-
- assert (env != NULL);
- assert ((*env) != NULL);
-
- netAddress = _javanet_get_netaddr (env, addr);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.sendto(): have addr\n");
-
- _javanet_sendto (env, obj, buf, offset, len, netAddress, port);
- 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_PlainDatagramSocketImpl_join (JNIEnv * env, jobject obj,
- jobject addr)
-{
-#ifndef WITHOUT_NETWORK
- jint netAddress;
- int fd;
- int result;
-
- assert (env != NULL);
- assert ((*env) != NULL);
-
- netAddress = _javanet_get_netaddr (env, addr);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- fd = _javanet_get_int_field (env, obj, "native_fd");
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.join(): have native fd\n");
-
- TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_ADD_MEMBERSHIP (fd, netAddress,
- result);
-
- if (result != TARGET_NATIVE_OK)
- {
- JCL_ThrowException (env, IO_EXCEPTION,
- TARGET_NATIVE_LAST_ERROR_STRING ());
- 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_PlainDatagramSocketImpl_leave (JNIEnv * env, jobject obj,
- jobject addr)
-{
-#ifndef WITHOUT_NETWORK
- jint netAddress;
- int fd;
- int result;
-
- assert (env != NULL);
- assert ((*env) != NULL);
-
- netAddress = _javanet_get_netaddr (env, addr);
- if ((*env)->ExceptionOccurred (env))
- return;
-
- fd = _javanet_get_int_field (env, obj, "native_fd");
- if ((*env)->ExceptionOccurred (env))
- return;
-
- DBG ("PlainDatagramSocketImpl.leave(): have native fd\n");
-
- TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_DROP_MEMBERSHIP (fd, netAddress,
- result);
- if (result != TARGET_NATIVE_OK)
- {
- JCL_ThrowException (env, IO_EXCEPTION,
- TARGET_NATIVE_LAST_ERROR_STRING ());
- return;
- }
-
- DBG ("PlainDatagramSocketImpl.leave(): finished\n");
-#else /* not WITHOUT_NETWORK */
-#endif /* not WITHOUT_NETWORK */
-}
diff --git a/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c b/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
new file mode 100644
index 000000000..1e3fabf99
--- /dev/null
+++ b/native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c
@@ -0,0 +1,402 @@
+/* VMPlainDatagramSocketImpl.c - Native methods for PlainDatagramSocketImpl
+ 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. */
+
+/* do not move; needed here because of some macro definitions */
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include <jni.h>
+#include <jcl.h>
+
+#include "javanet.h"
+
+#include "target_native.h"
+#ifndef WITHOUT_NETWORK
+ #include "target_native_network.h"
+#endif /* WITHOUT_NETWORK */
+
+
+#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, jobject obj)
+{
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+#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, jobject obj)
+{
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+#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, jobject obj, jobject addr, jint port)
+{
+#ifndef WITHOUT_NETWORK
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+ _javanet_connect(env, obj, addr, port);
+#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, jobject obj, jint port, jobject addr)
+{
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+#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, jobject obj,
+ jint option_id, jobject val)
+{
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+#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, jobject obj,
+ jint option_id)
+{
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+#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,
+ jobject obj,
+ jbyteArray arr,
+ jint offset,
+ jint length,
+ jbyteArray receivedFromAddress,
+ jintArray receivedFromPort,
+ jintArray receivedLength)
+{
+#ifndef WITHOUT_NETWORK
+ int addr, *port, *bytes_read;
+ char *addressBytes;
+
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+ assert((*env)->GetArrayLength(env, receivedFromAddress) > 4);
+ assert((*env)->GetArrayLength(env, receivedFromPort ) > 1);
+ assert((*env)->GetArrayLength(env, receivedLength ) > 1);
+
+ addr = 0;
+
+ port = (int*)(*env)->GetIntArrayElements(env, receivedFromPort, NULL);
+ if (port == NULL)
+ {
+ JCL_ThrowException(env, IO_EXCEPTION, "Internal error: could not access receivedFromPort array");
+ return;
+ }
+
+ bytes_read = (int*)(*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, port);
+ 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;
+ }
+
+ (*env)->ReleaseIntArrayElements(env, receivedFromPort, (jint*)port, 0);
+ (*env)->ReleaseIntArrayElements(env, receivedLength, (jint*)bytes_read, 0);
+
+ if ((*env)->ExceptionOccurred(env))
+ {
+ return;
+ }
+
+ DBG("PlainDatagramSocketImpl.receive(): Received packet\n");
+
+
+ /* Store the address */
+ addressBytes = (char*)(*env)->GetPrimitiveArrayCritical(env, receivedFromAddress, NULL);
+ TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES(addr,
+ addressBytes[0],
+ addressBytes[1],
+ addressBytes[2],
+ addressBytes[3]
+ );
+ (*env)->ReleasePrimitiveArrayCritical(env, receivedFromAddress, addressBytes, 0);
+
+#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,
+ jobject obj,
+ jobject addr,
+ jint port,
+ jarray buf,
+ jint offset,
+ jint len)
+{
+#ifndef WITHOUT_NETWORK
+ jint netAddress;
+
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+ /* check if address given, tr 7.3.2005 */
+ if (addr != NULL)
+ {
+ netAddress = _javanet_get_netaddr(env, addr);
+ if ((*env)->ExceptionOccurred(env))
+ {
+ return;
+ }
+ }
+ else
+ {
+ netAddress = 0;
+ }
+
+ DBG("PlainDatagramSocketImpl.sendto(): have addr\n");
+
+ _javanet_sendto(env, obj, buf, offset, len, netAddress, port);
+ 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, jobject obj,
+ jobject addr)
+{
+#ifndef WITHOUT_NETWORK
+ jint netAddress;
+ int fd;
+ int result;
+
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+ /* check if address given, tr 7.3.2005 */
+ if (addr != NULL)
+ {
+ netAddress = _javanet_get_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.join(): have native fd\n");
+
+ TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_ADD_MEMBERSHIP(fd,netAddress,result);
+
+ if (result != TARGET_NATIVE_OK)
+ {
+ JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());
+ 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, jobject obj,
+ jobject addr)
+{
+#ifndef WITHOUT_NETWORK
+ jint netAddress;
+ int fd;
+ int result;
+
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+ /* check if address given, tr 7.3.2005 */
+ if (addr != NULL)
+ {
+ netAddress = _javanet_get_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");
+
+ TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_DROP_MEMBERSHIP(fd,netAddress,result);
+ if (result!=TARGET_NATIVE_OK)
+ {
+ JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());
+ return;
+ }
+
+ DBG("PlainDatagramSocketImpl.leave(): finished\n");
+#else /* not WITHOUT_NETWORK */
+#endif /* not WITHOUT_NETWORK */
+}
+
diff --git a/native/jni/java-net/gnu_java_net_PlainSocketImpl.c b/native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c
index f5f22ab77..9aa2303c9 100644
--- a/native/jni/java-net/gnu_java_net_PlainSocketImpl.c
+++ b/native/jni/java-net/gnu_java_net_VMPlainSocketImpl.c
@@ -1,5 +1,5 @@
-/* PlainSocketImpl.c - Native methods for PlainSocketImpl class
- Copyright (C) 1998, 2002, 2005 Free Software Foundation, Inc.
+/* VMPlainSocketImpl.c - Native methods for PlainSocketImpl class
+ Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,7 +42,7 @@ exception statement from your version. */
#include <stdio.h>
#include <string.h>
#include <assert.h>
-
+
#include <jni.h>
#include <jcl.h>
@@ -50,11 +50,10 @@ exception statement from your version. */
#include "target_native.h"
#ifndef WITHOUT_NETWORK
-#include "target_native_file.h" /* Get FIONREAD on Solaris. */
-#include "target_native_network.h"
+ #include "target_native_network.h"
#endif /* WITHOUT_NETWORK */
-#include "gnu_java_net_PlainSocketImpl.h"
+#include "gnu_java_net_VMPlainSocketImpl.h"
/*
* Note that the functions in this module simply redirect to another
@@ -69,14 +68,13 @@ exception statement from your version. */
* Creates a new stream or datagram socket
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_create (JNIEnv * env, jobject this,
- jboolean stream)
+Java_gnu_java_net_VMPlainSocketImpl_create(JNIEnv *env, jclass klass, jobject obj)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_create (env, this, stream);
+ _javanet_create(env, obj, JNI_TRUE);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -88,13 +86,13 @@ Java_gnu_java_net_PlainSocketImpl_create (JNIEnv * env, jobject this,
* action as well.
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_close (JNIEnv * env, jobject this)
+Java_gnu_java_net_VMPlainSocketImpl_close(JNIEnv *env, jclass klass, jobject obj)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_close (env, this, 1);
+ _javanet_close(env, obj, 1);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -105,14 +103,14 @@ Java_gnu_java_net_PlainSocketImpl_close (JNIEnv * env, jobject this)
* Connects to the specified destination.
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_connect (JNIEnv * env, jobject this,
- jobject addr, jint port)
+Java_gnu_java_net_VMPlainSocketImpl_connect(JNIEnv *env, jclass klass, jobject obj,
+ jobject addr, jint port)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_connect (env, this, addr, port);
+ _javanet_connect(env, obj, addr, port);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -125,14 +123,14 @@ Java_gnu_java_net_PlainSocketImpl_connect (JNIEnv * env, jobject this,
* variables.
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_bind (JNIEnv * env, jobject this,
- jobject addr, jint port)
+Java_gnu_java_net_VMPlainSocketImpl_bind(JNIEnv *env, jclass klass, jobject obj, jobject addr,
+ jint port)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_bind (env, this, addr, port, 1);
+ _javanet_bind(env, obj, addr, port, 1);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -144,14 +142,13 @@ Java_gnu_java_net_PlainSocketImpl_bind (JNIEnv * env, jobject this,
* connections allowed.
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_listen (JNIEnv * env, jobject this,
- jint queuelen)
+Java_gnu_java_net_VMPlainSocketImpl_listen(JNIEnv *env, jclass klass, jobject obj, jint queuelen)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_listen (env, this, queuelen);
+ _javanet_listen(env, obj, queuelen);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -163,14 +160,13 @@ Java_gnu_java_net_PlainSocketImpl_listen (JNIEnv * env, jobject this,
* object. Note that we assume this is a PlainSocketImpl just like us.
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_accept (JNIEnv * env, jobject this,
- jobject impl)
+Java_gnu_java_net_VMPlainSocketImpl_accept(JNIEnv *env, jclass klass, jobject obj, jobject impl)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_accept (env, this, impl);
+ _javanet_accept(env, obj, impl);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -178,39 +174,38 @@ Java_gnu_java_net_PlainSocketImpl_accept (JNIEnv * env, jobject this,
/*************************************************************************/
JNIEXPORT jint JNICALL
-Java_gnu_java_net_PlainSocketImpl_available (JNIEnv * env, jobject this)
+Java_gnu_java_net_VMPlainSocketImpl_available(JNIEnv *env, jclass klass, jobject obj)
{
#ifndef WITHOUT_NETWORK
- jclass cls;
+ jclass cls;
jfieldID fid;
- int fd;
- int bytesAvailable;
- int result;
-
- assert (env != NULL);
- assert ((*env) != NULL);
-
- cls = (*env)->GetObjectClass (env, this);
+ int fd;
+ int bytesAvailable;
+ int result;
+
+ assert(env!=NULL);
+ assert((*env)!=NULL);
+
+ cls = (*env)->GetObjectClass(env, obj);
if (cls == 0)
{
- JCL_ThrowException (env, IO_EXCEPTION, "internal error");
+ JCL_ThrowException(env, IO_EXCEPTION, "internal error");
return 0;
}
-
- fid = (*env)->GetFieldID (env, cls, "native_fd", "I");
+
+ fid = (*env)->GetFieldID(env, cls, "native_fd", "I");
if (fid == 0)
{
- JCL_ThrowException (env, IO_EXCEPTION, "internal error");
+ JCL_ThrowException(env, IO_EXCEPTION, "internal error");
return 0;
}
- fd = (*env)->GetIntField (env, this, fid);
-
- TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_AVAILABLE (fd, bytesAvailable, result);
+ fd = (*env)->GetIntField(env, obj, fid);
+
+ TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_AVAILABLE(fd,bytesAvailable,result);
if (result != TARGET_NATIVE_OK)
{
- JCL_ThrowException (env, IO_EXCEPTION,
- TARGET_NATIVE_LAST_ERROR_STRING ());
+ JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());
return 0;
}
@@ -226,14 +221,14 @@ Java_gnu_java_net_PlainSocketImpl_available (JNIEnv * env, jobject this)
* This method sets the specified option for a socket
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_setOption (JNIEnv * env, jobject this,
- jint option_id, jobject val)
+Java_gnu_java_net_VMPlainSocketImpl_setOption(JNIEnv *env,jclass klass, jobject obj,
+ jint option_id, jobject val)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_set_option (env, this, option_id, val);
+ _javanet_set_option(env, obj, option_id, val);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
@@ -241,17 +236,17 @@ Java_gnu_java_net_PlainSocketImpl_setOption (JNIEnv * env, jobject this,
/*************************************************************************/
/*
- * This method sets the specified option for a socket
+ * This method gets the specified option for a socket
*/
JNIEXPORT jobject JNICALL
-Java_gnu_java_net_PlainSocketImpl_getOption (JNIEnv * env, jobject this,
- jint option_id)
+Java_gnu_java_net_VMPlainSocketImpl_getOption(JNIEnv *env, jclass klass, jobject obj,
+ jint option_id)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- return (_javanet_get_option (env, this, option_id));
+ return(_javanet_get_option(env, obj, option_id));
#else /* not WITHOUT_NETWORK */
return NULL;
#endif /* not WITHOUT_NETWORK */
@@ -263,14 +258,14 @@ Java_gnu_java_net_PlainSocketImpl_getOption (JNIEnv * env, jobject this,
* Reads a buffer from a remote host
*/
JNIEXPORT jint JNICALL
-Java_gnu_java_net_PlainSocketImpl_read (JNIEnv * env, jobject this,
- jarray buf, jint offset, jint len)
+Java_gnu_java_net_VMPlainSocketImpl_read(JNIEnv *env, jclass klass, jobject obj, jarray buf,
+ jint offset, jint len)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- return (_javanet_recvfrom (env, this, buf, offset, len, 0, 0));
+ return(_javanet_recvfrom(env, obj, buf, offset, len, 0, 0));
#else /* not WITHOUT_NETWORK */
return 0;
#endif /* not WITHOUT_NETWORK */
@@ -282,20 +277,20 @@ Java_gnu_java_net_PlainSocketImpl_read (JNIEnv * env, jobject this,
* Writes a buffer to the remote host
*/
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_write (JNIEnv * env, jobject this,
- jarray buf, jint offset, jint len)
+Java_gnu_java_net_VMPlainSocketImpl_write(JNIEnv *env, jclass klass, jobject obj, jarray buf,
+ jint offset, jint len)
{
#ifndef WITHOUT_NETWORK
- assert (env != NULL);
- assert ((*env) != NULL);
+ assert(env!=NULL);
+ assert((*env)!=NULL);
- _javanet_sendto (env, this, buf, offset, len, 0, 0);
+ _javanet_sendto(env, obj, buf, offset, len, 0, 0);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_shutdownInput (JNIEnv * env, jobject this)
+Java_gnu_java_net_VMPlainSocketImpl_shutdownInput (JNIEnv * env, jclass klass, jobject this)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
@@ -307,7 +302,7 @@ Java_gnu_java_net_PlainSocketImpl_shutdownInput (JNIEnv * env, jobject this)
}
JNIEXPORT void JNICALL
-Java_gnu_java_net_PlainSocketImpl_shutdownOutput (JNIEnv * env, jobject this)
+Java_gnu_java_net_VMPlainSocketImpl_shutdownOutput (JNIEnv * env, jclass klass, jobject this)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);