summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/net/LocalServerSocket.java4
-rw-r--r--core/java/android/net/LocalSocket.java30
-rw-r--r--core/java/android/net/LocalSocketImpl.java39
3 files changed, 59 insertions, 14 deletions
diff --git a/core/java/android/net/LocalServerSocket.java b/core/java/android/net/LocalServerSocket.java
index 2b93fc2..a36203b 100644
--- a/core/java/android/net/LocalServerSocket.java
+++ b/core/java/android/net/LocalServerSocket.java
@@ -46,7 +46,7 @@ public class LocalServerSocket {
{
impl = new LocalSocketImpl();
- impl.create(true);
+ impl.create(LocalSocket.SOCKET_STREAM);
localAddress = new LocalSocketAddress(name);
impl.bind(localAddress);
@@ -93,7 +93,7 @@ public class LocalServerSocket {
impl.accept (acceptedImpl);
- return new LocalSocket(acceptedImpl);
+ return new LocalSocket(acceptedImpl, LocalSocket.SOCKET_UNKNOWN);
}
/**
diff --git a/core/java/android/net/LocalSocket.java b/core/java/android/net/LocalSocket.java
index 14a8094..31bc20b 100644
--- a/core/java/android/net/LocalSocket.java
+++ b/core/java/android/net/LocalSocket.java
@@ -34,21 +34,42 @@ public class LocalSocket implements Closeable {
private LocalSocketAddress localAddress;
private boolean isBound;
private boolean isConnected;
+ private final int sockType;
+
+ /** unknown socket type (used for constructor with existing file descriptor) */
+ /* package */ static final int SOCKET_UNKNOWN = 0;
+ /** Datagram socket type */
+ public static final int SOCKET_DGRAM = 1;
+ /** Stream socket type */
+ public static final int SOCKET_STREAM = 2;
+ /** Sequential packet socket type */
+ public static final int SOCKET_SEQPACKET = 3;
/**
* Creates a AF_LOCAL/UNIX domain stream socket.
*/
public LocalSocket() {
- this(new LocalSocketImpl());
+ this(SOCKET_STREAM);
+ }
+
+ /**
+ * Creates a AF_LOCAL/UNIX domain stream socket with given socket type
+ *
+ * @param sockType either {@link #SOCKET_DGRAM}, {@link #SOCKET_STREAM}
+ * or {@link #SOCKET_SEQPACKET}
+ */
+ 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));
+ this(new LocalSocketImpl(fd), SOCKET_UNKNOWN);
isBound = true;
isConnected = true;
}
@@ -57,8 +78,9 @@ public class LocalSocket implements Closeable {
* for use with AndroidServerSocket
* @param impl a SocketImpl
*/
- /*package*/ LocalSocket(LocalSocketImpl impl) {
+ /*package*/ LocalSocket(LocalSocketImpl impl, int sockType) {
this.impl = impl;
+ this.sockType = sockType;
this.isConnected = false;
this.isBound = false;
}
@@ -81,7 +103,7 @@ public class LocalSocket implements Closeable {
synchronized (this) {
if (!implCreated) {
try {
- impl.create(true);
+ impl.create(sockType);
} finally {
implCreated = true;
}
diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java
index 3b43c36..fa3cf58 100644
--- a/core/java/android/net/LocalSocketImpl.java
+++ b/core/java/android/net/LocalSocketImpl.java
@@ -22,6 +22,10 @@ import java.io.InputStream;
import java.io.FileDescriptor;
import java.net.SocketOptions;
+import libcore.io.ErrnoException;
+import libcore.io.Libcore;
+import libcore.io.OsConstants;
+
/**
* Socket implementation used for android.net.LocalSocket and
* android.net.LocalServerSocket. Supports only AF_LOCAL sockets.
@@ -159,7 +163,6 @@ class LocalSocketImpl
private native int pending_native(FileDescriptor fd) throws IOException;
private native int available_native(FileDescriptor fd) throws IOException;
- private native void close_native(FileDescriptor fd) throws IOException;
private native int read_native(FileDescriptor fd) throws IOException;
private native int readba_native(byte[] b, int off, int len,
FileDescriptor fd) throws IOException;
@@ -171,8 +174,6 @@ class LocalSocketImpl
int namespace) throws IOException;
private native void bindLocal(FileDescriptor fd, String name, int namespace)
throws IOException;
- private native FileDescriptor create_native(boolean stream)
- throws IOException;
private native void listen_native(FileDescriptor fd, int backlog)
throws IOException;
private native void shutdown(FileDescriptor fd, boolean shutdownInput);
@@ -222,15 +223,33 @@ class LocalSocketImpl
/**
* Creates a socket in the underlying OS.
*
- * @param stream true if this should be a stream socket, false for
- * datagram.
+ * @param sockType either {@link LocalSocket#SOCKET_DGRAM}, {@link LocalSocket#SOCKET_STREAM}
+ * or {@link LocalSocket#SOCKET_SEQPACKET}
* @throws IOException
*/
- public void create (boolean stream) throws IOException {
+ public void create (int sockType) throws IOException {
// no error if socket already created
// need this for LocalServerSocket.accept()
if (fd == null) {
- fd = create_native(stream);
+ int osType;
+ switch (sockType) {
+ case LocalSocket.SOCKET_DGRAM:
+ osType = OsConstants.SOCK_DGRAM;
+ break;
+ case LocalSocket.SOCKET_STREAM:
+ osType = OsConstants.SOCK_STREAM;
+ break;
+ case LocalSocket.SOCKET_SEQPACKET:
+ osType = OsConstants.SOCK_SEQPACKET;
+ break;
+ default:
+ throw new IllegalStateException("unknown sockType");
+ }
+ try {
+ fd = Libcore.os.socket(OsConstants.AF_UNIX, osType, 0);
+ } catch (ErrnoException e) {
+ e.rethrowAsIOException();
+ }
}
}
@@ -242,7 +261,11 @@ class LocalSocketImpl
public void close() throws IOException {
synchronized (LocalSocketImpl.this) {
if (fd == null) return;
- close_native(fd);
+ try {
+ Libcore.os.close(fd);
+ } catch (ErrnoException e) {
+ e.rethrowAsIOException();
+ }
fd = null;
}
}