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; |