summaryrefslogtreecommitdiff
path: root/external/ikvm/runtime/openjdk/sun.nio.ch.cs
diff options
context:
space:
mode:
Diffstat (limited to 'external/ikvm/runtime/openjdk/sun.nio.ch.cs')
-rw-r--r--external/ikvm/runtime/openjdk/sun.nio.ch.cs39
1 files changed, 32 insertions, 7 deletions
diff --git a/external/ikvm/runtime/openjdk/sun.nio.ch.cs b/external/ikvm/runtime/openjdk/sun.nio.ch.cs
index c13544934e..7b5258fa99 100644
--- a/external/ikvm/runtime/openjdk/sun.nio.ch.cs
+++ b/external/ikvm/runtime/openjdk/sun.nio.ch.cs
@@ -34,7 +34,7 @@ static class Java_sun_nio_ch_DatagramChannelImpl
{
}
- public static void disconnect0(FileDescriptor fd)
+ public static void disconnect0(FileDescriptor fd, bool isIPv6)
{
#if !FIRST_PASS
try
@@ -120,15 +120,14 @@ static class Java_sun_nio_ch_DatagramChannelImpl
#endif
}
- public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, object sa)
+ public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, InetAddress addr, int port)
{
#if FIRST_PASS
return 0;
#else
- java.net.InetSocketAddress addr = (java.net.InetSocketAddress)sa;
try
{
- return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr.getAddress(), preferIPv6), addr.getPort()));
+ return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port));
}
catch (System.Net.Sockets.SocketException x)
{
@@ -409,7 +408,14 @@ namespace IKVM.NativeCode.sun.nio.ch
}
catch (System.Net.Sockets.SocketException x)
{
- throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+ if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK)
+ {
+ count = 0;
+ }
+ else
+ {
+ throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+ }
}
catch (ObjectDisposedException)
{
@@ -469,7 +475,14 @@ namespace IKVM.NativeCode.sun.nio.ch
}
catch (System.Net.Sockets.SocketException x)
{
- throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+ if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK)
+ {
+ count = 0;
+ }
+ else
+ {
+ throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+ }
}
catch (ObjectDisposedException)
{
@@ -507,6 +520,13 @@ namespace IKVM.NativeCode.sun.nio.ch
&& Environment.OSVersion.Version.Major >= 6;
}
+ public static int isExclusiveBindAvailable()
+ {
+ return Environment.OSVersion.Platform == PlatformID.Win32NT
+ ? Environment.OSVersion.Version.Major >= 6 ? 1 : 0
+ : -1;
+ }
+
public static bool canIPv6SocketJoinIPv4Group0()
{
return false;
@@ -971,11 +991,16 @@ namespace IKVM.NativeCode.sun.nio.ch
#endif
}
- public static void bind0(bool preferIPv6, FileDescriptor fd, InetAddress addr, int port)
+ public static void bind0(FileDescriptor fd, bool preferIPv6, bool useExclBind, InetAddress addr, int port)
{
#if !FIRST_PASS
try
{
+ if (useExclBind)
+ {
+ // TODO enable this after we merge OpenJDK 7u40
+ //global::java.net.net_util_md.setExclusiveBind(fd.getSocket());
+ }
fd.getSocket().Bind(new System.Net.IPEndPoint(global::java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port));
}
catch (System.Net.Sockets.SocketException x)