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