151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
3519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.nio.ch;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.*;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.*;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.*;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedExceptionAction;
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Make a socket channel look like a socket.
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski//
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// The only aspects of java.net.Socket-hood that we don't attempt to emulate
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// here are the interrupted-I/O exceptions (which our Solaris implementations
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// attempt to support) and the sending of urgent data.  Otherwise an adapted
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// socket should look enough like a real java.net.Socket to fool most of the
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// developers most of the time, right down to the exception message strings.
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski//
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// The methods in this class are defined in exactly the same order as in
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// java.net.Socket so as to simplify tracking future changes to that class.
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski//
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class SocketAdaptor
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    extends Socket
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // The channel being adapted
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final SocketChannelImpl sc;
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Timeout "option" value for reads
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private volatile int timeout = 0;
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private SocketAdaptor(SocketChannelImpl sc) throws SocketException {
601cb7758226b1bd3c8f39d9adb9068b02a18fcc7cKenny Root        super(new FileDescriptorHolderSocketImpl(sc.getFD()));
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.sc = sc;
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Socket create(SocketChannelImpl sc) {
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return new SocketAdaptor(sc);
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (SocketException e) {
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new InternalError("Should not reach here");
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public SocketChannel getChannel() {
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sc;
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Override this method just to protect against changes in the superclass
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void connect(SocketAddress remote) throws IOException {
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        connect(remote, 0);
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void connect(SocketAddress remote, int timeout) throws IOException {
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (remote == null)
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("connect: The address can't be null");
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (timeout < 0)
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("connect: timeout can't be negative");
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (sc.blockingLock()) {
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (!sc.isBlocking())
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                throw new IllegalBlockingModeException();
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (timeout == 0) {
952808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                    // Android-changed: Be consistent
962808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                    try {
972808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                        sc.connect(remote);
982808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                    } catch (Exception ex) {
992808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                        Net.translateException(ex);
1002808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                    }
1012808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return;
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                sc.configureBlocking(false);
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (sc.connect(remote))
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        return;
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    long to = timeout;
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    for (;;) {
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (!sc.isOpen())
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            throw new ClosedChannelException();
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        long st = System.currentTimeMillis();
114519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera
115519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera                        int result = sc.poll(Net.POLLCONN, to);
116519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera                        if (result > 0 && sc.finishConnect())
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break;
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        to -= System.currentTimeMillis() - st;
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (to <= 0) {
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            try {
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                sc.close();
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            } catch (IOException x) { }
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            throw new SocketTimeoutException();
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } finally {
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (sc.isOpen())
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        sc.configureBlocking(true);
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (Exception x) {
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                Net.translateException(x, true);
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void bind(SocketAddress local) throws IOException {
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sc.bind(local);
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (Exception x) {
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateException(x);
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public InetAddress getInetAddress() {
147e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        // Use #remoteAddress and do manual isConnected check. #getRemoteAddress() returns
148e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        // non-null result before connection.
149e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        if (!isConnected()) {
150e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak            return null;
151e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        }
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SocketAddress remote = sc.remoteAddress();
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (remote == null) {
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return null;
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return ((InetSocketAddress)remote).getAddress();
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public InetAddress getLocalAddress() {
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sc.isOpen()) {
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            InetSocketAddress local = sc.localAddress();
163519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera            if (local != null) {
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return Net.getRevealedLocalAddress(local).getAddress();
165519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera            }
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new InetSocketAddress(0).getAddress();
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getPort() {
171e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        // Use #remoteAddress and do manual isConnected check. #getRemoteAddress() returns
172e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        // non-null result before connection.
173e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        if (!isConnected()) {
174e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak          return 0;
175e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak        }
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SocketAddress remote = sc.remoteAddress();
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (remote == null) {
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return 0;
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return ((InetSocketAddress)remote).getPort();
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getLocalPort() {
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SocketAddress local = sc.localAddress();
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (local == null) {
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return -1;
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return ((InetSocketAddress)local).getPort();
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private class SocketInputStream
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        extends ChannelInputStream
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        private SocketInputStream() {
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            super(sc);
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        protected int read(ByteBuffer bb)
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throws IOException
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        {
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            synchronized (sc.blockingLock()) {
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (!sc.isBlocking())
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    throw new IllegalBlockingModeException();
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (timeout == 0)
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return sc.read(bb);
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                sc.configureBlocking(false);
209519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
211519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera                    int n;
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if ((n = sc.read(bb)) != 0)
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        return n;
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    long to = timeout;
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    for (;;) {
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (!sc.isOpen())
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            throw new ClosedChannelException();
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        long st = System.currentTimeMillis();
219519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera                        int result = sc.poll(Net.POLLIN, to);
220519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera                        if (result > 0) {
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            if ((n = sc.read(bb)) != 0)
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                return n;
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        to -= System.currentTimeMillis() - st;
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (to <= 0)
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            throw new SocketTimeoutException();
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } finally {
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (sc.isOpen())
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        sc.configureBlocking(true);
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private InputStream socketInputStream = null;
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public InputStream getInputStream() throws IOException {
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isOpen())
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket is closed");
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isConnected())
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket is not connected");
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isInputOpen())
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket input is shutdown");
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (socketInputStream == null) {
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                socketInputStream = AccessController.doPrivileged(
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    new PrivilegedExceptionAction<InputStream>() {
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        public InputStream run() throws IOException {
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            return new SocketInputStream();
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    });
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (java.security.PrivilegedActionException e) {
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                throw (IOException)e.getException();
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return socketInputStream;
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public OutputStream getOutputStream() throws IOException {
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isOpen())
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket is closed");
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isConnected())
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket is not connected");
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!sc.isOutputOpen())
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SocketException("Socket output is shutdown");
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        OutputStream os = null;
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            os = AccessController.doPrivileged(
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                new PrivilegedExceptionAction<OutputStream>() {
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    public OutputStream run() throws IOException {
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        return Channels.newOutputStream(sc);
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                });
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (java.security.PrivilegedActionException e) {
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw (IOException)e.getException();
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return os;
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void setBooleanOption(SocketOption<Boolean> name, boolean value)
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SocketException
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sc.setOption(name, value);
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateToSocketException(x);
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void setIntOption(SocketOption<Integer> name, int value)
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SocketException
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sc.setOption(name, value);
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateToSocketException(x);
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean getBooleanOption(SocketOption<Boolean> name) throws SocketException {
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return sc.getOption(name).booleanValue();
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateToSocketException(x);
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;       // keep compiler happy
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int getIntOption(SocketOption<Integer> name) throws SocketException {
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return sc.getOption(name).intValue();
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (IOException x) {
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateToSocketException(x);
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return -1;          // keep compiler happy
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setTcpNoDelay(boolean on) throws SocketException {
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setBooleanOption(StandardSocketOptions.TCP_NODELAY, on);
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean getTcpNoDelay() throws SocketException {
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getBooleanOption(StandardSocketOptions.TCP_NODELAY);
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSoLinger(boolean on, int linger) throws SocketException {
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!on)
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            linger = -1;
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setIntOption(StandardSocketOptions.SO_LINGER, linger);
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getSoLinger() throws SocketException {
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getIntOption(StandardSocketOptions.SO_LINGER);
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void sendUrgentData(int data) throws IOException {
339519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera        int n = sc.sendOutOfBandData((byte) data);
340519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera        if (n == 0)
341519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera            throw new IOException("Socket buffer full");
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setOOBInline(boolean on) throws SocketException {
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setBooleanOption(ExtendedSocketOption.SO_OOBINLINE, on);
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean getOOBInline() throws SocketException {
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getBooleanOption(ExtendedSocketOption.SO_OOBINLINE);
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSoTimeout(int timeout) throws SocketException {
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (timeout < 0)
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("timeout can't be negative");
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.timeout = timeout;
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getSoTimeout() throws SocketException {
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return timeout;
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSendBufferSize(int size) throws SocketException {
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // size 0 valid for SocketChannel, invalid for Socket
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (size <= 0)
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Invalid send size");
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setIntOption(StandardSocketOptions.SO_SNDBUF, size);
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getSendBufferSize() throws SocketException {
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getIntOption(StandardSocketOptions.SO_SNDBUF);
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setReceiveBufferSize(int size) throws SocketException {
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // size 0 valid for SocketChannel, invalid for Socket
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (size <= 0)
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Invalid receive size");
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setIntOption(StandardSocketOptions.SO_RCVBUF, size);
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getReceiveBufferSize() throws SocketException {
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getIntOption(StandardSocketOptions.SO_RCVBUF);
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setKeepAlive(boolean on) throws SocketException {
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setBooleanOption(StandardSocketOptions.SO_KEEPALIVE, on);
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean getKeepAlive() throws SocketException {
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getBooleanOption(StandardSocketOptions.SO_KEEPALIVE);
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setTrafficClass(int tc) throws SocketException {
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setIntOption(StandardSocketOptions.IP_TOS, tc);
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getTrafficClass() throws SocketException {
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getIntOption(StandardSocketOptions.IP_TOS);
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setReuseAddress(boolean on) throws SocketException {
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean getReuseAddress() throws SocketException {
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void close() throws IOException {
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sc.close();
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void shutdownInput() throws IOException {
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sc.shutdownInput();
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (Exception x) {
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateException(x);
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void shutdownOutput() throws IOException {
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sc.shutdownOutput();
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (Exception x) {
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Net.translateException(x);
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sc.isConnected())
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return "Socket[addr=" + getInetAddress() +
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ",port=" + getPort() +
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ",localport=" + getLocalPort() + "]";
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return "Socket[unconnected]";
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isConnected() {
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sc.isConnected();
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isBound() {
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sc.localAddress() != null;
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isClosed() {
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return !sc.isOpen();
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isInputShutdown() {
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return !sc.isInputOpen();
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isOutputShutdown() {
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return !sc.isOutputOpen();
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45662098900d7201b01db7905a8ff1debea4b639a30Yi Kong    /*
45762098900d7201b01db7905a8ff1debea4b639a30Yi Kong     * Android-added: for testing and internal use.
45862098900d7201b01db7905a8ff1debea4b639a30Yi Kong     */
45948c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath    @Override
46048c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath    public FileDescriptor getFileDescriptor$() {
46148c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath        return sc.getFD();
46248c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath    }
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
464