< prev index next >

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

Print this page
rev 54103 : imported patch ipv6-only-build


 188 #else
 189     return JNI_FALSE;
 190 #endif
 191 }
 192 
 193 JNIEXPORT jint JNICALL
 194 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
 195                             jboolean stream, jboolean reuse, jboolean ignored)
 196 {
 197     int fd;
 198     int type = (stream ? SOCK_STREAM : SOCK_DGRAM);
 199     int domain = (ipv6_available() && preferIPv6) ? AF_INET6 : AF_INET;
 200 
 201     fd = socket(domain, type, 0);
 202     if (fd < 0) {
 203         return handleSocketError(env, errno);
 204     }
 205 
 206     /* Disable IPV6_V6ONLY to ensure dual-socket support */
 207     if (domain == AF_INET6) {
 208         int arg = 0;
 209         if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
 210                        sizeof(int)) < 0) {
 211             JNU_ThrowByNameWithLastError(env,
 212                                          JNU_JAVANETPKG "SocketException",
 213                                          "Unable to set IPV6_V6ONLY");
 214             close(fd);
 215             return -1;
 216         }
 217     }
 218 
 219     if (reuse) {
 220         int arg = 1;
 221         if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg,
 222                        sizeof(arg)) < 0) {
 223             JNU_ThrowByNameWithLastError(env,
 224                                          JNU_JAVANETPKG "SocketException",
 225                                          "Unable to set SO_REUSEADDR");
 226             close(fd);
 227             return -1;
 228         }




 188 #else
 189     return JNI_FALSE;
 190 #endif
 191 }
 192 
 193 JNIEXPORT jint JNICALL
 194 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
 195                             jboolean stream, jboolean reuse, jboolean ignored)
 196 {
 197     int fd;
 198     int type = (stream ? SOCK_STREAM : SOCK_DGRAM);
 199     int domain = (ipv6_available() && preferIPv6) ? AF_INET6 : AF_INET;
 200 
 201     fd = socket(domain, type, 0);
 202     if (fd < 0) {
 203         return handleSocketError(env, errno);
 204     }
 205 
 206     /* Disable IPV6_V6ONLY to ensure dual-socket support */
 207     if (domain == AF_INET6) {
 208         int arg = 1;    // V6 only
 209         if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
 210                        sizeof(int)) < 0) {
 211             JNU_ThrowByNameWithLastError(env,
 212                                          JNU_JAVANETPKG "SocketException",
 213                                          "Unable to set IPV6_V6ONLY");
 214             close(fd);
 215             return -1;
 216         }
 217     }
 218 
 219     if (reuse) {
 220         int arg = 1;
 221         if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg,
 222                        sizeof(arg)) < 0) {
 223             JNU_ThrowByNameWithLastError(env,
 224                                          JNU_JAVANETPKG "SocketException",
 225                                          "Unable to set SO_REUSEADDR");
 226             close(fd);
 227             return -1;
 228         }


< prev index next >