209 */ |
209 */ |
210 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_bindx |
210 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_bindx |
211 (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port, |
211 (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port, |
212 jint addrsLength, jboolean add, jboolean preferIPv6) { |
212 jint addrsLength, jboolean add, jboolean preferIPv6) { |
213 SOCKETADDRESS *sap, *tmpSap; |
213 SOCKETADDRESS *sap, *tmpSap; |
214 int i, sa_len = sizeof(SOCKETADDRESS); |
214 int i; |
215 jobject ia; |
215 jobject ia; |
216 |
216 |
217 if (addrsLength < 1) |
217 if (addrsLength < 1) |
218 return; |
218 return; |
219 |
219 |
220 if ((sap = calloc(addrsLength, sa_len)) == NULL) { |
220 if ((sap = calloc(addrsLength, sizeof(SOCKETADDRESS))) == NULL) { |
221 JNU_ThrowOutOfMemoryError(env, "heap allocation failure"); |
221 JNU_ThrowOutOfMemoryError(env, "heap allocation failure"); |
222 return; |
222 return; |
223 } |
223 } |
224 |
224 |
225 tmpSap = sap; |
225 tmpSap = sap; |
226 for (i = 0; i < addrsLength; i++) { |
226 for (i = 0; i < addrsLength; i++) { |
227 ia = (*env)->GetObjectArrayElement(env, addrs, i); |
227 ia = (*env)->GetObjectArrayElement(env, addrs, i); |
228 if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr*)tmpSap, |
228 if (NET_InetAddressToSockaddr(env, ia, port, tmpSap, NULL, |
229 &sa_len, preferIPv6) != 0) { |
229 preferIPv6) != 0) { |
230 free(sap); |
230 free(sap); |
231 return; |
231 return; |
232 } |
232 } |
233 tmpSap++; |
233 tmpSap++; |
234 } |
234 } |
260 */ |
260 */ |
261 JNIEXPORT jint JNICALL |
261 JNIEXPORT jint JNICALL |
262 Java_sun_nio_ch_sctp_SctpNet_connect0 |
262 Java_sun_nio_ch_sctp_SctpNet_connect0 |
263 (JNIEnv *env, jclass clazz, int fd, jobject iao, jint port) { |
263 (JNIEnv *env, jclass clazz, int fd, jobject iao, jint port) { |
264 SOCKETADDRESS sa; |
264 SOCKETADDRESS sa; |
265 int sa_len = sizeof(SOCKETADDRESS); |
265 int sa_len = 0; |
266 int rv; |
266 int rv; |
267 |
267 |
268 if (NET_InetAddressToSockaddr(env, iao, port, &sa.sa, |
268 if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, |
269 &sa_len, JNI_TRUE) != 0) { |
269 JNI_TRUE) != 0) { |
270 return IOS_THROWN; |
270 return IOS_THROWN; |
271 } |
271 } |
272 |
272 |
273 rv = connect(fd, &sa.sa, sa_len); |
273 rv = connect(fd, &sa.sa, sa_len); |
274 if (rv != 0) { |
274 if (rv != 0) { |
309 if (dup2(preCloseFD, fd) < 0) |
309 if (dup2(preCloseFD, fd) < 0) |
310 JNU_ThrowIOExceptionWithLastError(env, "dup2 failed"); |
310 JNU_ThrowIOExceptionWithLastError(env, "dup2 failed"); |
311 } |
311 } |
312 } |
312 } |
313 |
313 |
314 void initializeISA |
314 void initializeISA(JNIEnv* env) { |
315 (JNIEnv* env) { |
|
316 if (isaCls == 0) { |
315 if (isaCls == 0) { |
317 jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress"); |
316 jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress"); |
318 CHECK_NULL(c); |
317 CHECK_NULL(c); |
319 isaCtrID = (*env)->GetMethodID(env, c, "<init>", |
318 isaCtrID = (*env)->GetMethodID(env, c, "<init>", |
320 "(Ljava/net/InetAddress;I)V"); |
319 "(Ljava/net/InetAddress;I)V"); |
345 * Class: sun_nio_ch_sctp_SctpNet |
343 * Class: sun_nio_ch_sctp_SctpNet |
346 * Method: getLocalAddresses0 |
344 * Method: getLocalAddresses0 |
347 * Signature: (I)[Ljava/net/SocketAddress; |
345 * Signature: (I)[Ljava/net/SocketAddress; |
348 */ |
346 */ |
349 JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_sctp_SctpNet_getLocalAddresses0 |
347 JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_sctp_SctpNet_getLocalAddresses0 |
350 (JNIEnv *env, jclass klass, jint fd) { |
348 (JNIEnv *env, jclass klass, jint fd) |
|
349 { |
351 void *addr_buf, *laddr; |
350 void *addr_buf, *laddr; |
352 struct sockaddr* sap; |
|
353 int i, addrCount; |
351 int i, addrCount; |
354 jobjectArray isaa; |
352 jobjectArray isaa; |
355 |
353 |
356 #ifdef __solaris__ |
354 #ifdef __solaris__ |
357 if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) { |
355 if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) { |
375 nio_sctp_freeladdrs(addr_buf); |
373 nio_sctp_freeladdrs(addr_buf); |
376 return NULL; |
374 return NULL; |
377 } |
375 } |
378 |
376 |
379 laddr = addr_buf; |
377 laddr = addr_buf; |
380 for (i=0; i<addrCount; i++) { |
378 for (i = 0; i < addrCount; i++) { |
381 int port = 0; |
379 int port = 0; |
382 jobject isa = NULL, ia; |
380 jobject ia, isa = NULL; |
383 sap = (struct sockaddr*)addr_buf; |
381 ia = NET_SockaddrToInetAddress(env, (SOCKETADDRESS *)addr_buf, &port); |
384 ia = NET_SockaddrToInetAddress(env, sap, &port); |
|
385 if (ia != NULL) |
382 if (ia != NULL) |
386 isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); |
383 isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); |
387 if (isa == NULL) |
384 if (isa == NULL) |
388 break; |
385 break; |
389 (*env)->SetObjectArrayElement(env, isaa, i, isa); |
386 (*env)->SetObjectArrayElement(env, isaa, i, isa); |
390 |
387 |
391 if (sap->sa_family == AF_INET) |
388 if (((struct sockaddr *)addr_buf)->sa_family == AF_INET) |
392 addr_buf = ((struct sockaddr_in*)addr_buf) + 1; |
389 addr_buf = ((struct sockaddr_in *)addr_buf) + 1; |
393 else |
390 else |
394 addr_buf = ((struct sockaddr_in6*)addr_buf) + 1; |
391 addr_buf = ((struct sockaddr_in6 *)addr_buf) + 1; |
395 } |
392 } |
396 |
393 |
397 nio_sctp_freeladdrs(laddr); |
394 nio_sctp_freeladdrs(laddr); |
398 return isaa; |
395 return isaa; |
399 } |
396 } |
400 |
397 |
401 jobjectArray getRemoteAddresses |
398 jobjectArray getRemoteAddresses(JNIEnv *env, jint fd, sctp_assoc_t id) { |
402 (JNIEnv *env, jint fd, sctp_assoc_t id) { |
|
403 void *addr_buf, *paddr; |
399 void *addr_buf, *paddr; |
404 struct sockaddr* sap; |
|
405 int i, addrCount; |
400 int i, addrCount; |
406 jobjectArray isaa; |
401 jobjectArray isaa; |
407 |
402 |
408 #if __solaris__ |
403 #if __solaris__ |
409 if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) { |
404 if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) { |
410 #else /* __linux__ */ |
405 #else /* __linux__ */ |
411 if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr**)&addr_buf)) == -1) { |
406 if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr **)&addr_buf)) == -1) { |
412 #endif |
407 #endif |
413 handleSocketError(env, errno); |
408 handleSocketError(env, errno); |
414 return NULL; |
409 return NULL; |
415 } |
410 } |
416 |
411 |
427 nio_sctp_freepaddrs(addr_buf); |
422 nio_sctp_freepaddrs(addr_buf); |
428 return NULL; |
423 return NULL; |
429 } |
424 } |
430 |
425 |
431 paddr = addr_buf; |
426 paddr = addr_buf; |
432 for (i=0; i<addrCount; i++) { |
427 for (i = 0; i < addrCount; i++) { |
|
428 int port = 0; |
433 jobject ia, isa = NULL; |
429 jobject ia, isa = NULL; |
434 int port = 0; |
430 ia = NET_SockaddrToInetAddress(env, (SOCKETADDRESS *)addr_buf, &port); |
435 sap = (struct sockaddr*)addr_buf; |
|
436 ia = NET_SockaddrToInetAddress(env, sap, &port); |
|
437 if (ia != NULL) |
431 if (ia != NULL) |
438 isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); |
432 isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port); |
439 if (isa == NULL) |
433 if (isa == NULL) |
440 break; |
434 break; |
441 (*env)->SetObjectArrayElement(env, isaa, i, isa); |
435 (*env)->SetObjectArrayElement(env, isaa, i, isa); |
442 |
436 |
443 if (sap->sa_family == AF_INET) |
437 if (((struct sockaddr *)addr_buf)->sa_family == AF_INET) |
444 addr_buf = ((struct sockaddr_in*)addr_buf) + 1; |
438 addr_buf = ((struct sockaddr_in *)addr_buf) + 1; |
445 else |
439 else |
446 addr_buf = ((struct sockaddr_in6*)addr_buf) + 1; |
440 addr_buf = ((struct sockaddr_in6 *)addr_buf) + 1; |
447 } |
441 } |
448 |
442 |
449 nio_sctp_freepaddrs(paddr); |
443 nio_sctp_freepaddrs(paddr); |
450 |
|
451 return isaa; |
444 return isaa; |
452 } |
445 } |
453 |
446 |
454 /* |
447 /* |
455 * Class: sun_nio_ch_sctp_SctpNet |
448 * Class: sun_nio_ch_sctp_SctpNet |
577 */ |
570 */ |
578 JNIEXPORT jobject JNICALL Java_sun_nio_ch_sctp_SctpNet_getPrimAddrOption0 |
571 JNIEXPORT jobject JNICALL Java_sun_nio_ch_sctp_SctpNet_getPrimAddrOption0 |
579 (JNIEnv *env, jclass klass, jint fd, jint assocId) { |
572 (JNIEnv *env, jclass klass, jint fd, jint assocId) { |
580 struct sctp_setprim prim; |
573 struct sctp_setprim prim; |
581 unsigned int prim_len = sizeof(prim); |
574 unsigned int prim_len = sizeof(prim); |
582 struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr; |
|
583 |
575 |
584 prim.ssp_assoc_id = assocId; |
576 prim.ssp_assoc_id = assocId; |
585 |
577 |
586 if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) { |
578 if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) { |
587 JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", |
579 JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", |
588 "sun.nio.ch.SctpNet.getPrimAddrOption0"); |
580 "sun.nio.ch.SctpNet.getPrimAddrOption0"); |
589 return NULL; |
581 return NULL; |
590 } |
582 } |
591 |
583 |
592 return SockAddrToInetSocketAddress(env, sap); |
584 return SockAddrToInetSocketAddress(env, (SOCKETADDRESS *)&prim.ssp_addr); |
593 } |
585 } |
594 |
586 |
595 /* |
587 /* |
596 * Class: sun_nio_ch_sctp_SctpNet |
588 * Class: sun_nio_ch_sctp_SctpNet |
597 * Method: setPrimAddrOption0 |
589 * Method: setPrimAddrOption0 |
598 * Signature: (IILjava/net/InetAddress;I)V |
590 * Signature: (IILjava/net/InetAddress;I)V |
599 */ |
591 */ |
600 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0 |
592 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0 |
601 (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) { |
593 (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) { |
602 struct sctp_setprim prim; |
594 struct sctp_setprim prim; |
603 struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr; |
595 |
604 int sap_len = sizeof(sap); |
596 if (NET_InetAddressToSockaddr(env, iaObj, port, |
605 |
597 (SOCKETADDRESS *)&prim.ssp_addr, |
606 if (NET_InetAddressToSockaddr(env, iaObj, port, sap, |
598 NULL, JNI_TRUE) != 0) { |
607 &sap_len, JNI_TRUE) != 0) { |
|
608 return; |
599 return; |
609 } |
600 } |
610 |
601 |
611 prim.ssp_assoc_id = assocId; |
602 prim.ssp_assoc_id = assocId; |
612 |
603 |
623 */ |
614 */ |
624 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPeerPrimAddrOption0 |
615 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPeerPrimAddrOption0 |
625 (JNIEnv *env, jclass klass, jint fd, jint assocId, |
616 (JNIEnv *env, jclass klass, jint fd, jint assocId, |
626 jobject iaObj, jint port, jboolean preferIPv6) { |
617 jobject iaObj, jint port, jboolean preferIPv6) { |
627 struct sctp_setpeerprim prim; |
618 struct sctp_setpeerprim prim; |
628 struct sockaddr* sap = (struct sockaddr*)&prim.sspp_addr; |
619 |
629 int sap_len = sizeof(sap); |
620 if (NET_InetAddressToSockaddr(env, iaObj, port, |
630 |
621 (SOCKETADDRESS *)&prim.sspp_addr, |
631 if (NET_InetAddressToSockaddr(env, iaObj, port, sap, |
622 NULL, preferIPv6) != 0) { |
632 &sap_len, preferIPv6) != 0) { |
|
633 return; |
623 return; |
634 } |
624 } |
635 |
625 |
636 prim.sspp_assoc_id = assocId; |
626 prim.sspp_assoc_id = assocId; |
637 |
627 |
638 if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim, |
628 if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim, |
639 sizeof(prim)) < 0) { |
629 sizeof(prim)) < 0) { |
640 JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", |
630 JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", |
641 "sun.nio.ch.SctpNet.setPeerPrimAddrOption0"); |
631 "sun.nio.ch.SctpNet.setPeerPrimAddrOption0"); |
642 } |
632 } |
643 } |
633 } |
644 |
634 |