LocalServerSocket.java revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpackage android.net; 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.IOException; 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.FileDescriptor; 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/** 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * non-standard class for creating inbound UNIX-domain socket 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * on the Android platform, this is created in the Linux non-filesystem 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * namespace. 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * On simulator platforms, this may be created in a temporary directory on 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * the filesystem 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic class LocalServerSocket { 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent private final LocalSocketImpl impl; 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final LocalSocketAddress localAddress; 337562408b2261d38415453378b6188f74fda99d88Mathias Agopian 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 50 seems a bit much, but it's what was here */ 357562408b2261d38415453378b6188f74fda99d88Mathias Agopian private static final int LISTEN_BACKLOG = 50; 367562408b2261d38415453378b6188f74fda99d88Mathias Agopian 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 3838ccae2c0324daa305f3fe77d25fdf5edec0b0e1Eric Laurent * Crewates a new server socket listening at specified name. 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * On the Android platform, the name is created in the Linux 4064760240f931714858a59c1579f07264d7182ba2Dima Zavin * abstract namespace (instead of on the filesystem). 41fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin * 42fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin * @param name address for socket 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @throws IOException 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public LocalServerSocket(String name) throws IOException 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 4715304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl = new LocalSocketImpl(); 4815304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 4915304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl.create(true); 5015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 5115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh localAddress = new LocalSocketAddress(name); 5215304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl.bind(localAddress); 5315304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 5415304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl.listen(LISTEN_BACKLOG); 5515304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh } 5615304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 5715304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh /** 5815304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * Create a LocalServerSocket from a file descriptor that's already 5915304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * been created and bound. listen() will be called immediately on it. 6015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * Used for cases where file descriptors are passed in via environment 6115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * variables 6215304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * 6315304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * @param fd bound file descriptor 6415304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * @throws IOException 6515304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh */ 6615304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh public LocalServerSocket(FileDescriptor fd) throws IOException 6715304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh { 6815304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl = new LocalSocketImpl(fd); 6915304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh impl.listen(LISTEN_BACKLOG); 7015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh localAddress = impl.getSockAddress(); 7115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh } 72fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 73671a636931295d9c33ffca74551a804479d01241Eric Laurent /** 7415304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * Obtains the socket's local address 7515304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * 7615304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * @return local address 7715304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh */ 7815304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh public LocalSocketAddress getLocalSocketAddress() 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return localAddress; 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent /** 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Accepts a new connection to the socket. Blocks until a new 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * connection arrives. 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @return a socket representing the new connection. 88f5879c1448cc6aebc51b26d3ec2399d66144f8f4Eric Laurent * @throws IOException 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public LocalSocket accept() throws IOException 910d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi { 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LocalSocketImpl acceptedImpl = new LocalSocketImpl(); 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project impl.accept (acceptedImpl); 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 96be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return new LocalSocket(acceptedImpl); 97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 98be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 1000d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi * Returns file descriptor or null if not yet open/already closed 101be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent * 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @return fd or null 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public FileDescriptor getFileDescriptor() { 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return impl.getFileDescriptor(); 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Closes server socket. 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @throws IOException 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public void close() throws IOException 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project impl.close(); 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project