summaryrefslogtreecommitdiff
path: root/native/jni
diff options
context:
space:
mode:
authorRobert Schuster <theBohemian@gmx.net>2008-05-15 18:44:28 +0000
committerRobert Schuster <theBohemian@gmx.net>2008-05-15 18:44:28 +0000
commitd988b0c8a3a5f0b792cc025e7ae57cbc0dd2838d (patch)
tree3113449d427d692286ef3f3f3a3fccfff6aa9c40 /native/jni
parent02921b01621bc91bc1c1b9729e33515fea757e59 (diff)
downloadclasspath-d988b0c8a3a5f0b792cc025e7ae57cbc0dd2838d.tar.gz
2008-05-15 Robert Schuster <robertschuster@fsfe.org>
* java/net/NetworkInterface.java: (isUp): New method. (isPointToPoint): Dito. (isLoopback): Dito. (supportsMulticast): Dito. * vm/reference/java/net/VMNetworkInterface.java: (isUp): New method. (isPointToPoint): Dito. (isLoopback): Dito. (supportsMulticast): Dito. * native/jni/java-net/java_net_VMNetworkInterface.c: (isUp): New method. (isPointToPoint): Dito. (isLoopback): Dito. (supportsMulticast): Dito.
Diffstat (limited to 'native/jni')
-rw-r--r--native/jni/java-net/java_net_VMNetworkInterface.c141
1 files changed, 140 insertions, 1 deletions
diff --git a/native/jni/java-net/java_net_VMNetworkInterface.c b/native/jni/java-net/java_net_VMNetworkInterface.c
index 73da5ee24..31e020509 100644
--- a/native/jni/java-net/java_net_VMNetworkInterface.c
+++ b/native/jni/java-net/java_net_VMNetworkInterface.c
@@ -1,5 +1,5 @@
/* VMNetworkInterface.c - Native methods for NetworkInterface class
- Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2005, 2006, 2008 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,11 +50,18 @@ exception statement from your version. */
#include <stdio.h>
#include <string.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+
#include <jni.h>
#include <jcl.h>
+#include <cpnative.h>
+#include <cpnet.h>
+
#include "java_net_VMNetworkInterface.h"
+int iff_flags(JNIEnv *, jstring, jint *);
static jmethodID java_net_VMNetworkInterface_init;
static jmethodID java_net_VMNetworkInterface_addAddress;
@@ -251,4 +258,136 @@ Java_java_net_VMNetworkInterface_getVMInterfaces (JNIEnv * env,
#endif /* HAVE_IFADDRS_H && HAVE_GETIFADDRS */
}
+int iff_flags(JNIEnv *env, jstring name, jint *flags)
+{
+ struct ifreq iff;
+ const char *iff_name;
+ jint socket;
+ int error, retval;
+
+ if ((error = cpnet_openSocketDatagram(env, &socket, AF_INET)))
+ {
+ return error;
+ }
+
+ iff_name = JCL_jstring_to_cstring(env, name);
+ memset(&iff, 0, sizeof(iff));
+ strcpy(iff.ifr_name, iff_name);
+
+ if (ioctl(socket, SIOCGIFFLAGS, &iff) >= 0)
+ {
+ *flags = (jint) iff.ifr_flags;
+
+ retval = 0;
+ }
+ else
+ {
+ retval = errno;
+ }
+
+ cpnet_close(env, socket);
+
+ JCL_free_cstring(env, name, iff_name);
+
+ return retval;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_java_net_VMNetworkInterface_isUp (JNIEnv *env, jclass class UNUSED,
+ jstring name)
+{
+ jint flags;
+ int error;
+ jboolean retval;
+
+ if ((error = iff_flags(env, name, &flags)))
+ {
+ JCL_ThrowException(env, "java/net/SocketException",
+ cpnative_getErrorString(error));
+
+ retval = JNI_FALSE;
+ }
+ else
+ {
+ retval = (flags & (IFF_UP | IFF_RUNNING))
+ ? JNI_TRUE
+ : JNI_FALSE;
+ }
+
+ return retval;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_java_net_VMNetworkInterface_isPointToPoint (JNIEnv *env,
+ jclass class UNUSED,
+ jstring name)
+{
+ jint flags;
+ int error;
+ jboolean retval;
+
+ if ((error = iff_flags(env, name, &flags)))
+ {
+ JCL_ThrowException(env, "java/net/SocketException",
+ cpnative_getErrorString(error));
+
+ retval = JNI_FALSE;
+ }
+ else
+ {
+ retval = (flags & IFF_POINTOPOINT) ? JNI_TRUE
+ : JNI_FALSE;
+ }
+
+ return retval;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_java_net_VMNetworkInterface_isLoopback (JNIEnv *env,
+ jclass class UNUSED,
+ jstring name)
+{
+ jint flags;
+ int error;
+ jboolean retval;
+
+ if ((error = iff_flags(env, name, &flags)))
+ {
+ JCL_ThrowException(env, "java/net/SocketException",
+ cpnative_getErrorString(error));
+
+ retval = JNI_FALSE;
+ }
+ else
+ {
+ retval = (flags & IFF_LOOPBACK) ? JNI_TRUE : JNI_FALSE;
+ }
+
+ return retval;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_java_net_VMNetworkInterface_supportsMulticast (JNIEnv *env,
+ jclass class UNUSED,
+ jstring name)
+{
+ jint flags;
+ int error;
+ jboolean retval;
+
+ if ((error = iff_flags(env, name, &flags)))
+ {
+ JCL_ThrowException(env, "java/net/SocketException",
+ cpnative_getErrorString(error));
+
+ retval = JNI_FALSE;
+ }
+ else
+ {
+ retval = (flags & IFF_MULTICAST) ? JNI_TRUE : JNI_FALSE;
+ }
+
+ return retval;
+}
+
/* end of file */