Index: runtime/bin/socket.cc |
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
index ea5154e271ab6cc7c175881431985959a2c84c89..250f78403e837c31f7d221109535cd6778424449 100644 |
--- a/runtime/bin/socket.cc |
+++ b/runtime/bin/socket.cc |
@@ -45,10 +45,14 @@ Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
RawAddr addr, |
intptr_t backlog, |
bool v6_only, |
- bool shared) { |
+ bool shared, |
+ bool uds) { |
MutexLocker ml(ListeningSocketRegistry::mutex_); |
- intptr_t port = SocketAddress::GetAddrPort(addr); |
+ intptr_t port = -1; |
+ if (!uds) { |
+ port = SocketAddress::GetAddrPort(addr); |
+ } |
SocketsIterator it = sockets_by_port_.find(port); |
OSSocket *first_os_socket = NULL; |
@@ -95,8 +99,13 @@ Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
} |
// There is no socket listening on that (address, port), so we create new one. |
- intptr_t socketfd = ServerSocket::CreateBindListen(addr, backlog, v6_only); |
- if (socketfd == -5) { |
+ intptr_t socketfd; |
+ if (!uds) { |
+ socketfd = ServerSocket::CreateBindListen(addr, backlog, v6_only); |
+ } else { |
+ socketfd = ServerSocket::CreateBindListenUnix(addr, backlog); |
+ } |
+ if (!uds && socketfd == -5) { |
OSError os_error(-1, "Invalid host", OSError::kUnknown); |
return DartUtils::NewDartOSError(&os_error); |
} |
@@ -108,8 +117,11 @@ Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
OSError os_error(-1, "Failed to start accept", OSError::kUnknown); |
return DartUtils::NewDartOSError(&os_error); |
} |
- intptr_t allocated_port = Socket::GetPort(socketfd); |
- ASSERT(allocated_port > 0); |
+ intptr_t allocated_port = -1; |
+ if (!uds) { |
+ allocated_port = Socket::GetPort(socketfd); |
+ ASSERT(allocated_port > 0); |
+ } |
OSSocket *os_socket = |
new OSSocket(addr, allocated_port, v6_only, shared, socketfd); |
@@ -242,6 +254,23 @@ void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) { |
} |
+void FUNCTION_NAME(Socket_CreateConnectUnix)(Dart_NativeArguments args) { |
+ RawAddr addr; |
+ const char* path = |
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
+ addr.un.sun_family = AF_UNIX; |
+ snprintf(addr.un.sun_path, sizeof(addr.un.sun_path), "%s", path); |
+ intptr_t socket = Socket::CreateConnectUnix(addr); |
+ OSError error; |
+ if (socket >= 0) { |
+ Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
+ Dart_SetReturnValue(args, Dart_True()); |
+ } else { |
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
+ } |
+} |
+ |
+ |
void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { |
RawAddr addr; |
SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
@@ -483,20 +512,34 @@ void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { |
if (addr != NULL) { |
Dart_Handle list = Dart_NewList(2); |
- Dart_Handle entry = Dart_NewList(3); |
- Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); |
- Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); |
- |
- RawAddr raw = addr->addr(); |
- intptr_t data_length = SocketAddress::GetAddrLength(raw); |
- Dart_Handle data = Dart_NewTypedData(Dart_TypedData_kUint8, data_length); |
- Dart_ListSetAsBytes(data, 0, reinterpret_cast<uint8_t*>(&raw), data_length); |
- Dart_ListSetAt(entry, 2, data); |
- |
- Dart_ListSetAt(list, 0, entry); |
- Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
- Dart_SetReturnValue(args, list); |
- delete addr; |
+ int type = addr->GetType(); |
+ if (type == SocketAddress::TYPE_UNIX) { |
+ Dart_Handle entry = Dart_NewList(2); |
+ Dart_ListSetAt(entry, 0, Dart_NewInteger(type)); |
+ Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); |
+ Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
+ Dart_ListSetAt(list, 0, entry); |
+ Dart_SetReturnValue(args, list); |
+ delete addr; |
+ } else { |
+ ASSERT(type == SocketAddress::TYPE_IPV4 || |
+ type == SocketAddress::TYPE_IPV6); |
+ Dart_Handle entry = Dart_NewList(3); |
+ Dart_ListSetAt(entry, 0, Dart_NewInteger(type)); |
+ Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); |
+ |
+ RawAddr raw = addr->addr(); |
+ intptr_t data_length = SocketAddress::GetAddrLength(raw); |
+ Dart_Handle data = Dart_NewTypedData(Dart_TypedData_kUint8, data_length); |
+ Dart_ListSetAsBytes( |
+ data, 0, reinterpret_cast<uint8_t*>(&raw), data_length); |
+ Dart_ListSetAt(entry, 2, data); |
+ |
+ Dart_ListSetAt(list, 0, entry); |
+ Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
+ Dart_SetReturnValue(args, list); |
+ delete addr; |
+ } |
} else { |
Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
@@ -565,7 +608,27 @@ void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); |
Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( |
- socket_object, addr, backlog, v6_only, shared); |
+ socket_object, addr, backlog, v6_only, shared, false); |
+ Dart_SetReturnValue(args, result); |
+} |
+ |
+ |
+void FUNCTION_NAME(ServerSocket_CreateBindListenUnix)( |
+ Dart_NativeArguments args) { |
+ RawAddr addr; |
+ const char* path = |
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
+ addr.un.sun_family = AF_UNIX; |
+ snprintf(addr.un.sun_path, sizeof(addr.un.sun_path), "%s", path); |
+ int64_t backlog = DartUtils::GetInt64ValueCheckRange( |
+ Dart_GetNativeArgument(args, 2), |
+ 0, |
+ 65535); |
+ bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); |
+ |
+ Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); |
+ Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( |
+ socket_object, addr, backlog, false, shared, true); |
Dart_SetReturnValue(args, result); |
} |