diff options
author | Roman Kennke <roman@kennke.org> | 2006-01-04 20:46:16 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2006-01-04 20:46:16 +0000 |
commit | 9ff80c73c85971b3d5bf1b317bcc9f2193473d44 (patch) | |
tree | eca39d0abd6c525876dbd923eb30877c463c3772 /native | |
parent | a82b606be8017296ce467a6ea2a0dc5f2fe959f7 (diff) | |
download | classpath-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.am | 4 | ||||
-rw-r--r-- | native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c | 452 | ||||
-rw-r--r-- | native/jni/java-net/gnu_java_net_VMPlainDatagramSocketImpl.c | 402 | ||||
-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); |