src/share/native/java/net/net_util.c

Print this page




  80         Java_java_net_Inet6Address_init(env, 0);
  81         initialized = 1;
  82     }
  83 }
  84 
  85 JNIEXPORT jobject JNICALL
  86 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
  87     jobject iaObj;
  88     init(env);
  89 #ifdef AF_INET6
  90     if (him->sa_family == AF_INET6) {
  91         jbyteArray ipaddress;
  92 #ifdef WIN32
  93         struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
  94 #else
  95         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
  96 #endif
  97         jbyte *caddr = (jbyte *)&(him6->sin6_addr);
  98         if (NET_IsIPv4Mapped(caddr)) {
  99             int address;
 100             static jclass inet4Cls = 0;
 101             if (inet4Cls == 0) {
 102                 jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
 103                 CHECK_NULL_RETURN(c, NULL);
 104                 inet4Cls = (*env)->NewGlobalRef(env, c);
 105                 CHECK_NULL_RETURN(inet4Cls, NULL);
 106                 (*env)->DeleteLocalRef(env, c);
 107             }
 108             iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID);
 109             CHECK_NULL_RETURN(iaObj, NULL);
 110             address = NET_IPv4MappedToIPv4(caddr);
 111             (*env)->SetIntField(env, iaObj, ia_addressID, address);
 112             (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
 113         } else {
 114             static jclass inet6Cls = 0;
 115             jint scope;
 116             if (inet6Cls == 0) {
 117                 jclass c = (*env)->FindClass(env, "java/net/Inet6Address");
 118                 CHECK_NULL_RETURN(c, NULL);
 119                 inet6Cls = (*env)->NewGlobalRef(env, c);
 120                 CHECK_NULL_RETURN(inet6Cls, NULL);
 121                 (*env)->DeleteLocalRef(env, c);
 122             }
 123             iaObj = (*env)->NewObject(env, inet6Cls, ia6_ctrID);
 124             CHECK_NULL_RETURN(iaObj, NULL);
 125             ipaddress = (*env)->NewByteArray(env, 16);
 126             CHECK_NULL_RETURN(ipaddress, NULL);
 127             (*env)->SetByteArrayRegion(env, ipaddress, 0, 16,
 128                                        (jbyte *)&(him6->sin6_addr));
 129 
 130             (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress);
 131 
 132             (*env)->SetIntField(env, iaObj, ia_familyID, IPv6);
 133             scope = getScopeID(him);
 134             (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
 135             if (scope > 0)
 136                 (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
 137         }
 138         *port = ntohs(him6->sin6_port);
 139     } else
 140 #endif /* AF_INET6 */
 141         {
 142             struct sockaddr_in *him4 = (struct sockaddr_in *)him;
 143             static jclass inet4Cls = 0;
 144 
 145             if (inet4Cls == 0) {
 146                 jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
 147                 CHECK_NULL_RETURN(c, NULL);
 148                 inet4Cls = (*env)->NewGlobalRef(env, c);
 149                 CHECK_NULL_RETURN(inet4Cls, NULL);
 150                 (*env)->DeleteLocalRef(env, c);
 151             }
 152             iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID);
 153             CHECK_NULL_RETURN(iaObj, NULL);
 154             (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
 155             (*env)->SetIntField(env, iaObj, ia_addressID,
 156                                 ntohl(him4->sin_addr.s_addr));
 157             *port = ntohs(him4->sin_port);
 158         }
 159     return iaObj;
 160 }
 161 
 162 JNIEXPORT jint JNICALL
 163 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
 164 {
 165     jint family = AF_INET;
 166 
 167 #ifdef AF_INET6
 168     family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4?
 169         AF_INET : AF_INET6;
 170     if (him->sa_family == AF_INET6) {
 171 #ifdef WIN32
 172         struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;




  80         Java_java_net_Inet6Address_init(env, 0);
  81         initialized = 1;
  82     }
  83 }
  84 
  85 JNIEXPORT jobject JNICALL
  86 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
  87     jobject iaObj;
  88     init(env);
  89 #ifdef AF_INET6
  90     if (him->sa_family == AF_INET6) {
  91         jbyteArray ipaddress;
  92 #ifdef WIN32
  93         struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
  94 #else
  95         struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
  96 #endif
  97         jbyte *caddr = (jbyte *)&(him6->sin6_addr);
  98         if (NET_IsIPv4Mapped(caddr)) {
  99             int address;
 100             iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);








 101             CHECK_NULL_RETURN(iaObj, NULL);
 102             address = NET_IPv4MappedToIPv4(caddr);
 103             (*env)->SetIntField(env, iaObj, ia_addressID, address);
 104             (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
 105         } else {

 106             jint scope;
 107             iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);







 108             CHECK_NULL_RETURN(iaObj, NULL);
 109             ipaddress = (*env)->NewByteArray(env, 16);
 110             CHECK_NULL_RETURN(ipaddress, NULL);
 111             (*env)->SetByteArrayRegion(env, ipaddress, 0, 16,
 112                                        (jbyte *)&(him6->sin6_addr));
 113 
 114             (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress);
 115 
 116             (*env)->SetIntField(env, iaObj, ia_familyID, IPv6);
 117             scope = getScopeID(him);
 118             (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
 119             if (scope > 0)
 120                 (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
 121         }
 122         *port = ntohs(him6->sin6_port);
 123     } else
 124 #endif /* AF_INET6 */
 125         {
 126             struct sockaddr_in *him4 = (struct sockaddr_in *)him;
 127             iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);









 128             CHECK_NULL_RETURN(iaObj, NULL);
 129             (*env)->SetIntField(env, iaObj, ia_familyID, IPv4);
 130             (*env)->SetIntField(env, iaObj, ia_addressID,
 131                                 ntohl(him4->sin_addr.s_addr));
 132             *port = ntohs(him4->sin_port);
 133         }
 134     return iaObj;
 135 }
 136 
 137 JNIEXPORT jint JNICALL
 138 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
 139 {
 140     jint family = AF_INET;
 141 
 142 #ifdef AF_INET6
 143     family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4?
 144         AF_INET : AF_INET6;
 145     if (him->sa_family == AF_INET6) {
 146 #ifdef WIN32
 147         struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;