From 7fd724611b8113c7f584c603d14fd44071cad799 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Fri, 6 Jan 2017 11:29:15 +0000 Subject: Refactor RFCOMM / BluetoothSocket usage of LocalSocket LocalSocket is used by BluetoothSocket. BluetoothSocket passes a pre-created file descriptor to LocalSocket that is then given to the LocalSocketImpl. Commit b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3e broke the behavior. Commit 7a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587 put in a minimal fix. This change tidies up LocalSocket and associated classes and replaces a specialist constructor with a factory method to highlight the special case. While there an unnecessary exception has been removed. Bug: 34111534 Test: Boot device Test: vogar --mode app_process tests/tests/net/src/android/net/cts/LocalSocketTest.java Change-Id: I4ba2f2d9ea361a950ff8bc8d64fc800d998c3210 --- core/java/android/bluetooth/BluetoothSocket.java | 10 +++---- core/java/android/net/LocalServerSocket.java | 2 +- core/java/android/net/LocalSocket.java | 34 ++++++++++++++---------- core/java/android/net/LocalSocketImpl.java | 2 +- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index b68693880acf..98a5341b3025 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -243,7 +243,7 @@ public final class BluetoothSocket implements Closeable { } as.mPfd = new ParcelFileDescriptor(fds[0]); - as.mSocket = new LocalSocket(fds[0]); + as.mSocket = LocalSocket.createConnectedLocalSocket(fds[0]); as.mSocketIS = as.mSocket.getInputStream(); as.mSocketOS = as.mSocket.getOutputStream(); as.mAddress = RemoteAddr; @@ -367,7 +367,7 @@ public final class BluetoothSocket implements Closeable { if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed"); if (mPfd == null) throw new IOException("bt socket connect failed"); FileDescriptor fd = mPfd.getFileDescriptor(); - mSocket = new LocalSocket(fd); + mSocket = LocalSocket.createConnectedLocalSocket(fd); mSocketIS = mSocket.getInputStream(); mSocketOS = mSocket.getOutputStream(); } @@ -416,9 +416,9 @@ public final class BluetoothSocket implements Closeable { if(mSocketState != SocketState.INIT) return EBADFD; if(mPfd == null) return -1; FileDescriptor fd = mPfd.getFileDescriptor(); - if (DBG) Log.d(TAG, "bindListen(), new LocalSocket "); - mSocket = new LocalSocket(fd); - if (DBG) Log.d(TAG, "bindListen(), new LocalSocket.getInputStream() "); + if (DBG) Log.d(TAG, "bindListen(), Create LocalSocket"); + mSocket = LocalSocket.createConnectedLocalSocket(fd); + if (DBG) Log.d(TAG, "bindListen(), new LocalSocket.getInputStream()"); mSocketIS = mSocket.getInputStream(); mSocketOS = mSocket.getOutputStream(); } diff --git a/core/java/android/net/LocalServerSocket.java b/core/java/android/net/LocalServerSocket.java index e1eaf00d0f20..3fcde33071e9 100644 --- a/core/java/android/net/LocalServerSocket.java +++ b/core/java/android/net/LocalServerSocket.java @@ -89,7 +89,7 @@ public class LocalServerSocket { impl.accept(acceptedImpl); - return LocalSocket.createLocalSocketForAccept(acceptedImpl, LocalSocket.SOCKET_UNKNOWN); + return LocalSocket.createLocalSocketForAccept(acceptedImpl); } /** diff --git a/core/java/android/net/LocalSocket.java b/core/java/android/net/LocalSocket.java index d9ad74beb016..8afa1ed3e4a5 100644 --- a/core/java/android/net/LocalSocket.java +++ b/core/java/android/net/LocalSocket.java @@ -31,6 +31,7 @@ import java.net.SocketOptions; public class LocalSocket implements Closeable { private final LocalSocketImpl impl; + /** false if impl.create() needs to be called */ private volatile boolean implCreated; private LocalSocketAddress localAddress; private boolean isBound; @@ -61,19 +62,6 @@ public class LocalSocket implements Closeable { */ public LocalSocket(int sockType) { this(new LocalSocketImpl(), sockType); - isBound = false; - isConnected = false; - } - - /** - * Creates a AF_LOCAL/UNIX domain stream socket with FileDescriptor. - * @hide - */ - public LocalSocket(FileDescriptor fd) throws IOException { - this(new LocalSocketImpl(fd), SOCKET_UNKNOWN); - isBound = true; - isConnected = true; - implCreated = true; } private LocalSocket(LocalSocketImpl impl, int sockType) { @@ -83,10 +71,28 @@ public class LocalSocket implements Closeable { this.isBound = false; } + /** + * Creates a LocalSocket instances using the FileDescriptor for an already-connected + * AF_LOCAL/UNIX domain stream socket. Note: the FileDescriptor must be closed by the caller: + * closing the LocalSocket will not close it. + * + * @hide - used by BluetoothSocket. + */ + public static LocalSocket createConnectedLocalSocket(FileDescriptor fd) { + return createConnectedLocalSocket(new LocalSocketImpl(fd), SOCKET_UNKNOWN); + } + /** * for use with LocalServerSocket.accept() */ - static LocalSocket createLocalSocketForAccept(LocalSocketImpl impl, int sockType) { + static LocalSocket createLocalSocketForAccept(LocalSocketImpl impl) { + return createConnectedLocalSocket(impl, SOCKET_UNKNOWN); + } + + /** + * Creates a LocalSocket from an existing LocalSocketImpl that is already connected. + */ + private static LocalSocket createConnectedLocalSocket(LocalSocketImpl impl, int sockType) { LocalSocket socket = new LocalSocket(impl, sockType); socket.isConnected = true; socket.isBound = true; diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java index d8f782115cf8..05c8afb358b0 100644 --- a/core/java/android/net/LocalSocketImpl.java +++ b/core/java/android/net/LocalSocketImpl.java @@ -218,7 +218,7 @@ class LocalSocketImpl * * @param fd non-null; bound file descriptor */ - /*package*/ LocalSocketImpl(FileDescriptor fd) throws IOException + /*package*/ LocalSocketImpl(FileDescriptor fd) { this.fd = fd; } -- cgit v1.2.3-59-g8ed1b