changeset 1359:3cd694b8289b

Fix JCK issues with NIO2. 2009-01-27 Andrew John Hughes <ahughes@redhat.com> * patches/icedtea-nio2.patch: (mapfile-linux): Add new functions in sun.nio.ch.Net. (Net.java:setIntOption0(FileDescriptor,boolean,int,int,int)): Renamed to... (Net.java:setIntOption1(FileDescriptor,boolean,int,int,int)): to avoid C collision. (Net.c): Add back java_net_SocketOptions.h, bind0 and connect0 and setIntOption0 and rename existing setIntOption0 to setIntOption1.
author Andrew John Hughes <ahughes@redhat.com>
date Tue, 03 Feb 2009 12:02:53 +0000
parents 945a4627e256
children 12c4111a284c
files ChangeLog patches/icedtea-nio2.patch
diffstat 2 files changed, 122 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Jan 28 00:27:48 2009 +0000
+++ b/ChangeLog	Tue Feb 03 12:02:53 2009 +0000
@@ -1,3 +1,12 @@
+2009-01-27  Andrew John Hughes  <ahughes@redhat.com>
+
+	* patches/icedtea-nio2.patch:
+	(mapfile-linux): Add new functions in sun.nio.ch.Net.
+	(Net.java:setIntOption0(FileDescriptor,boolean,int,int,int)): Renamed to...
+	(Net.java:setIntOption1(FileDescriptor,boolean,int,int,int)): to avoid C collision.
+	(Net.c): Add back java_net_SocketOptions.h, bind0 and connect0 and setIntOption0
+	and rename existing setIntOption0 to setIntOption1.
+	
 2009-01-27  Andrew John Hughes  <ahughes@redhat.com>
 
 	* overlays/nio2/openjdk/jdk/src/share/classes/org/classpath/icedtea/java/nio/channels/FileChannel.java:
--- a/patches/icedtea-nio2.patch	Wed Jan 28 00:27:48 2009 +0000
+++ b/patches/icedtea-nio2.patch	Tue Feb 03 12:02:53 2009 +0000
@@ -601,7 +601,7 @@
  .PHONY: sources
 diff -Nru openjdk.orig/jdk/make/java/nio/mapfile-linux openjdk/jdk/make/java/nio/mapfile-linux
 --- openjdk.orig/jdk/make/java/nio/mapfile-linux	2009-01-07 22:08:47.000000000 +0000
-+++ openjdk/jdk/make/java/nio/mapfile-linux	2009-01-07 22:15:04.000000000 +0000
++++ openjdk/jdk/make/java/nio/mapfile-linux	2009-01-29 01:13:17.000000000 +0000
 @@ -20,6 +20,14 @@
  		Java_sun_nio_ch_EPollArrayWrapper_interrupt;
  		Java_sun_nio_ch_EPollArrayWrapper_offsetofData;
@@ -617,7 +617,32 @@
                  Java_sun_nio_ch_FileChannelImpl_close0;
                  Java_sun_nio_ch_FileChannelImpl_force0;
                  Java_sun_nio_ch_FileChannelImpl_initIDs;
-@@ -75,6 +83,74 @@
+@@ -63,11 +71,24 @@
+ 		Java_sun_nio_ch_Net_socket0;
+ 		Java_sun_nio_ch_Net_bind;
+ 		Java_sun_nio_ch_Net_connect;
++		Java_sun_nio_ch_Net_bind0;
++		Java_sun_nio_ch_Net_connect0;
++		Java_sun_nio_ch_Net_listen;
+ 		Java_sun_nio_ch_Net_localPort;
+ 		Java_sun_nio_ch_Net_localInetAddress;
+ 		Java_sun_nio_ch_Net_getIntOption0;
+ 		Java_sun_nio_ch_Net_setIntOption0;
+                 Java_sun_nio_ch_Net_initIDs;
++		Java_sun_nio_ch_Net_isIPv6Available0;
++		Java_sun_nio_ch_Net_joinOrDrop4;
++		Java_sun_nio_ch_Net_blockOrUnblock4;
++		Java_sun_nio_ch_Net_joinOrDrop6;
++		Java_sun_nio_ch_Net_blockOrUnblock6;
++		Java_sun_nio_ch_Net_setInterface4;
++		Java_sun_nio_ch_Net_getInterface4;
++		Java_sun_nio_ch_Net_setInterface6;
++		Java_sun_nio_ch_Net_getInterface6;
++		Java_sun_nio_ch_Net_shutdown;
+                 Java_sun_nio_ch_PollArrayWrapper_interrupt;
+                 Java_sun_nio_ch_PollArrayWrapper_poll0;
+                 Java_sun_nio_ch_ServerSocketChannelImpl_accept0;
+@@ -75,6 +96,74 @@
  		Java_sun_nio_ch_ServerSocketChannelImpl_listen;
                  Java_sun_nio_ch_SocketChannelImpl_checkConnect;
  		Java_sun_nio_ch_SocketChannelImpl_shutdown;
@@ -1423,7 +1448,7 @@
          int rv = -1;
 diff -Nru openjdk.orig/jdk/src/share/classes/sun/nio/ch/Net.java openjdk/jdk/src/share/classes/sun/nio/ch/Net.java
 --- openjdk.orig/jdk/src/share/classes/sun/nio/ch/Net.java	2009-01-15 17:37:33.000000000 +0000
-+++ openjdk/jdk/src/share/classes/sun/nio/ch/Net.java	2009-01-19 23:21:37.000000000 +0000
++++ openjdk/jdk/src/share/classes/sun/nio/ch/Net.java	2009-02-01 00:35:31.000000000 +0000
 @@ -30,6 +30,15 @@
  import java.net.*;
  import java.nio.channels.*;
@@ -1537,7 +1562,7 @@
 +        }
 +
 +        boolean mayNeedConversion = (family == UNSPEC);
-+        setIntOption0(fd, mayNeedConversion, key.level(), key.name(), arg);
++        setIntOption1(fd, mayNeedConversion, key.level(), key.name(), arg);
 +    }
 +
 +    static Object getSocketOption(FileDescriptor fd, ProtocolFamily family,
@@ -1569,7 +1594,7 @@
 +                                            int level, int opt)
 +        throws IOException;
 +
-+    private static native void setIntOption0(FileDescriptor fd, boolean mayNeedConversion,
++    private static native void setIntOption1(FileDescriptor fd, boolean mayNeedConversion,
 +                                             int level, int opt, int arg)
 +        throws IOException;
 +
@@ -1920,7 +1945,7 @@
  
 diff -Nru openjdk.orig/jdk/src/solaris/native/sun/nio/ch/Net.c openjdk/jdk/src/solaris/native/sun/nio/ch/Net.c
 --- openjdk.orig/jdk/src/solaris/native/sun/nio/ch/Net.c	2009-01-26 20:51:08.000000000 +0000
-+++ openjdk/jdk/src/solaris/native/sun/nio/ch/Net.c	2009-01-26 20:55:17.000000000 +0000
++++ openjdk/jdk/src/solaris/native/sun/nio/ch/Net.c	2009-02-01 01:24:41.000000000 +0000
 @@ -1,5 +1,5 @@
  /*
 - * Copyright 2001-2007 Sun Microsystems, Inc.  All Rights Reserved.
@@ -1928,11 +1953,8 @@
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
-@@ -37,61 +37,171 @@
- #include "net_util.h"
- #include "net_util_md.h"
- #include "nio_util.h"
--#include "java_net_SocketOptions.h"
+@@ -40,58 +40,169 @@
+ #include "java_net_SocketOptions.h"
  #include "nio.h"
  
 -#ifdef __linux__
@@ -1943,12 +1965,12 @@
 + */
 +
 +#ifdef __solaris__
++
++#ifndef IP_BLOCK_SOURCE
  
 -#define IPV6_MULTICAST_IF 17
 -#ifndef SO_BSDCOMPAT
 -#define SO_BSDCOMPAT  14
-+#ifndef IP_BLOCK_SOURCE
-+
 +#define IP_BLOCK_SOURCE                 0x15
 +#define IP_UNBLOCK_SOURCE               0x16
 +#define IP_ADD_SOURCE_MEMBERSHIP        0x17
@@ -2108,19 +2130,19 @@
  JNIEXPORT void JNICALL
 -Java_sun_nio_ch_Net_bind(JNIEnv *env, jclass clazz, /* ## Needs rest of PSI gunk */
 -                         jobject fdo, jobject ia, int port)
-+Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jboolean preferIPv6,
-+                          jobject fdo, jobject iao, int port)
++Java_sun_nio_ch_Net_bind(JNIEnv *env, jclass clazz, 
++			 jobject fdo, jobject iao, int port)
  {
      SOCKADDR sa;
      int sa_len = SOCKADDR_LEN;
      int rv = 0;
  
 -    if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) {
-+    if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
++    if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, JNI_TRUE) != 0) {
        return;
      }
  
-@@ -101,27 +211,27 @@
+@@ -101,26 +212,53 @@
      }
  }
  
@@ -2135,8 +2157,9 @@
 -Java_sun_nio_ch_Net_connect(JNIEnv *env, jclass clazz,
 -                                jobject fdo, jobject iao, jint port,
 -                                jint trafficClass)
-+Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6,
-+                             jobject fdo, jobject iao, jint port)
++Java_sun_nio_ch_Net_connect(JNIEnv *env, jclass clazz, 
++			    jobject fdo, jobject iao, jint port,
++			    jint trafficClass)
  {
      SOCKADDR sa;
      int sa_len = SOCKADDR_LEN;
@@ -2144,7 +2167,7 @@
  
 -    if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *) &sa, &sa_len, JNI_TRUE) != 0) {
 +    if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *) &sa,
-+                                  &sa_len, preferIPv6) != 0)
++                                  &sa_len, JNI_TRUE) != 0)
 +    {
        return IOS_THROWN;
      }
@@ -2153,14 +2176,37 @@
 -#if 0
 -    if (trafficClass != 0 && ipv6_available()) { /* ## FIX */
 -        NET_SetTrafficClass((struct sockaddr *)&sa, trafficClass);
--    }
++    rv = connect(fdval(env, fdo), (struct sockaddr *)&sa, sa_len);
++    if (rv != 0) {
++        if (errno == EINPROGRESS) {
++            return IOS_UNAVAILABLE;
++        } else if (errno == EINTR) {
++            return IOS_INTERRUPTED;
++        }
++        return handleSocketError(env, errno);
++    }
++    return 1;
++}
++
++JNIEXPORT jint JNICALL
++Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6,
++                             jobject fdo, jobject iao, jint port)
++{
++    SOCKADDR sa;
++    int sa_len = SOCKADDR_LEN;
++    int rv;
++
++    if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *) &sa,
++                                  &sa_len, preferIPv6) != 0)
++    {
++      return IOS_THROWN;
+     }
 -#endif
 -#endif
--
+ 
      rv = connect(fdval(env, fdo), (struct sockaddr *)&sa, sa_len);
      if (rv != 0) {
-         if (errno == EINPROGRESS) {
-@@ -138,7 +248,7 @@
+@@ -138,7 +276,7 @@
  Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
  {
      SOCKADDR sa;
@@ -2169,7 +2215,7 @@
      if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
          handleSocketError(env, errno);
          return -1;
-@@ -150,7 +260,7 @@
+@@ -150,7 +288,7 @@
  Java_sun_nio_ch_Net_localInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
  {
      SOCKADDR sa;
@@ -2178,7 +2224,7 @@
      int port;
      if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
          handleSocketError(env, errno);
-@@ -159,119 +269,79 @@
+@@ -159,119 +297,115 @@
      return NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
  }
  
@@ -2308,12 +2354,46 @@
  }
  
  JNIEXPORT void JNICALL
--Java_sun_nio_ch_Net_setIntOption0(JNIEnv *env, jclass clazz,
--                                  jobject fdo, jint opt, jint arg)
-+Java_sun_nio_ch_Net_setIntOption0(JNIEnv *env, jclass clazz, jobject fdo,
-+                                  jboolean mayNeedConversion, jint level, jint opt, jint arg)
+ Java_sun_nio_ch_Net_setIntOption0(JNIEnv *env, jclass clazz,
+                                   jobject fdo, jint opt, jint arg)
  {
 -    int klevel, kopt;
++  int klevel, kopt;
++  int result;
++  struct linger linger;
++  void *parg;
++  int arglen;
++ 
++  if (NET_MapSocketOption(opt, &klevel, &kopt) < 0) {
++    JNU_ThrowByNameWithLastError(env,
++				 JNU_JAVANETPKG "SocketException",
++				 "Unsupported socket option");
++    return;
++  }
++ 
++  if (opt == java_net_SocketOptions_SO_LINGER) {
++    parg = (void *)&linger;
++    arglen = sizeof(linger);
++    if (arg >= 0) {
++             linger.l_onoff = 0;
++             linger.l_linger = 0;
++         }
++    } else {
++        parg = (void *)&arg;
++        arglen = sizeof(arg);
++     }
++ 
++    if (NET_SetSockOpt(fdval(env, fdo), klevel, kopt, parg, arglen) < 0) {
++      JNU_ThrowByNameWithLastError(env,
++				   JNU_JAVANETPKG "SocketException",
++				   "sun.nio.ch.Net.setIntOption");
++    }
++}
++
++JNIEXPORT void JNICALL
++Java_sun_nio_ch_Net_setIntOption1(JNIEnv *env, jclass clazz, jobject fdo,
++                                  jboolean mayNeedConversion, jint level, jint opt, jint arg)
++{
      int result;
      struct linger linger;
 +    u_char carg;
@@ -2343,7 +2423,7 @@
          parg = (void *)&linger;
          arglen = sizeof(linger);
          if (arg >= 0) {
-@@ -281,19 +351,199 @@
+@@ -281,19 +415,199 @@
              linger.l_onoff = 0;
              linger.l_linger = 0;
          }
@@ -2475,7 +2555,7 @@
 +    }
 +    return 0;
 +}
- 
++
 +JNIEXPORT void JNICALL
 +Java_sun_nio_ch_Net_setInterface4(JNIEnv* env, jobject this, jobject fdo, jint interf)
 +{
@@ -2535,7 +2615,7 @@
 +    }
 +    return (jint)index;
 +}
-+
+ 
 +JNIEXPORT void JNICALL
 +Java_sun_nio_ch_Net_shutdown(JNIEnv *env, jclass cl, jobject fdo, jint jhow)
 +{