1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.net; 18 19 import java.io.IOException; 20 import java.io.FileDescriptor; 21 22 /** 23 * non-standard class for creating inbound UNIX-domain socket 24 * on the Android platform, this is created in the Linux non-filesystem 25 * namespace. 26 * 27 * On simulator platforms, this may be created in a temporary directory on 28 * the filesystem 29 */ 30 public class LocalServerSocket { 31 private final LocalSocketImpl impl; 32 private final LocalSocketAddress localAddress; 33 34 /** 50 seems a bit much, but it's what was here */ 35 private static final int LISTEN_BACKLOG = 50; 36 37 /** 38 * Crewates a new server socket listening at specified name. 39 * On the Android platform, the name is created in the Linux 40 * abstract namespace (instead of on the filesystem). 41 * 42 * @param name address for socket 43 * @throws IOException 44 */ 45 public LocalServerSocket(String name) throws IOException 46 { 47 impl = new LocalSocketImpl(); 48 49 impl.create(LocalSocket.SOCKET_STREAM); 50 51 localAddress = new LocalSocketAddress(name); 52 impl.bind(localAddress); 53 54 impl.listen(LISTEN_BACKLOG); 55 } 56 57 /** 58 * Create a LocalServerSocket from a file descriptor that's already 59 * been created and bound. listen() will be called immediately on it. 60 * Used for cases where file descriptors are passed in via environment 61 * variables 62 * 63 * @param fd bound file descriptor 64 * @throws IOException 65 */ 66 public LocalServerSocket(FileDescriptor fd) throws IOException 67 { 68 impl = new LocalSocketImpl(fd); 69 impl.listen(LISTEN_BACKLOG); 70 localAddress = impl.getSockAddress(); 71 } 72 73 /** 74 * Obtains the socket's local address 75 * 76 * @return local address 77 */ 78 public LocalSocketAddress getLocalSocketAddress() 79 { 80 return localAddress; 81 } 82 83 /** 84 * Accepts a new connection to the socket. Blocks until a new 85 * connection arrives. 86 * 87 * @return a socket representing the new connection. 88 * @throws IOException 89 */ 90 public LocalSocket accept() throws IOException 91 { 92 LocalSocketImpl acceptedImpl = new LocalSocketImpl(); 93 94 impl.accept (acceptedImpl); 95 96 return new LocalSocket(acceptedImpl, LocalSocket.SOCKET_UNKNOWN); 97 } 98 99 /** 100 * Returns file descriptor or null if not yet open/already closed 101 * 102 * @return fd or null 103 */ 104 public FileDescriptor getFileDescriptor() { 105 return impl.getFileDescriptor(); 106 } 107 108 /** 109 * Closes server socket. 110 * 111 * @throws IOException 112 */ 113 public void close() throws IOException 114 { 115 impl.close(); 116 } 117 } 118