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 }
|