< prev index next >

src/java.base/unix/native/libnio/ch/Net.c

Print this page




 186 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl)
 187 {
 188 #if defined(__APPLE__) || defined(_AIX)
 189     /* for now IPv6 sockets cannot join IPv4 multicast groups */
 190     return JNI_FALSE;
 191 #else
 192     return JNI_TRUE;
 193 #endif
 194 }
 195 
 196 JNIEXPORT jboolean JNICALL
 197 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
 198 {
 199 #ifdef __solaris__
 200     return JNI_TRUE;
 201 #else
 202     return JNI_FALSE;
 203 #endif
 204 }
 205 








 206 JNIEXPORT jint JNICALL
 207 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
 208                             jboolean stream, jboolean reuse, jboolean ignored)
 209 {
 210     int fd;
 211     int type = (stream ? SOCK_STREAM : SOCK_DGRAM);
 212     int domain = (ipv6_available() && preferIPv6) ? AF_INET6 : AF_INET;
 213 
 214     fd = socket(domain, type, 0);
 215     if (fd < 0) {
 216         return handleSocketError(env, errno);
 217     }
 218 
 219     /*
 220      * If IPv4 is available, disable IPV6_V6ONLY to ensure dual-socket support.
 221      */
 222     if (domain == AF_INET6 && ipv4_available()) {
 223         int arg = 0;
 224         if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
 225                        sizeof(int)) < 0) {
 226             JNU_ThrowByNameWithLastError(env,
 227                                          JNU_JAVANETPKG "SocketException",
 228                                          "Unable to set IPV6_V6ONLY");
 229             close(fd);
 230             return -1;
 231         }
 232     }
 233 
 234     if (reuse) {




 186 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl)
 187 {
 188 #if defined(__APPLE__) || defined(_AIX)
 189     /* for now IPv6 sockets cannot join IPv4 multicast groups */
 190     return JNI_FALSE;
 191 #else
 192     return JNI_TRUE;
 193 #endif
 194 }
 195 
 196 JNIEXPORT jboolean JNICALL
 197 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
 198 {
 199 #ifdef __solaris__
 200     return JNI_TRUE;
 201 #else
 202     return JNI_FALSE;
 203 #endif
 204 }
 205 
 206 static int socket0(int domain, int type, int protocol) {
 207     if (domain == AF_INET) {
 208         errno = EAFNOSUPPORT;
 209         return -1;
 210     }
 211     return socket(domain, type, protocol);
 212 }
 213 
 214 JNIEXPORT jint JNICALL
 215 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
 216                             jboolean stream, jboolean reuse, jboolean ignored)
 217 {
 218     int fd;
 219     int type = (stream ? SOCK_STREAM : SOCK_DGRAM);
 220     int domain = (ipv6_available() && preferIPv6) ? AF_INET6 : AF_INET;
 221 
 222     fd = socket0(domain, type, 0);
 223     if (fd < 0) {
 224         return handleSocketError(env, errno);
 225     }
 226 
 227     /*
 228      * If IPv4 is available, disable IPV6_V6ONLY to ensure dual-socket support.
 229      */
 230     if (domain == AF_INET6 && ipv4_available()) {
 231         int arg = 0;
 232         if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
 233                        sizeof(int)) < 0) {
 234             JNU_ThrowByNameWithLastError(env,
 235                                          JNU_JAVANETPKG "SocketException",
 236                                          "Unable to set IPV6_V6ONLY");
 237             close(fd);
 238             return -1;
 239         }
 240     }
 241 
 242     if (reuse) {


< prev index next >