281 |
281 |
282 |
282 |
283 JNIEXPORT jboolean JNICALL |
283 JNIEXPORT jboolean JNICALL |
284 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl) |
284 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl) |
285 { |
285 { |
286 return JNI_FALSE; |
286 /* IPv6 sockets can join IPv4 multicast groups */ |
|
287 return JNI_TRUE; |
287 } |
288 } |
288 |
289 |
289 JNIEXPORT jboolean JNICALL |
290 JNIEXPORT jboolean JNICALL |
290 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl) |
291 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl) |
291 { |
292 { |
|
293 /* IPV6_ADD_MEMBERSHIP cannot be used to join IPv4 multicast groups */ |
|
294 return JNI_FALSE; |
|
295 } |
|
296 |
|
297 JNIEXPORT jboolean JNICALL |
|
298 Java_sun_nio_ch_Net_canUseIPv6OptionsWithIPv4LocalAddress0(JNIEnv* env, jclass cl) |
|
299 { |
|
300 /* IPV6_XXX socket options cannot be used on IPv6 sockets bound to IPv4 address */ |
292 return JNI_FALSE; |
301 return JNI_FALSE; |
293 } |
302 } |
294 |
303 |
295 JNIEXPORT jint JNICALL |
304 JNIEXPORT jint JNICALL |
296 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, |
305 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, |
433 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo) |
442 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo) |
434 { |
443 { |
435 SOCKETADDRESS sa; |
444 SOCKETADDRESS sa; |
436 int sa_len = sizeof(sa); |
445 int sa_len = sizeof(sa); |
437 |
446 |
438 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) { |
447 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) == SOCKET_ERROR) { |
439 int error = WSAGetLastError(); |
448 int error = WSAGetLastError(); |
440 if (error == WSAEINVAL) { |
449 if (error == WSAEINVAL) { |
441 return 0; |
450 return 0; |
442 } |
451 } |
443 NET_ThrowNew(env, error, "getsockname"); |
452 NET_ThrowNew(env, error, "getsockname"); |
451 { |
460 { |
452 SOCKETADDRESS sa; |
461 SOCKETADDRESS sa; |
453 int sa_len = sizeof(sa); |
462 int sa_len = sizeof(sa); |
454 int port; |
463 int port; |
455 |
464 |
456 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) { |
465 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) == SOCKET_ERROR) { |
457 NET_ThrowNew(env, WSAGetLastError(), "getsockname"); |
466 NET_ThrowNew(env, WSAGetLastError(), "getsockname"); |
458 return NULL; |
467 return NULL; |
459 } |
468 } |
460 return NET_SockaddrToInetAddress(env, &sa, &port); |
469 return NET_SockaddrToInetAddress(env, &sa, &port); |
461 } |
470 } |
464 Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo) |
473 Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo) |
465 { |
474 { |
466 SOCKETADDRESS sa; |
475 SOCKETADDRESS sa; |
467 int sa_len = sizeof(sa); |
476 int sa_len = sizeof(sa); |
468 |
477 |
469 if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) { |
478 if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) == SOCKET_ERROR) { |
470 int error = WSAGetLastError(); |
479 int error = WSAGetLastError(); |
471 if (error == WSAEINVAL) { |
480 if (error == WSAEINVAL) { |
472 return 0; |
481 return 0; |
473 } |
482 } |
474 NET_ThrowNew(env, error, "getsockname"); |
483 NET_ThrowNew(env, error, "getsockname"); |
482 { |
491 { |
483 SOCKETADDRESS sa; |
492 SOCKETADDRESS sa; |
484 int sa_len = sizeof(sa); |
493 int sa_len = sizeof(sa); |
485 int port; |
494 int port; |
486 |
495 |
487 if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) { |
496 if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) == SOCKET_ERROR) { |
488 NET_ThrowNew(env, WSAGetLastError(), "getsockname"); |
497 NET_ThrowNew(env, WSAGetLastError(), "getsockname"); |
489 return NULL; |
498 return NULL; |
490 } |
499 } |
491 return NET_SockaddrToInetAddress(env, &sa, &port); |
500 return NET_SockaddrToInetAddress(env, &sa, &port); |
492 } |
501 } |
520 if (mayNeedConversion) { |
529 if (mayNeedConversion) { |
521 n = NET_GetSockOpt(fdval(env, fdo), level, opt, arg, &arglen); |
530 n = NET_GetSockOpt(fdval(env, fdo), level, opt, arg, &arglen); |
522 } else { |
531 } else { |
523 n = getsockopt(fdval(env, fdo), level, opt, arg, &arglen); |
532 n = getsockopt(fdval(env, fdo), level, opt, arg, &arglen); |
524 } |
533 } |
525 if (n < 0) { |
534 if (n == SOCKET_ERROR) { |
526 handleSocketError(env, WSAGetLastError()); |
535 handleSocketError(env, WSAGetLastError()); |
527 return IOS_THROWN; |
536 return IOS_THROWN; |
528 } |
537 } |
529 |
538 |
530 if (level == SOL_SOCKET && opt == SO_LINGER) |
539 if (level == SOL_SOCKET && opt == SO_LINGER) |
564 if (mayNeedConversion) { |
573 if (mayNeedConversion) { |
565 n = NET_SetSockOpt(fdval(env, fdo), level, opt, parg, arglen); |
574 n = NET_SetSockOpt(fdval(env, fdo), level, opt, parg, arglen); |
566 } else { |
575 } else { |
567 n = setsockopt(fdval(env, fdo), level, opt, parg, arglen); |
576 n = setsockopt(fdval(env, fdo), level, opt, parg, arglen); |
568 } |
577 } |
569 if (n < 0) |
578 if (n == SOCKET_ERROR) |
570 handleSocketError(env, WSAGetLastError()); |
579 handleSocketError(env, WSAGetLastError()); |
571 } |
580 } |
572 |
581 |
573 JNIEXPORT jint JNICALL |
582 JNIEXPORT jint JNICALL |
574 Java_sun_nio_ch_Net_joinOrDrop4(JNIEnv *env, jobject this, jboolean join, jobject fdo, |
583 Java_sun_nio_ch_Net_joinOrDrop4(JNIEnv *env, jobject this, jboolean join, jobject fdo, |
593 optval = (void*)&mreq_source; |
602 optval = (void*)&mreq_source; |
594 optlen = sizeof(mreq_source); |
603 optlen = sizeof(mreq_source); |
595 } |
604 } |
596 |
605 |
597 n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, optval, optlen); |
606 n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, optval, optlen); |
598 if (n < 0) { |
607 if (n == SOCKET_ERROR) { |
599 if (join && (WSAGetLastError() == WSAENOPROTOOPT)) |
608 if (join && (WSAGetLastError() == WSAENOPROTOOPT)) |
600 return IOS_UNAVAILABLE; |
609 return IOS_UNAVAILABLE; |
601 handleSocketError(env, WSAGetLastError()); |
610 handleSocketError(env, WSAGetLastError()); |
602 } |
611 } |
603 return 0; |
612 return 0; |
615 mreq_source.imr_sourceaddr.s_addr = htonl(source); |
624 mreq_source.imr_sourceaddr.s_addr = htonl(source); |
616 mreq_source.imr_interface.s_addr = htonl(interf); |
625 mreq_source.imr_interface.s_addr = htonl(interf); |
617 |
626 |
618 n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, |
627 n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, |
619 (void*)&mreq_source, sizeof(mreq_source)); |
628 (void*)&mreq_source, sizeof(mreq_source)); |
620 if (n < 0) { |
629 if (n == SOCKET_ERROR) { |
621 if (block && (WSAGetLastError() == WSAENOPROTOOPT)) |
630 if (block && (WSAGetLastError() == WSAENOPROTOOPT)) |
622 return IOS_UNAVAILABLE; |
631 return IOS_UNAVAILABLE; |
623 handleSocketError(env, WSAGetLastError()); |
632 handleSocketError(env, WSAGetLastError()); |
624 } |
633 } |
625 return 0; |
634 return 0; |
670 } else { |
679 } else { |
671 int opt = (join) ? MCAST_JOIN_SOURCE_GROUP : MCAST_LEAVE_SOURCE_GROUP; |
680 int opt = (join) ? MCAST_JOIN_SOURCE_GROUP : MCAST_LEAVE_SOURCE_GROUP; |
672 n = setGroupSourceReqOption(env, fdo, opt, group, index, source); |
681 n = setGroupSourceReqOption(env, fdo, opt, group, index, source); |
673 } |
682 } |
674 |
683 |
675 if (n < 0) { |
684 if (n == SOCKET_ERROR) { |
676 handleSocketError(env, errno); |
685 handleSocketError(env, WSAGetLastError()); |
677 } |
686 } |
678 return 0; |
687 return 0; |
679 } |
688 } |
680 |
689 |
681 JNIEXPORT jint JNICALL |
690 JNIEXPORT jint JNICALL |
682 Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, jobject fdo, |
691 Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, jobject fdo, |
683 jbyteArray group, jint index, jbyteArray source) |
692 jbyteArray group, jint index, jbyteArray source) |
684 { |
693 { |
685 int opt = (block) ? MCAST_BLOCK_SOURCE : MCAST_UNBLOCK_SOURCE; |
694 int opt = (block) ? MCAST_BLOCK_SOURCE : MCAST_UNBLOCK_SOURCE; |
686 int n = setGroupSourceReqOption(env, fdo, opt, group, index, source); |
695 int n = setGroupSourceReqOption(env, fdo, opt, group, index, source); |
687 if (n < 0) { |
696 if (n == SOCKET_ERROR) { |
688 handleSocketError(env, errno); |
697 handleSocketError(env, WSAGetLastError()); |
689 } |
698 } |
690 return 0; |
699 return 0; |
691 } |
700 } |
692 |
701 |
693 JNIEXPORT void JNICALL |
702 JNIEXPORT void JNICALL |
699 |
708 |
700 in.s_addr = htonl(interf); |
709 in.s_addr = htonl(interf); |
701 |
710 |
702 n = setsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF, |
711 n = setsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF, |
703 (void*)&(in.s_addr), arglen); |
712 (void*)&(in.s_addr), arglen); |
704 if (n < 0) { |
713 if (n == SOCKET_ERROR) { |
705 handleSocketError(env, WSAGetLastError()); |
714 handleSocketError(env, WSAGetLastError()); |
706 } |
715 } |
707 } |
716 } |
708 |
717 |
709 JNIEXPORT jint JNICALL |
718 JNIEXPORT jint JNICALL |
712 struct in_addr in; |
721 struct in_addr in; |
713 int arglen = sizeof(struct in_addr); |
722 int arglen = sizeof(struct in_addr); |
714 int n; |
723 int n; |
715 |
724 |
716 n = getsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF, (void*)&in, &arglen); |
725 n = getsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF, (void*)&in, &arglen); |
717 if (n < 0) { |
726 if (n == SOCKET_ERROR) { |
718 handleSocketError(env, WSAGetLastError()); |
727 handleSocketError(env, WSAGetLastError()); |
719 return IOS_THROWN; |
728 return IOS_THROWN; |
720 } |
729 } |
721 return ntohl(in.s_addr); |
730 return ntohl(in.s_addr); |
722 } |
731 } |
723 |
732 |
724 JNIEXPORT void JNICALL |
733 JNIEXPORT void JNICALL |
725 Java_sun_nio_ch_Net_setInterface6(JNIEnv* env, jobject this, jobject fdo, jint index) |
734 Java_sun_nio_ch_Net_setInterface6(JNIEnv* env, jobject this, jobject fdo, jint index) |
726 { |
735 { |
727 int value = (jint)index; |
736 DWORD value = (jint)index; |
728 int arglen = sizeof(value); |
737 int arglen = sizeof(value); |
729 int n; |
738 int n; |
730 |
739 |
731 n = setsockopt(fdval(env, fdo), IPPROTO_IPV6, IPV6_MULTICAST_IF, |
740 n = setsockopt(fdval(env, fdo), IPPROTO_IPV6, IPV6_MULTICAST_IF, |
732 (void*)&(index), arglen); |
741 (void*)&(index), arglen); |
733 if (n < 0) { |
742 if (n == SOCKET_ERROR) { |
734 handleSocketError(env, errno); |
743 handleSocketError(env, WSAGetLastError()); |
735 } |
744 } |
736 } |
745 } |
737 |
746 |
738 JNIEXPORT jint JNICALL |
747 JNIEXPORT jint JNICALL |
739 Java_sun_nio_ch_Net_getInterface6(JNIEnv* env, jobject this, jobject fdo) |
748 Java_sun_nio_ch_Net_getInterface6(JNIEnv* env, jobject this, jobject fdo) |
740 { |
749 { |
741 int index; |
750 DWORD index; |
742 int arglen = sizeof(index); |
751 int arglen = sizeof(index); |
743 int n; |
752 int n; |
744 |
753 |
745 n = getsockopt(fdval(env, fdo), IPPROTO_IPV6, IPV6_MULTICAST_IF, (void*)&index, &arglen); |
754 n = getsockopt(fdval(env, fdo), IPPROTO_IPV6, IPV6_MULTICAST_IF, (void*)&index, &arglen); |
746 if (n < 0) { |
755 if (n == SOCKET_ERROR) { |
747 handleSocketError(env, errno); |
756 handleSocketError(env, WSAGetLastError()); |
748 return -1; |
757 return -1; |
749 } |
758 } |
750 return (jint)index; |
759 return (jint)index; |
751 } |
760 } |
752 |
761 |