201 } |
201 } |
202 |
202 |
203 JNIEXPORT jobject JNICALL |
203 JNIEXPORT jobject JNICALL |
204 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) { |
204 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) { |
205 jobject iaObj; |
205 jobject iaObj; |
206 #ifdef AF_INET6 |
|
207 if (him->sa_family == AF_INET6) { |
206 if (him->sa_family == AF_INET6) { |
208 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him; |
207 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him; |
209 jbyte *caddr = (jbyte *)&(him6->sin6_addr); |
208 jbyte *caddr = (jbyte *)&(him6->sin6_addr); |
210 if (NET_IsIPv4Mapped(caddr)) { |
209 if (NET_IsIPv4Mapped(caddr)) { |
211 int address; |
210 int address; |
225 setInetAddress_family(env, iaObj, java_net_InetAddress_IPv6); |
224 setInetAddress_family(env, iaObj, java_net_InetAddress_IPv6); |
226 scope = getScopeID(him); |
225 scope = getScopeID(him); |
227 setInet6Address_scopeid(env, iaObj, scope); |
226 setInet6Address_scopeid(env, iaObj, scope); |
228 } |
227 } |
229 *port = ntohs(him6->sin6_port); |
228 *port = ntohs(him6->sin6_port); |
230 } else |
229 } else { |
231 #endif /* AF_INET6 */ |
230 struct sockaddr_in *him4 = (struct sockaddr_in *)him; |
232 { |
231 iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
233 struct sockaddr_in *him4 = (struct sockaddr_in *)him; |
232 CHECK_NULL_RETURN(iaObj, NULL); |
234 iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); |
233 setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4); |
235 CHECK_NULL_RETURN(iaObj, NULL); |
234 setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr)); |
236 setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4); |
235 *port = ntohs(him4->sin_port); |
237 setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr)); |
236 } |
238 *port = ntohs(him4->sin_port); |
|
239 } |
|
240 return iaObj; |
237 return iaObj; |
241 } |
238 } |
242 |
239 |
243 JNIEXPORT jint JNICALL |
240 JNIEXPORT jint JNICALL |
244 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj) |
241 NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj) |
245 { |
242 { |
246 jint family = AF_INET; |
243 jint family = AF_INET; |
247 |
244 |
248 #ifdef AF_INET6 |
|
249 family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ? |
245 family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ? |
250 AF_INET : AF_INET6; |
246 AF_INET : AF_INET6; |
251 if (him->sa_family == AF_INET6) { |
247 if (him->sa_family == AF_INET6) { |
252 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him; |
248 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him; |
253 jbyte *caddrNew = (jbyte *)&(him6->sin6_addr); |
249 jbyte *caddrNew = (jbyte *)&(him6->sin6_addr); |
277 return JNI_TRUE; |
273 return JNI_TRUE; |
278 } else { |
274 } else { |
279 return JNI_FALSE; |
275 return JNI_FALSE; |
280 } |
276 } |
281 } |
277 } |
282 } else |
278 } else { |
283 #endif /* AF_INET6 */ |
279 struct sockaddr_in *him4 = (struct sockaddr_in *)him; |
284 { |
280 int addrNew, addrCur; |
285 struct sockaddr_in *him4 = (struct sockaddr_in *)him; |
281 if (family != AF_INET) { |
286 int addrNew, addrCur; |
282 return JNI_FALSE; |
287 if (family != AF_INET) { |
|
288 return JNI_FALSE; |
|
289 } |
|
290 addrNew = ntohl(him4->sin_addr.s_addr); |
|
291 addrCur = getInetAddress_addr(env, iaObj); |
|
292 if (addrNew == addrCur) { |
|
293 return JNI_TRUE; |
|
294 } else { |
|
295 return JNI_FALSE; |
|
296 } |
|
297 } |
283 } |
|
284 addrNew = ntohl(him4->sin_addr.s_addr); |
|
285 addrCur = getInetAddress_addr(env, iaObj); |
|
286 if (addrNew == addrCur) { |
|
287 return JNI_TRUE; |
|
288 } else { |
|
289 return JNI_FALSE; |
|
290 } |
|
291 } |
298 } |
292 } |
299 |
293 |
300 unsigned short |
294 unsigned short |
301 in_cksum(unsigned short *addr, int len) { |
295 in_cksum(unsigned short *addr, int len) { |
302 int nleft = len; |
296 int nleft = len; |