< prev index next >

src/java.base/share/classes/sun/nio/ch/Net.java

Print this page
rev 55750 : UDS support, temporary commit

@@ -36,10 +36,11 @@
 import java.net.SocketAddress;
 import java.net.SocketException;
 import java.net.SocketOption;
 import java.net.StandardProtocolFamily;
 import java.net.StandardSocketOptions;
+import java.net.UnixSocketAddress;
 import java.net.UnknownHostException;
 import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.NotYetBoundException;
 import java.nio.channels.NotYetConnectedException;

@@ -437,23 +438,47 @@
     static FileDescriptor socket(boolean stream) throws IOException {
         return socket(UNSPEC, stream);
     }
 
     static FileDescriptor socket(ProtocolFamily family, boolean stream) throws IOException {
+        if (family == StandardProtocolFamily.UNIX) {
+            return IOUtil.newFD(socket1(stream));
+        } else {
         boolean preferIPv6 = isIPv6Available() &&
             (family != StandardProtocolFamily.INET);
         return IOUtil.newFD(socket0(preferIPv6, stream, false, fastLoopback));
     }
+    }
+
+    static FileDescriptor serverSocket(boolean stream, ProtocolFamily family) {
+        if (family == StandardProtocolFamily.UNIX) {
+            return IOUtil.newFD(socket1(stream));
+        } else {
+            return serverSocket(stream);
+        }
+    }
 
     static FileDescriptor serverSocket(boolean stream) {
         return IOUtil.newFD(socket0(isIPv6Available(), stream, true, fastLoopback));
     }
 
     // Due to oddities SO_REUSEADDR on windows reuse is ignored
     private static native int socket0(boolean preferIPv6, boolean stream, boolean reuse,
                                       boolean fastLoopback);
 
+    // TODO: rename, refactor, support maybe also SOCK_SEQPACKET, support reuse (delete socket file if exists)?
+    private static native int socket1(boolean stream);
+
+    public static void bind(FileDescriptor fd, UnixSocketAddress addr)
+        throws IOException
+    {
+        bind1(fd, addr.getPathBytes());
+    }
+    
+    // TODO: rename, UnixSocketAddress object instead of byte array?
+    private static native void bind1(FileDescriptor fd, byte[] addr) throws IOException;
+    
     public static void bind(FileDescriptor fd, InetAddress addr, int port)
         throws IOException
     {
         bind(UNSPEC, fd, addr, port);
     }

@@ -480,10 +505,16 @@
         throws IOException
     {
         return connect(UNSPEC, fd, remote, remotePort);
     }
 
+    static int connect(FileDescriptor fd, UnixSocketAddress remote)
+        throws IOException
+    {
+        return connect1(fd, remote.getPathBytes());
+    }
+
     static int connect(ProtocolFamily family, FileDescriptor fd, InetAddress remote, int remotePort)
         throws IOException
     {
         if (remote.isLinkLocalAddress()) {
             remote = IPAddressUtil.toScopedAddress(remote);

@@ -497,13 +528,29 @@
                                        FileDescriptor fd,
                                        InetAddress remote,
                                        int remotePort)
         throws IOException;
 
-    public static native int accept(FileDescriptor fd,
+    private static native int connect1(FileDescriptor fd, byte[] remote)
+        throws IOException;
+
+    public static int accept(FileDescriptor fd,
                                     FileDescriptor newfd,
                                     InetSocketAddress[] isaa)
+        throws IOException {
+        
+        SocketAddress[] array = new SocketAddress[isaa.length];
+        int result = accept(fd, newfd, array);
+        for (int i = 0; i < isaa.length; i++) {
+            isaa[i] = (InetSocketAddress) array[i];
+        }
+        return result;
+    }
+    
+    public static native int accept(FileDescriptor fd,
+                                    FileDescriptor newfd,
+                                    SocketAddress[] isaa)
         throws IOException;
 
     public static final int SHUT_RD = 0;
     public static final int SHUT_WR = 1;
     public static final int SHUT_RDWR = 2;

@@ -520,10 +567,13 @@
         throws IOException
     {
         return new InetSocketAddress(localInetAddress(fd), localPort(fd));
     }
 
+    public static native SocketAddress localSocketAddress(FileDescriptor fd)
+        throws IOException;
+    
     private static native int remotePort(FileDescriptor fd)
         throws IOException;
 
     private static native InetAddress remoteInetAddress(FileDescriptor fd)
         throws IOException;
< prev index next >