LocalSocketImpl.java revision e7d309a929bf87a5752cd1fb2d48c72e47a671a2
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 25e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwoodimport libcore.io.ErrnoException; 26e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwoodimport libcore.io.Libcore; 27e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwoodimport libcore.io.OsConstants; 28e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Socket implementation used for android.net.LocalSocket and 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.net.LocalServerSocket. Supports only AF_LOCAL sockets. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass LocalSocketImpl 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SocketInputStream fis; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SocketOutputStream fos; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Object readMonitor = new Object(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Object writeMonitor = new Object(); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** null if closed or not yet created */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private FileDescriptor fd; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These fields are accessed by native code; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** file descriptor array received during a previous read */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] inboundFileDescriptors; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** file descriptor array that should be written during next write */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] outboundFileDescriptors; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An input stream for local sockets. Needed because we may 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to read ancillary data. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SocketInputStream extends InputStream { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int available() throws IOException { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return available_native(fd); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LocalSocketImpl.this.close(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read() throws IOException { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ret; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (readMonitor) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = read_native(myFd); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b) throws IOException { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return read(b, 0, b.length); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int read(byte[] b, int off, int len) throws IOException { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (readMonitor) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || len < 0 || (off + len) > b.length ) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ret = readba_native(b, off, len, myFd); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An output stream for local sockets. Needed because we may 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to read ancillary data. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SocketOutputStream extends OutputStream { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LocalSocketImpl.this.close(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (byte[] b) throws IOException { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write(b, 0, b.length); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (byte[] b, int off, int len) throws IOException { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (writeMonitor) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || len < 0 || (off + len) > b.length ) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeba_native(b, off, len, myFd); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void write (int b) throws IOException { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (writeMonitor) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor myFd = fd; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myFd == null) throw new IOException("socket closed"); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project write_native(b, myFd); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14371bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy 14471bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy /** 14571bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy * Wait until the data in sending queue is emptied. A polling version 14671bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy * for flush implementation. 14771bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy * @throws IOException 14871bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy * if an i/o error occurs. 14971bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy */ 15071bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy @Override 15171bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy public void flush() throws IOException { 15271bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy FileDescriptor myFd = fd; 15371bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy if (myFd == null) throw new IOException("socket closed"); 154d073bfdb3a44f07ef5338306f9b9377532962290Matthew Xie while(pending_native(myFd) > 0) { 15571bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy try { 15671bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy Thread.sleep(10); 15771bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy } catch (InterruptedException ie) { 15871bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy return; 15971bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy } 16071bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy } 16171bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16471bfafc84af4b820748b12e1a1010b0dfa7bdea6zzy private native int pending_native(FileDescriptor fd) throws IOException; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int available_native(FileDescriptor fd) throws IOException; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int read_native(FileDescriptor fd) throws IOException; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int readba_native(byte[] b, int off, int len, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void writeba_native(byte[] b, int off, int len, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void write_native(int b, FileDescriptor fd) 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void connectLocal(FileDescriptor fd, String name, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int namespace) throws IOException; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void bindLocal(FileDescriptor fd, String name, int namespace) 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void listen_native(FileDescriptor fd, int backlog) 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void shutdown(FileDescriptor fd, boolean shutdownInput); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native Credentials getPeerCredentials_native( 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd) throws IOException; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int getOption_native(FileDescriptor fd, int optID) 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void setOption_native(FileDescriptor fd, int optID, 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int b, int value) throws IOException; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// private native LocalSocketAddress getSockName_native 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// (FileDescriptor fd) throws IOException; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accepts a connection on a server socket. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd file descriptor of server socket 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s socket implementation that will become the new socket 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return file descriptor of new socket 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native FileDescriptor accept 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (FileDescriptor fd, LocalSocketImpl s) throws IOException; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new instance. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ LocalSocketImpl() 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new instance from a file descriptor representing 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a bound socket. The state of the file descriptor is not checked here 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the caller can verify socket state by calling listen(). 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd non-null; bound file descriptor 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ LocalSocketImpl(FileDescriptor fd) throws IOException 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.fd = fd; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.toString() + " fd:" + fd; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a socket in the underlying OS. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 226e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * @param sockType either {@link LocalSocket#SOCKET_DGRAM}, {@link LocalSocket#SOCKET_STREAM} 227e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * or {@link LocalSocket#SOCKET_SEQPACKET} 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 230e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood public void create (int sockType) throws IOException { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no error if socket already created 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need this for LocalServerSocket.accept() 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 234e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood int osType; 235e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood switch (sockType) { 236e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood case LocalSocket.SOCKET_DGRAM: 237e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood osType = OsConstants.SOCK_DGRAM; 238e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood break; 239e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood case LocalSocket.SOCKET_STREAM: 240e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood osType = OsConstants.SOCK_STREAM; 241e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood break; 242e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood case LocalSocket.SOCKET_SEQPACKET: 243e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood osType = OsConstants.SOCK_SEQPACKET; 244e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood break; 245e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood default: 246e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood throw new IllegalStateException("unknown sockType"); 247e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } 248e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood try { 249e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood fd = Libcore.os.socket(OsConstants.AF_UNIX, osType, 0); 250e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } catch (ErrnoException e) { 251e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood e.rethrowAsIOException(); 252e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Closes the socket. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (LocalSocketImpl.this) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) return; 264e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood try { 265e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood Libcore.os.close(fd); 266e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } catch (ErrnoException e) { 267e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood e.rethrowAsIOException(); 268e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = null; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** note timeout presently ignored */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void connect(LocalSocketAddress address, int timeout) 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectLocal(fd, address.getName(), address.getNamespace().getId()); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binds this socket to an endpoint name. May only be called on an instance 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has not yet been bound. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endpoint endpoint address 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void bind(LocalSocketAddress endpoint) throws IOException 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindLocal(fd, endpoint.getName(), endpoint.getNamespace().getId()); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void listen(int backlog) throws IOException 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listen_native(fd, backlog); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Accepts a new connection to the socket. Blocks until a new 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection arrives. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s a socket that will be used to represent the new connection. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void accept(LocalSocketImpl s) throws IOException 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.fd = accept(fd, s); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the input stream for this instance. 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return input stream 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected InputStream getInputStream() throws IOException 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fis == null) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fis = new SocketInputStream(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fis; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the output stream for this instance. 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return output stream 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected OutputStream getOutputStream() throws IOException 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fos == null) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fos = new SocketOutputStream(); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of bytes available for reading without blocking. 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return >= 0 count bytes available 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int available() throws IOException 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getInputStream().available(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the input side of the socket. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void shutdownInput() throws IOException 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shutdown(fd, true); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the output side of the socket. 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void shutdownOutput() throws IOException 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shutdown(fd, false); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FileDescriptor getFileDescriptor() 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean supportsUrgentData() 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void sendUrgentData(int data) throws IOException 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException ("not impled"); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getOption(int optID) throws IOException 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (optID == SocketOptions.SO_TIMEOUT) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = getOption_native(fd, optID); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (optID) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_RCVBUF: 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_SNDBUF: 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SocketOptions.SO_REUSEADDR: 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOption(int optID, Object value) 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Boolean.FALSE is used to disable some options, so it 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is important to distinguish between FALSE and unset. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We define it here that -1 is unset, 0 is FALSE, and 1 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is TRUE. 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int boolValue = -1; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int intValue = 0; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == null) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("socket not created"); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Integer) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intValue = (Integer)value; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (value instanceof Boolean) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolValue = ((Boolean) value)? 1 : 0; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("bad value: " + value); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOption_native(fd, optID, boolValue, intValue); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueues a set of file descriptors to send to the peer. The queue 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is one deep. The file descriptors will be sent with the next write 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of normal data, and will be delivered in a single ancillary message. 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See "man 7 unix" SCM_RIGHTS on a desktop Linux machine. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fds non-null; file descriptors to send. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFileDescriptorsForSend(FileDescriptor[] fds) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(writeMonitor) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outboundFileDescriptors = fds; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves a set of file descriptors that a peer has sent through 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an ancillary message. This method retrieves the most recent set sent, 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then returns null until a new set arrives. 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File descriptors may only be passed along with regular data, so this 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method can only return a non-null after a read operation. 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return null or file descriptor array 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileDescriptor[] getAncillaryFileDescriptors() throws IOException { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(readMonitor) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor[] result = inboundFileDescriptors; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inboundFileDescriptors = null; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the credentials of this socket's peer. Only valid on 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected sockets. 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-null; peer credentials 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Credentials getPeerCredentials() throws IOException 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getPeerCredentials_native(fd); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the socket name from the OS. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-null; socket name 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException on failure 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LocalSocketAddress getSockAddress() throws IOException 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //TODO implement this 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return getSockName_native(fd); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws IOException { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 534