| 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);
|
| }
|
|
|
|
|