19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.SocketOptions; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Socket implementation used for android.net.LocalSocket and 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.net.LocalServerSocket. Supports only AF_LOCAL sockets. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass LocalSocketImpl 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SocketInputStream fis; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SocketOutputStream fos; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Object readMonitor = new Object(); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Object writeMonitor = new Object(); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** null if closed or not yet created */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private FileDescriptor fd; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These fields are accessed by native code; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** file descriptor array received during a previous read */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] inboundFileDescriptors; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** file descriptor array that should be written during next write */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] outboundFileDescriptors; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An input stream for local sockets. Needed because we may 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to read ancillary data. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SocketInputStream extends InputStream { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int available() throws IOException { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return available_native(fd); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LocalSocketImpl.this.close(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read() throws IOException { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ret; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (readMonitor) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = read_native(myFd); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b) throws IOException { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return read(b, 0, b.length); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b, int off, int len) throws IOException { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (readMonitor) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || len < 0 || (off + len) > b.length ) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ret = readba_native(b, off, len, myFd); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An output stream for local sockets. Needed because we may 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to read ancillary data. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SocketOutputStream extends OutputStream { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LocalSocketImpl.this.close(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (byte[] b) throws IOException { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write(b, 0, b.length); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (byte[] b, int off, int len) throws IOException { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (writeMonitor) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || len < 0 || (off + len) > b.length ) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeba_native(b, off, len, myFd); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (int b) throws IOException { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (writeMonitor) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write_native(b, myFd); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int available_native(FileDescriptor fd) throws IOException; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void close_native(FileDescriptor fd) throws IOException; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int read_native(FileDescriptor fd) throws IOException; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int readba_native(byte[] b, int off, int len, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void writeba_native(byte[] b, int off, int len, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void write_native(int b, FileDescriptor fd) 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void connectLocal(FileDescriptor fd, String name, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int namespace) throws IOException; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void bindLocal(FileDescriptor fd, String name, int namespace) 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native FileDescriptor create_native(boolean stream) 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void listen_native(FileDescriptor fd, int backlog) 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void shutdown(FileDescriptor fd, boolean shutdownInput); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native Credentials getPeerCredentials_native( 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int getOption_native(FileDescriptor fd, int optID) 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void setOption_native(FileDescriptor fd, int optID, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int b, int value) throws IOException; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// private native LocalSocketAddress getSockName_native 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// (FileDescriptor fd) throws IOException; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accepts a connection on a server socket. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd file descriptor of server socket 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s socket implementation that will become the new socket 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return file descriptor of new socket 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native FileDescriptor accept 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (FileDescriptor fd, LocalSocketImpl s) throws IOException; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new instance. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ LocalSocketImpl() 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new instance from a file descriptor representing 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a bound socket. The state of the file descriptor is not checked here 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the caller can verify socket state by calling listen(). 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd non-null; bound file descriptor 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ LocalSocketImpl(FileDescriptor fd) throws IOException 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.fd = fd; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.toString() + " fd:" + fd; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a socket in the underlying OS. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stream true if this should be a stream socket, false for 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * datagram. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void create (boolean stream) throws IOException { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no error if socket already created 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need this for LocalServerSocket.accept() 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = create_native(stream); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Closes the socket. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (LocalSocketImpl.this) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) return; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close_native(fd); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = null; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** note timeout presently ignored */ 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void connect(LocalSocketAddress address, int timeout) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectLocal(fd, address.getName(), address.getNamespace().getId()); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binds this socket to an endpoint name. May only be called on an instance 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has not yet been bound. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endpoint endpoint address 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void bind(LocalSocketAddress endpoint) throws IOException 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindLocal(fd, endpoint.getName(), endpoint.getNamespace().getId()); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void listen(int backlog) throws IOException 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listen_native(fd, backlog); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accepts a new connection to the socket. Blocks until a new 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection arrives. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s a socket that will be used to represent the new connection. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void accept(LocalSocketImpl s) throws IOException 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.fd = accept(fd, s); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the input stream for this instance. 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return input stream 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected InputStream getInputStream() throws IOException 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fis == null) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fis = new SocketInputStream(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fis; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the output stream for this instance. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return output stream 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected OutputStream getOutputStream() throws IOException 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fos == null) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fos = new SocketOutputStream(); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of bytes available for reading without blocking. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return >= 0 count bytes available 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int available() throws IOException 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getInputStream().available(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the input side of the socket. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void shutdownInput() throws IOException 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shutdown(fd, true); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the output side of the socket. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void shutdownOutput() throws IOException 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shutdown(fd, false); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FileDescriptor getFileDescriptor() 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean supportsUrgentData() 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void sendUrgentData(int data) throws IOException 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException ("not impled"); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getOption(int optID) throws IOException 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (optID == SocketOptions.SO_TIMEOUT) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = getOption_native(fd, optID); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (optID) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_RCVBUF: 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_SNDBUF: 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_REUSEADDR: 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOption(int optID, Object value) 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Boolean.FALSE is used to disable some options, so it 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is important to distinguish between FALSE and unset. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We define it here that -1 is unset, 0 is FALSE, and 1 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is TRUE. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int boolValue = -1; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int intValue = 0; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Integer) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intValue = (Integer)value; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (value instanceof Boolean) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolValue = ((Boolean) value)? 1 : 0; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("bad value: " + value); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOption_native(fd, optID, boolValue, intValue); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueues a set of file descriptors to send to the peer. The queue 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is one deep. The file descriptors will be sent with the next write 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of normal data, and will be delivered in a single ancillary message. 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See "man 7 unix" SCM_RIGHTS on a desktop Linux machine. 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fds non-null; file descriptors to send. 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFileDescriptorsForSend(FileDescriptor[] fds) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(writeMonitor) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outboundFileDescriptors = fds; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves a set of file descriptors that a peer has sent through 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an ancillary message. This method retrieves the most recent set sent, 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then returns null until a new set arrives. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File descriptors may only be passed along with regular data, so this 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method can only return a non-null after a read operation. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return null or file descriptor array 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileDescriptor[] getAncillaryFileDescriptors() throws IOException { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(readMonitor) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] result = inboundFileDescriptors; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inboundFileDescriptors = null; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the credentials of this socket's peer. Only valid on 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected sockets. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-null; peer credentials 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Credentials getPeerCredentials() throws IOException 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getPeerCredentials_native(fd); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the socket name from the OS. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-null; socket name 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException on failure 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LocalSocketAddress getSockAddress() throws IOException 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //TODO implement this 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return getSockName_native(fd); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws IOException { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 491