Initial revision

From-SVN: r102074
This commit is contained in:
Tom Tromey
2005-07-16 00:30:23 +00:00
parent 6f4434b39b
commit f911ba985a
4557 changed files with 1000262 additions and 0 deletions
@@ -0,0 +1,8 @@
*.o
*.a
*.lo
*.la
.libs
.deps
Makefile
Makefile.in
@@ -0,0 +1,14 @@
pkglib_LTLIBRARIES = libjavanet.la
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
libjavanet_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo
AM_LDFLAGS = @CLASSPATH_MODULE@
AM_CPPFLAGS = @CLASSPATH_INCLUDES@
AM_CFLAGS = @WARNING_CFLAGS@ @STRICT_WARNING_CFLAGS@ @ERROR_CFLAGS@
@@ -0,0 +1,452 @@
/* 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 */
}
@@ -0,0 +1,320 @@
/* PlainSocketImpl.c - Native methods for PlainSocketImpl class
Copyright (C) 1998, 2002, 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_PlainSocketImpl.h"
/*
* Note that the functions in this module simply redirect to another
* internal function. Why? Because many of these functions are shared
* with PlainDatagramSocketImpl. The unshared ones were done the same
* way for consistency.
*/
/*************************************************************************/
/*
* Creates a new stream or datagram socket
*/
JNIEXPORT void JNICALL
Java_gnu_java_net_PlainSocketImpl_create (JNIEnv * env, jobject this,
jboolean stream)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_create (env, this, stream);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* Close the socket. Any underlying streams will be closed by this
* action as well.
*/
JNIEXPORT void JNICALL
Java_gnu_java_net_PlainSocketImpl_close (JNIEnv * env, jobject this)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_close (env, this, 1);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* Connects to the specified destination.
*/
JNIEXPORT void JNICALL
Java_gnu_java_net_PlainSocketImpl_connect (JNIEnv * env, jobject this,
jobject addr, jint port)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_connect (env, this, 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_PlainSocketImpl_bind (JNIEnv * env, jobject this,
jobject addr, jint port)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_bind (env, this, addr, port, 1);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* Starts listening on a socket with the specified number of pending
* connections allowed.
*/
JNIEXPORT void JNICALL
Java_gnu_java_net_PlainSocketImpl_listen (JNIEnv * env, jobject this,
jint queuelen)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_listen (env, this, queuelen);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* Accepts a new connection and assigns it to the passed in SocketImpl
* 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)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_accept (env, this, impl);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
JNIEXPORT jint JNICALL
Java_gnu_java_net_PlainSocketImpl_available (JNIEnv * env, jobject this)
{
#ifndef WITHOUT_NETWORK
jclass cls;
jfieldID fid;
int fd;
int bytesAvailable;
int result;
assert (env != NULL);
assert ((*env) != NULL);
cls = (*env)->GetObjectClass (env, this);
if (cls == 0)
{
JCL_ThrowException (env, IO_EXCEPTION, "internal error");
return 0;
}
fid = (*env)->GetFieldID (env, cls, "native_fd", "I");
if (fid == 0)
{
JCL_ThrowException (env, IO_EXCEPTION, "internal error");
return 0;
}
fd = (*env)->GetIntField (env, this, 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 ());
return 0;
}
return bytesAvailable;
#else /* not WITHOUT_NETWORK */
return 0;
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* 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)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_set_option (env, this, 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_PlainSocketImpl_getOption (JNIEnv * env, jobject this,
jint option_id)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
return (_javanet_get_option (env, this, option_id));
#else /* not WITHOUT_NETWORK */
return NULL;
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* 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)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
return (_javanet_recvfrom (env, this, buf, offset, len, 0, 0));
#else /* not WITHOUT_NETWORK */
return 0;
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
/*
* 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)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_sendto (env, this, 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)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_shutdownInput (env, this);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
JNIEXPORT void JNICALL
Java_gnu_java_net_PlainSocketImpl_shutdownOutput (JNIEnv * env, jobject this)
{
#ifndef WITHOUT_NETWORK
assert (env != NULL);
assert ((*env) != NULL);
_javanet_shutdownOutput (env, this);
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
}
/* end of file */
@@ -0,0 +1,282 @@
/* VMInetAddress.c - Native methods for InetAddress class
Copyright (C) 1998, 2002, 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 "java_net_VMInetAddress.h"
/*************************************************************************/
/*
* Function to return the local hostname
*/
JNIEXPORT jstring JNICALL
Java_java_net_VMInetAddress_getLocalHostname (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
{
char hostname[256];
int result;
jstring retval;
assert (env != NULL);
assert ((*env) != NULL);
#ifndef WITHOUT_NETWORK
TARGET_NATIVE_NETWORK_GET_HOSTNAME (hostname, sizeof (hostname), result);
if (result != TARGET_NATIVE_OK)
{
strcpy (hostname, "localhost");
}
#else /* not WITHOUT_NETWORK */
strcpy (hostname, "localhost");
#endif /* not WITHOUT_NETWORK */
retval = (*env)->NewStringUTF (env, hostname);
return (retval);
}
/*************************************************************************/
/*
* Returns the value of the special IP address INADDR_ANY
*/
JNIEXPORT jarray JNICALL
Java_java_net_VMInetAddress_lookupInaddrAny (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
{
jarray IParray;
jbyte *octets;
assert (env != NULL);
assert ((*env) != NULL);
/* Allocate an array for the IP address */
IParray = (*env)->NewByteArray (env, 4);
if (IParray == NULL)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
return (jarray) NULL;
}
/* Copy in the values */
octets = (*env)->GetByteArrayElements (env, IParray, 0);
#ifndef WITHOUT_NETWORK
TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (INADDR_ANY,
octets[0],
octets[1],
octets[2], octets[3]);
(*env)->ReleaseByteArrayElements (env, IParray, octets, 0);
#else /* not WITHOUT_NETWORK */
octets[0] = 0;
octets[1] = 0;
octets[2] = 0;
octets[3] = 0;
#endif /* not WITHOUT_NETWORK */
return (IParray);
}
/*************************************************************************/
/*
* Function to return the canonical hostname for a given IP address passed
* in as a byte array
*/
JNIEXPORT jstring JNICALL
Java_java_net_VMInetAddress_getHostByAddr (JNIEnv * env,
jclass class
__attribute__ ((__unused__)),
jarray arr)
{
#ifndef WITHOUT_NETWORK
jbyte *octets;
jsize len;
int addr;
char hostname[255];
int result;
jstring retval;
assert (env != NULL);
assert ((*env) != NULL);
/* Grab the byte[] array with the IP out of the input data */
len = (*env)->GetArrayLength (env, arr);
if (len != 4)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address");
return (jstring) NULL;
}
octets = (*env)->GetByteArrayElements (env, arr, 0);
if (!octets)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP Address");
return (jstring) NULL;
}
/* Convert it to a 32 bit address */
TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0],
octets[1],
octets[2], octets[3], addr);
/* Release some memory */
(*env)->ReleaseByteArrayElements (env, arr, octets, 0);
/* Resolve the address and return the name */
TARGET_NATIVE_NETWORK_GET_HOSTNAME_BY_ADDRESS (addr, hostname,
sizeof (hostname), result);
if (result != TARGET_NATIVE_OK)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Bad IP address");
return (jstring) NULL;
}
retval = (*env)->NewStringUTF (env, hostname);
return (retval);
#else /* not WITHOUT_NETWORK */
return (jstring) NULL;
#endif /* not WITHOUT_NETWORK */
}
/*************************************************************************/
JNIEXPORT jobjectArray JNICALL
Java_java_net_VMInetAddress_getHostByName (JNIEnv * env,
jclass class
__attribute__ ((__unused__)),
jstring host)
{
#ifndef WITHOUT_NETWORK
const char *hostname;
/* FIXME: limitation of max. 64 addresses - how to make it more flexibale? */
int addresses[64];
jsize addresses_count;
int result;
jclass arr_class;
jobjectArray addrs;
int i;
jbyte *octets;
jarray ret_octets;
int max_addresses;
assert (env != NULL);
assert ((*env) != NULL);
/* Grab the hostname string */
hostname = (*env)->GetStringUTFChars (env, host, 0);
if (!hostname)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Null hostname");
return (jobjectArray) NULL;
}
max_addresses = sizeof (addresses) / sizeof (addresses[0]);
TARGET_NATIVE_NETWORK_GET_HOSTNAME_BY_NAME (hostname,
addresses,
max_addresses,
addresses_count, result);
if (result != TARGET_NATIVE_OK)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, (char *) hostname);
return (jobjectArray) NULL;
}
(*env)->ReleaseStringUTFChars (env, host, hostname);
arr_class = (*env)->FindClass (env, "[B");
if (!arr_class)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
return (jobjectArray) NULL;
}
addrs = (*env)->NewObjectArray (env, addresses_count, arr_class, 0);
if (!addrs)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
return (jobjectArray) NULL;
}
/* Now loop and copy in each address */
for (i = 0; i < addresses_count; i++)
{
ret_octets = (*env)->NewByteArray (env, 4);
if (!ret_octets)
{
JCL_ThrowException (env, UNKNOWN_HOST_EXCEPTION, "Internal Error");
return (jobjectArray) NULL;
}
octets = (*env)->GetByteArrayElements (env, ret_octets, 0);
TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (addresses[i],
octets[0],
octets[1],
octets[2], octets[3]);
(*env)->ReleaseByteArrayElements (env, ret_octets, octets, 0);
(*env)->SetObjectArrayElement (env, addrs, i, ret_octets);
}
return (addrs);
#else /* not WITHOUT_NETWORK */
return (jobjectArray) NULL;
#endif /* not WITHOUT_NETWORK */
}
/* end of file */
@@ -0,0 +1,66 @@
/* VMNetworkInterface.c - Native methods for NetworkInterface class
Copyright (C) 2003, 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 "java_net_VMNetworkInterface.h"
#include "javanet.h"
/*
* Returns all local network interfaces as vector
*/
JNIEXPORT jobject JNICALL
Java_java_net_VMNetworkInterface_getInterfaces (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
{
JCL_ThrowException (env, IO_EXCEPTION,
"java.net.VMNetworkInterface.getInterfaces(): not implemented");
return 0;
}
/* end of file */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,109 @@
/* javanet.h - Declarations for common functions for the java.net package
Copyright (C) 1998, 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. */
#ifndef _JAVANET_LOADED
#define _JAVANET_LOADED
#include <jni.h>
/*************************************************************************/
/*
* Defined constants
*/
/* Exception Classes */
#define BIND_EXCEPTION "java/net/BindException"
#define IO_EXCEPTION "java/io/IOException"
#define SOCKET_EXCEPTION "java/net/SocketException"
#define UNKNOWN_HOST_EXCEPTION "java/net/UnknownHostException"
/* Socket Option Identifiers - Don't change or binary compatibility with
the JDK will be broken! These also need to
be kept compatible with java.net.SocketOptions */
#define SOCKOPT_TCP_NODELAY 1
#define SOCKOPT_SO_BINDADDR 15
#define SOCKOPT_SO_LINGER 128
#define SOCKOPT_SO_TIMEOUT 4102
#define SOCKOPT_SO_SNDBUF 4097
#define SOCKOPT_SO_RCVBUF 4098
#define SOCKOPT_SO_REUSEADDR 4
#define SOCKOPT_IP_MULTICAST_IF 16
#define SOCKOPT_SO_KEEPALIVE 8
/* Internal option identifiers. Not needed for JDK compatibility */
#define SOCKOPT_IP_TTL 7777
/*************************************************************************/
/*
* Macros
*/
/* Simple debug macro */
#ifdef DEBUG
#define DBG(x) fprintf(stderr, (x));
#else
#define DBG(x)
#endif
/*************************************************************************/
/*
* Function Prototypes
*/
extern int _javanet_get_int_field(JNIEnv *, jobject, const char *);
extern int _javanet_get_netaddr(JNIEnv *, jobject);
extern void _javanet_create(JNIEnv *, jobject, jboolean);
extern void _javanet_close(JNIEnv *, jobject, int);
extern void _javanet_connect(JNIEnv *, jobject, jobject, jint);
extern void _javanet_bind(JNIEnv *, jobject, jobject, jint, int);
extern void _javanet_listen(JNIEnv *, jobject, jint);
extern void _javanet_accept(JNIEnv *, jobject, jobject);
extern int _javanet_recvfrom(JNIEnv *, jobject, jarray, int, int, int *, int *);
extern void _javanet_sendto(JNIEnv *, jobject, jarray, int, int, int, int);
extern jobject _javanet_get_option(JNIEnv *, jobject, jint);
extern void _javanet_set_option(JNIEnv *, jobject, jint, jobject);
extern void _javanet_shutdownInput (JNIEnv *, jobject);
extern void _javanet_shutdownOutput (JNIEnv *, jobject);
/*************************************************************************/
#endif /* not _JAVANET_H_LOADED */