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) {
|