Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: runtime/bin/socket.cc

Issue 1293533002: DO NOT SUBMIT: Unix domain sockets. From CL 1061283003. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Added Mac OS fix Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_linux.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698