src/java.base/windows/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59004 84e08e00c29c
parent 58981 5c79956cc7d7
parent 59000 612c58965775
child 59018 6d621f34e24a
equal deleted inserted replaced
59003:aaba7cc40951 59004:84e08e00c29c
   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