summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@google.com>2013-07-19 17:38:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-07-19 17:39:28 +0000
commit757ec7837db85eae675cda5cfaf94040268327fd (patch)
tree991bc319605a4def26ae54ba62112de9088dd57d
parent94edfc99c8cd28db28e26aec6bb8300e59ad29db (diff)
parente7d309a929bf87a5752cd1fb2d48c72e47a671a2 (diff)
downloadframeworks_base-757ec7837db85eae675cda5cfaf94040268327fd.zip
frameworks_base-757ec7837db85eae675cda5cfaf94040268327fd.tar.gz
frameworks_base-757ec7837db85eae675cda5cfaf94040268327fd.tar.bz2
Merge "LocalSocket: Add support for SOCK_DGRAM and SOCK_SEQPACKET"
-rw-r--r--api/current.txt4
-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
-rw-r--r--core/jni/android_net_LocalSocketImpl.cpp48
5 files changed, 63 insertions, 62 deletions
diff --git a/api/current.txt b/api/current.txt
index 8188988..e7a518f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -13468,6 +13468,7 @@ package android.net {
public class LocalSocket implements java.io.Closeable {
ctor public LocalSocket();
+ ctor public LocalSocket(int);
method public void bind(android.net.LocalSocketAddress) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public void connect(android.net.LocalSocketAddress) throws java.io.IOException;
@@ -13493,6 +13494,9 @@ package android.net {
method public void setSoTimeout(int) throws java.io.IOException;
method public void shutdownInput() throws java.io.IOException;
method public void shutdownOutput() throws java.io.IOException;
+ field public static final int SOCKET_DGRAM = 1; // 0x1
+ field public static final int SOCKET_SEQPACKET = 3; // 0x3
+ field public static final int SOCKET_STREAM = 2; // 0x2
}
public class LocalSocketAddress {
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;
}
}
diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp
index f2b69c6..b9ed28e 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -44,26 +44,6 @@ static jclass class_Credentials;
static jclass class_FileDescriptor;
static jmethodID method_CredentialsInit;
-/*
- * private native FileDescriptor
- * create_native(boolean stream)
- * throws IOException;
- */
-static jobject
-socket_create (JNIEnv *env, jobject object, jboolean stream)
-{
- int ret;
-
- ret = socket(PF_LOCAL, stream ? SOCK_STREAM : SOCK_DGRAM, 0);
-
- if (ret < 0) {
- jniThrowIOException(env, errno);
- return NULL;
- }
-
- return jniCreateFileDescriptor(env,ret);
-}
-
/* private native void connectLocal(FileDescriptor fd,
* String name, int namespace) throws IOException
*/
@@ -445,32 +425,6 @@ static jint socket_available (JNIEnv *env, jobject object,
#endif
}
-static void socket_close (JNIEnv *env, jobject object, jobject fileDescriptor)
-{
- int fd;
- int err;
-
- if (fileDescriptor == NULL) {
- jniThrowNullPointerException(env, NULL);
- return;
- }
-
- fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
-
- if (env->ExceptionOccurred() != NULL) {
- return;
- }
-
- do {
- err = close(fd);
- } while (err < 0 && errno == EINTR);
-
- if (err < 0) {
- jniThrowIOException(env, errno);
- return;
- }
-}
-
/**
* Processes ancillary data, handling only
* SCM_RIGHTS. Creates appropriate objects and sets appropriate
@@ -909,7 +863,6 @@ static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{"getOption_native", "(Ljava/io/FileDescriptor;I)I", (void*)socket_getOption},
{"setOption_native", "(Ljava/io/FileDescriptor;III)V", (void*)socket_setOption},
- {"create_native", "(Z)Ljava/io/FileDescriptor;", (void*)socket_create},
{"connectLocal", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V",
(void*)socket_connect_local},
{"bindLocal", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V", (void*)socket_bind_local},
@@ -918,7 +871,6 @@ static JNINativeMethod gMethods[] = {
{"shutdown", "(Ljava/io/FileDescriptor;Z)V", (void*)socket_shutdown},
{"available_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_available},
{"pending_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_pending},
- {"close_native", "(Ljava/io/FileDescriptor;)V", (void*) socket_close},
{"read_native", "(Ljava/io/FileDescriptor;)I", (void*) socket_read},
{"readba_native", "([BIILjava/io/FileDescriptor;)I", (void*) socket_readba},
{"writeba_native", "([BIILjava/io/FileDescriptor;)V", (void*) socket_writeba},