diff options
author | Robert Schuster <theBohemian@gmx.net> | 2008-05-15 18:44:28 +0000 |
---|---|---|
committer | Robert Schuster <theBohemian@gmx.net> | 2008-05-15 18:44:28 +0000 |
commit | d988b0c8a3a5f0b792cc025e7ae57cbc0dd2838d (patch) | |
tree | 3113449d427d692286ef3f3f3a3fccfff6aa9c40 /native | |
parent | 02921b01621bc91bc1c1b9729e33515fea757e59 (diff) | |
download | classpath-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')
-rw-r--r-- | native/jni/java-net/java_net_VMNetworkInterface.c | 141 |
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 */ |