src/solaris/native/java/net/PlainDatagramSocketImpl.c

Print this page

        

*** 81,128 **** static jfieldID pdsi_multicastInterfaceID; static jfieldID pdsi_loopbackID; static jfieldID pdsi_ttlID; #endif ! /* ! * Returns a java.lang.Integer based on 'i' ! */ ! static jobject createInteger(JNIEnv *env, int i) { ! static jclass i_class; ! static jmethodID i_ctrID; if (i_class == NULL) { jclass c = (*env)->FindClass(env, "java/lang/Integer"); CHECK_NULL_RETURN(c, NULL); i_ctrID = (*env)->GetMethodID(env, c, "<init>", "(I)V"); CHECK_NULL_RETURN(i_ctrID, NULL); i_class = (*env)->NewGlobalRef(env, c); CHECK_NULL_RETURN(i_class, NULL); } return ( (*env)->NewObject(env, i_class, i_ctrID, i) ); } ! /* ! * Returns a java.lang.Boolean based on 'b' ! */ ! static jobject createBoolean(JNIEnv *env, int b) { ! static jclass b_class; ! static jmethodID b_ctrID; if (b_class == NULL) { jclass c = (*env)->FindClass(env, "java/lang/Boolean"); CHECK_NULL_RETURN(c, NULL); b_ctrID = (*env)->GetMethodID(env, c, "<init>", "(Z)V"); CHECK_NULL_RETURN(b_ctrID, NULL); b_class = (*env)->NewGlobalRef(env, c); CHECK_NULL_RETURN(b_class, NULL); } return( (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b!=0)) ); } /* * Returns the fd for a PlainDatagramSocketImpl or -1 * if closed. */ --- 81,149 ---- static jfieldID pdsi_multicastInterfaceID; static jfieldID pdsi_loopbackID; static jfieldID pdsi_ttlID; #endif ! static jclass i_class; ! static jmethodID i_ctrID; ! static jfieldID i_valueID; + int initIntegerIDs(JNIEnv* env) { if (i_class == NULL) { jclass c = (*env)->FindClass(env, "java/lang/Integer"); CHECK_NULL_RETURN(c, NULL); i_ctrID = (*env)->GetMethodID(env, c, "<init>", "(I)V"); CHECK_NULL_RETURN(i_ctrID, NULL); + i_valueID = (*env)->GetFieldID(env, c, "value", "I"); + CHECK_NULL_RETURN(i_valueID, NULL); i_class = (*env)->NewGlobalRef(env, c); CHECK_NULL_RETURN(i_class, NULL); } + return 1; + } + /* Returns a java.lang.Integer based on 'i' */ + static jobject createInteger(JNIEnv *env, int i) { + CHECK_NULL_RETURN(initIntegerIDs(env), NULL); return ( (*env)->NewObject(env, i_class, i_ctrID, i) ); } ! /* Returns a jint based on the given java.lang.Integer */ ! static jint retrieveInteger(JNIEnv *env, jobject i) { ! CHECK_NULL_RETURN(initIntegerIDs(env), NULL); ! return (*env)->GetIntField(env, i, i_valueID); ! } + static jclass b_class; + static jmethodID b_ctrID; + static jfieldID b_valueID; + + int initBooleanIDs(JNIEnv* env) { if (b_class == NULL) { jclass c = (*env)->FindClass(env, "java/lang/Boolean"); CHECK_NULL_RETURN(c, NULL); b_ctrID = (*env)->GetMethodID(env, c, "<init>", "(Z)V"); CHECK_NULL_RETURN(b_ctrID, NULL); + b_valueID = (*env)->GetFieldID(env, c, "value", "Z"); + CHECK_NULL_RETURN(b_valueID, NULL); b_class = (*env)->NewGlobalRef(env, c); CHECK_NULL_RETURN(b_class, NULL); } + return 1; + } + /* Returns a java.lang.Boolean based on 'b' */ + static jobject createBoolean(JNIEnv *env, int b) { + CHECK_NULL_RETURN(initBooleanIDs(env), NULL); return( (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b!=0)) ); } + /* Returns a jboolean based on the given java.lang.Boolean */ + static jboolean retrieveBoolean(JNIEnv *env, jobject b) { + CHECK_NULL_RETURN(initBooleanIDs(env), NULL); + return (*env)->GetBooleanField(env, b, b_valueID); + } /* * Returns the fd for a PlainDatagramSocketImpl or -1 * if closed. */
*** 1133,1162 **** /* * Set outgoing multicast interface designated by a NetworkInterface. * Throw exception if failed. */ static void mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject value) { - static jfieldID ni_addrsID; - static jfieldID ia_addressID; struct in_addr in; jobjectArray addrArray; jsize len; jobject addr; int i; - if (ni_addrsID == NULL) { - jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); - CHECK_NULL(c); - ni_addrsID = (*env)->GetFieldID(env, c, "addrs", - "[Ljava/net/InetAddress;"); - CHECK_NULL(ni_addrsID); - c = (*env)->FindClass(env,"java/net/InetAddress"); - CHECK_NULL(c); - ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); - CHECK_NULL(ia_addressID); - } - addrArray = (*env)->GetObjectField(env, value, ni_addrsID); len = (*env)->GetArrayLength(env, addrArray); /* * Check that there is at least one address bound to this --- 1154,1169 ----
*** 1190,1208 **** * Set outgoing multicast interface designated by a NetworkInterface. * Throw exception if failed. */ #ifdef AF_INET6 static void mcast_set_if_by_if_v6(JNIEnv *env, jobject this, int fd, jobject value) { - static jfieldID ni_indexID; int index; - if (ni_indexID == NULL) { - jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); - CHECK_NULL(c); - ni_indexID = (*env)->GetFieldID(env, c, "index", "I"); - CHECK_NULL(ni_indexID); - } index = (*env)->GetIntField(env, value, ni_indexID); if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, (const char*)&index, sizeof(index)) < 0) { if (errno == EINVAL && index > 0) { --- 1197,1208 ----
*** 1232,1251 **** /* * Set outgoing multicast interface designated by an InetAddress. * Throw exception if failed. */ static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) { - static jfieldID ia_addressID; struct in_addr in; - if (ia_addressID == NULL) { - jclass c = (*env)->FindClass(env,"java/net/InetAddress"); - CHECK_NULL(c); - ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); - CHECK_NULL(ia_addressID); - } - in.s_addr = htonl( (*env)->GetIntField(env, value, ia_addressID) ); if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&in, sizeof(in)) < 0) { NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", --- 1232,1243 ----
*** 1257,1274 **** * Set outgoing multicast interface designated by an InetAddress. * Throw exception if failed. */ #ifdef AF_INET6 static void mcast_set_if_by_addr_v6(JNIEnv *env, jobject this, int fd, jobject value) { - static jclass ni_class; - if (ni_class == NULL) { - jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); - CHECK_NULL(c); - ni_class = (*env)->NewGlobalRef(env, c); - CHECK_NULL(ni_class); - } - value = Java_java_net_NetworkInterface_getByInetAddress0(env, ni_class, value); if (value == NULL) { if (!(*env)->ExceptionOccurred(env)) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "bad argument for IP_MULTICAST_IF" --- 1249,1258 ----
*** 1360,1380 **** /* * Enable/disable local loopback of multicast datagrams. */ static void mcast_set_loop_v4(JNIEnv *env, jobject this, int fd, jobject value) { - jclass cls; - jfieldID fid; jboolean on; char loopback; ! cls = (*env)->FindClass(env, "java/lang/Boolean"); ! CHECK_NULL(cls); ! fid = (*env)->GetFieldID(env, cls, "value", "Z"); ! CHECK_NULL(fid); ! ! on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *)&loopback, sizeof(char)) < 0) { NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; --- 1344,1357 ---- /* * Enable/disable local loopback of multicast datagrams. */ static void mcast_set_loop_v4(JNIEnv *env, jobject this, int fd, jobject value) { jboolean on; char loopback; ! on = retrieveBoolean(env, value); loopback = (!on ? 1 : 0); if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *)&loopback, sizeof(char)) < 0) { NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return;
*** 1384,1404 **** /* * Enable/disable local loopback of multicast datagrams. */ #ifdef AF_INET6 static void mcast_set_loop_v6(JNIEnv *env, jobject this, int fd, jobject value) { - jclass cls; - jfieldID fid; jboolean on; int loopback; ! cls = (*env)->FindClass(env, "java/lang/Boolean"); ! CHECK_NULL(cls); ! fid = (*env)->GetFieldID(env, cls, "value", "Z"); ! CHECK_NULL(fid); ! ! on = (*env)->GetBooleanField(env, value, fid); loopback = (!on ? 1 : 0); if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (const void *)&loopback, sizeof(int)) < 0) { NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return; --- 1361,1374 ---- /* * Enable/disable local loopback of multicast datagrams. */ #ifdef AF_INET6 static void mcast_set_loop_v6(JNIEnv *env, jobject this, int fd, jobject value) { jboolean on; int loopback; ! on = retrieveBoolean(env, value); loopback = (!on ? 1 : 0); if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (const void *)&loopback, sizeof(int)) < 0) { NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); return;
*** 1505,1541 **** switch (opt) { case java_net_SocketOptions_SO_SNDBUF : case java_net_SocketOptions_SO_RCVBUF : case java_net_SocketOptions_IP_TOS : { ! jclass cls; ! jfieldID fid; ! ! cls = (*env)->FindClass(env, "java/lang/Integer"); ! CHECK_NULL(cls); ! fid = (*env)->GetFieldID(env, cls, "value", "I"); ! CHECK_NULL(fid); ! ! optval.i = (*env)->GetIntField(env, value, fid); optlen = sizeof(optval.i); break; } case java_net_SocketOptions_SO_REUSEADDR: case java_net_SocketOptions_SO_BROADCAST: { ! jclass cls; ! jfieldID fid; ! jboolean on; - cls = (*env)->FindClass(env, "java/lang/Boolean"); - CHECK_NULL(cls); - fid = (*env)->GetFieldID(env, cls, "value", "Z"); - CHECK_NULL(fid); - - on = (*env)->GetBooleanField(env, value, fid); - /* SO_REUSEADDR or SO_BROADCAST */ optval.i = (on ? 1 : 0); optlen = sizeof(optval.i); break; --- 1475,1494 ---- switch (opt) { case java_net_SocketOptions_SO_SNDBUF : case java_net_SocketOptions_SO_RCVBUF : case java_net_SocketOptions_IP_TOS : { ! optval.i = retrieveInteger(env, value); optlen = sizeof(optval.i); break; } case java_net_SocketOptions_SO_REUSEADDR: case java_net_SocketOptions_SO_BROADCAST: { ! jboolean on = retrieveBoolean(env, value); /* SO_REUSEADDR or SO_BROADCAST */ optval.i = (on ? 1 : 0); optlen = sizeof(optval.i); break;
*** 1591,1609 **** /* * IPv4 implementation */ if (isIPV4) { - static jclass inet4_class; - static jmethodID inet4_ctrID; - static jfieldID inet4_addrID; - - static jclass ni_class; - static jmethodID ni_ctrID; - static jfieldID ni_indexID; - static jfieldID ni_addrsID; - jobjectArray addrArray; jobject addr; jobject ni; struct in_addr in; --- 1544,1553 ----
*** 1626,1653 **** } /* * Construct and populate an Inet4Address */ ! if (inet4_class == NULL) { ! jclass c = (*env)->FindClass(env, "java/net/Inet4Address"); ! CHECK_NULL_RETURN(c, NULL); ! inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V"); ! CHECK_NULL_RETURN(inet4_ctrID, NULL); ! inet4_addrID = (*env)->GetFieldID(env, c, "address", "I"); ! CHECK_NULL_RETURN(inet4_addrID, NULL); ! inet4_class = (*env)->NewGlobalRef(env, c); ! CHECK_NULL_RETURN(inet4_class, NULL); ! } ! addr = (*env)->NewObject(env, inet4_class, inet4_ctrID, 0); CHECK_NULL_RETURN(addr, NULL); #ifdef __linux__ ! (*env)->SetIntField(env, addr, inet4_addrID, (isOldKernel ? ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)) ); #else ! (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr)); #endif /* * For IP_MULTICAST_IF return InetAddress */ --- 1570,1587 ---- } /* * Construct and populate an Inet4Address */ ! addr = (*env)->NewObject(env, ia4_class, ia4_ctrID, 0); CHECK_NULL_RETURN(addr, NULL); #ifdef __linux__ ! (*env)->SetIntField(env, addr, ia_addressID, (isOldKernel ? ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)) ); #else ! (*env)->SetIntField(env, addr, ia_addressID, ntohl(in.s_addr)); #endif /* * For IP_MULTICAST_IF return InetAddress */
*** 1657,1679 **** /* * For IP_MULTICAST_IF2 we get the NetworkInterface for * this address and return it */ - if (ni_class == NULL) { - jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); - CHECK_NULL_RETURN(c, NULL); - ni_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V"); - CHECK_NULL_RETURN(ni_ctrID, NULL); - ni_indexID = (*env)->GetFieldID(env, c, "index", "I"); - CHECK_NULL_RETURN(ni_indexID, NULL); - ni_addrsID = (*env)->GetFieldID(env, c, "addrs", - "[Ljava/net/InetAddress;"); - CHECK_NULL_RETURN(ni_addrsID, NULL); - ni_class = (*env)->NewGlobalRef(env, c); - CHECK_NULL_RETURN(ni_class, NULL); - } ni = Java_java_net_NetworkInterface_getByInetAddress0(env, ni_class, addr); if (ni) { return ni; } --- 1591,1600 ----
*** 1684,1694 **** */ ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0); CHECK_NULL_RETURN(ni, NULL); (*env)->SetIntField(env, ni, ni_indexID, -1); ! addrArray = (*env)->NewObjectArray(env, 1, inet4_class, NULL); CHECK_NULL_RETURN(addrArray, NULL); (*env)->SetObjectArrayElement(env, addrArray, 0, addr); (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); return ni; } --- 1605,1615 ---- */ ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0); CHECK_NULL_RETURN(ni, NULL); (*env)->SetIntField(env, ni, ni_indexID, -1); ! addrArray = (*env)->NewObjectArray(env, 1, ia4_class, NULL); CHECK_NULL_RETURN(addrArray, NULL); (*env)->SetObjectArrayElement(env, addrArray, 0, addr); (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); return ni; }
*** 1698,1713 **** /* * IPv6 implementation */ if ((opt == java_net_SocketOptions_IP_MULTICAST_IF) || (opt == java_net_SocketOptions_IP_MULTICAST_IF2)) { - - static jclass ni_class; - static jmethodID ni_ctrID; - static jfieldID ni_indexID; - static jfieldID ni_addrsID; - static jclass ia_class; static jmethodID ia_anyLocalAddressID; int index; int len = sizeof(index); --- 1619,1628 ----
*** 1731,1762 **** "Error getting socket option"); return NULL; } } ! if (ni_class == NULL) { ! jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); ! CHECK_NULL_RETURN(c, NULL); ! ni_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V"); ! CHECK_NULL_RETURN(ni_ctrID, NULL); ! ni_indexID = (*env)->GetFieldID(env, c, "index", "I"); ! CHECK_NULL_RETURN(ni_indexID, NULL); ! ni_addrsID = (*env)->GetFieldID(env, c, "addrs", ! "[Ljava/net/InetAddress;"); ! CHECK_NULL_RETURN(ni_addrsID, NULL); ! ! ia_class = (*env)->FindClass(env, "java/net/InetAddress"); ! CHECK_NULL_RETURN(ia_class, NULL); ! ia_class = (*env)->NewGlobalRef(env, ia_class); ! CHECK_NULL_RETURN(ia_class, NULL); ia_anyLocalAddressID = (*env)->GetStaticMethodID(env, ia_class, "anyLocalAddress", "()Ljava/net/InetAddress;"); CHECK_NULL_RETURN(ia_anyLocalAddressID, NULL); - ni_class = (*env)->NewGlobalRef(env, c); - CHECK_NULL_RETURN(ni_class, NULL); } /* * If multicast to a specific interface then return the * interface (for IF2) or the any address on that interface --- 1646,1661 ---- "Error getting socket option"); return NULL; } } ! if (ia_anyLocalAddressID == NULL) { ia_anyLocalAddressID = (*env)->GetStaticMethodID(env, ia_class, "anyLocalAddress", "()Ljava/net/InetAddress;"); CHECK_NULL_RETURN(ia_anyLocalAddressID, NULL); } /* * If multicast to a specific interface then return the * interface (for IF2) or the any address on that interface
*** 2166,2184 **** * NetworkInterface */ if (niObj != NULL) { #if defined(__linux__) && defined(AF_INET6) if (ipv6_available()) { - static jfieldID ni_indexID; - - if (ni_indexID == NULL) { - jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); - CHECK_NULL(c); - ni_indexID = (*env)->GetFieldID(env, c, "index", "I"); - CHECK_NULL(ni_indexID); - } - mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID)); mname.imr_address.s_addr = 0; mname.imr_ifindex = (*env)->GetIntField(env, niObj, ni_indexID); mname_len = sizeof(struct ip_mreqn); } else --- 2065,2074 ----