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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_linux.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/io_buffer.h" 5 #include "bin/io_buffer.h"
6 #include "bin/isolate_data.h" 6 #include "bin/isolate_data.h"
7 #include "bin/dartutils.h" 7 #include "bin/dartutils.h"
8 #include "bin/socket.h" 8 #include "bin/socket.h"
9 #include "bin/thread.h" 9 #include "bin/thread.h"
10 #include "bin/lockers.h" 10 #include "bin/lockers.h"
(...skipping 27 matching lines...) Expand all
38 void ListeningSocketRegistry::Cleanup() { 38 void ListeningSocketRegistry::Cleanup() {
39 delete globalTcpListeningSocketRegistry; 39 delete globalTcpListeningSocketRegistry;
40 globalTcpListeningSocketRegistry = NULL; 40 globalTcpListeningSocketRegistry = NULL;
41 } 41 }
42 42
43 43
44 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, 44 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object,
45 RawAddr addr, 45 RawAddr addr,
46 intptr_t backlog, 46 intptr_t backlog,
47 bool v6_only, 47 bool v6_only,
48 bool shared) { 48 bool shared,
49 bool uds) {
49 MutexLocker ml(ListeningSocketRegistry::mutex_); 50 MutexLocker ml(ListeningSocketRegistry::mutex_);
50 51
51 intptr_t port = SocketAddress::GetAddrPort(addr); 52 intptr_t port = -1;
53 if (!uds) {
54 port = SocketAddress::GetAddrPort(addr);
55 }
52 56
53 SocketsIterator it = sockets_by_port_.find(port); 57 SocketsIterator it = sockets_by_port_.find(port);
54 OSSocket *first_os_socket = NULL; 58 OSSocket *first_os_socket = NULL;
55 if (it != sockets_by_port_.end()) { 59 if (it != sockets_by_port_.end()) {
56 first_os_socket = it->second; 60 first_os_socket = it->second;
57 } 61 }
58 62
59 if (first_os_socket != NULL) { 63 if (first_os_socket != NULL) {
60 // There is already a socket listening on this port. We need to ensure 64 // There is already a socket listening on this port. We need to ensure
61 // that if there is one also listening on the same address, it was created 65 // that if there is one also listening on the same address, it was created
(...skipping 26 matching lines...) Expand all
88 os_socket->ref_count++; 92 os_socket->ref_count++;
89 93
90 // We set as a side-effect the file descriptor on the dart socket_object. 94 // We set as a side-effect the file descriptor on the dart socket_object.
91 Socket::SetSocketIdNativeField(socket_object, os_socket->socketfd); 95 Socket::SetSocketIdNativeField(socket_object, os_socket->socketfd);
92 96
93 return Dart_True(); 97 return Dart_True();
94 } 98 }
95 } 99 }
96 100
97 // There is no socket listening on that (address, port), so we create new one. 101 // There is no socket listening on that (address, port), so we create new one.
98 intptr_t socketfd = ServerSocket::CreateBindListen(addr, backlog, v6_only); 102 intptr_t socketfd;
99 if (socketfd == -5) { 103 if (!uds) {
104 socketfd = ServerSocket::CreateBindListen(addr, backlog, v6_only);
105 } else {
106 socketfd = ServerSocket::CreateBindListenUnix(addr, backlog);
107 }
108 if (!uds && socketfd == -5) {
100 OSError os_error(-1, "Invalid host", OSError::kUnknown); 109 OSError os_error(-1, "Invalid host", OSError::kUnknown);
101 return DartUtils::NewDartOSError(&os_error); 110 return DartUtils::NewDartOSError(&os_error);
102 } 111 }
103 if (socketfd < 0) { 112 if (socketfd < 0) {
104 OSError error; 113 OSError error;
105 return DartUtils::NewDartOSError(&error); 114 return DartUtils::NewDartOSError(&error);
106 } 115 }
107 if (!ServerSocket::StartAccept(socketfd)) { 116 if (!ServerSocket::StartAccept(socketfd)) {
108 OSError os_error(-1, "Failed to start accept", OSError::kUnknown); 117 OSError os_error(-1, "Failed to start accept", OSError::kUnknown);
109 return DartUtils::NewDartOSError(&os_error); 118 return DartUtils::NewDartOSError(&os_error);
110 } 119 }
111 intptr_t allocated_port = Socket::GetPort(socketfd); 120 intptr_t allocated_port = -1;
112 ASSERT(allocated_port > 0); 121 if (!uds) {
122 allocated_port = Socket::GetPort(socketfd);
123 ASSERT(allocated_port > 0);
124 }
113 125
114 OSSocket *os_socket = 126 OSSocket *os_socket =
115 new OSSocket(addr, allocated_port, v6_only, shared, socketfd); 127 new OSSocket(addr, allocated_port, v6_only, shared, socketfd);
116 os_socket->ref_count = 1; 128 os_socket->ref_count = 1;
117 os_socket->next = first_os_socket; 129 os_socket->next = first_os_socket;
118 sockets_by_port_[allocated_port] = os_socket; 130 sockets_by_port_[allocated_port] = os_socket;
119 sockets_by_fd_[socketfd] = os_socket; 131 sockets_by_fd_[socketfd] = os_socket;
120 132
121 // We set as a side-effect the port on the dart socket_object. 133 // We set as a side-effect the port on the dart socket_object.
122 Socket::SetSocketIdNativeField(socket_object, socketfd); 134 Socket::SetSocketIdNativeField(socket_object, socketfd);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 OSError error; 247 OSError error;
236 if (socket >= 0) { 248 if (socket >= 0) {
237 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); 249 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
238 Dart_SetReturnValue(args, Dart_True()); 250 Dart_SetReturnValue(args, Dart_True());
239 } else { 251 } else {
240 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 252 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
241 } 253 }
242 } 254 }
243 255
244 256
257 void FUNCTION_NAME(Socket_CreateConnectUnix)(Dart_NativeArguments args) {
258 RawAddr addr;
259 const char* path =
260 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
261 addr.un.sun_family = AF_UNIX;
262 snprintf(addr.un.sun_path, sizeof(addr.un.sun_path), "%s", path);
263 intptr_t socket = Socket::CreateConnectUnix(addr);
264 OSError error;
265 if (socket >= 0) {
266 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
267 Dart_SetReturnValue(args, Dart_True());
268 } else {
269 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
270 }
271 }
272
273
245 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { 274 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
246 RawAddr addr; 275 RawAddr addr;
247 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 276 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
248 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 277 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
249 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 278 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
250 SocketAddress::SetAddrPort(&addr, port); 279 SocketAddress::SetAddrPort(&addr, port);
251 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); 280 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
252 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); 281 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr);
253 if (socket >= 0) { 282 if (socket >= 0) {
254 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); 283 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 505
477 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { 506 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
478 intptr_t socket = 507 intptr_t socket =
479 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 508 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
480 OSError os_error; 509 OSError os_error;
481 intptr_t port = 0; 510 intptr_t port = 0;
482 SocketAddress* addr = Socket::GetRemotePeer(socket, &port); 511 SocketAddress* addr = Socket::GetRemotePeer(socket, &port);
483 if (addr != NULL) { 512 if (addr != NULL) {
484 Dart_Handle list = Dart_NewList(2); 513 Dart_Handle list = Dart_NewList(2);
485 514
486 Dart_Handle entry = Dart_NewList(3); 515 int type = addr->GetType();
487 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); 516 if (type == SocketAddress::TYPE_UNIX) {
488 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); 517 Dart_Handle entry = Dart_NewList(2);
518 Dart_ListSetAt(entry, 0, Dart_NewInteger(type));
519 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
520 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
521 Dart_ListSetAt(list, 0, entry);
522 Dart_SetReturnValue(args, list);
523 delete addr;
524 } else {
525 ASSERT(type == SocketAddress::TYPE_IPV4 ||
526 type == SocketAddress::TYPE_IPV6);
527 Dart_Handle entry = Dart_NewList(3);
528 Dart_ListSetAt(entry, 0, Dart_NewInteger(type));
529 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
489 530
490 RawAddr raw = addr->addr(); 531 RawAddr raw = addr->addr();
491 intptr_t data_length = SocketAddress::GetAddrLength(raw); 532 intptr_t data_length = SocketAddress::GetAddrLength(raw);
492 Dart_Handle data = Dart_NewTypedData(Dart_TypedData_kUint8, data_length); 533 Dart_Handle data = Dart_NewTypedData(Dart_TypedData_kUint8, data_length);
493 Dart_ListSetAsBytes(data, 0, reinterpret_cast<uint8_t*>(&raw), data_length); 534 Dart_ListSetAsBytes(
494 Dart_ListSetAt(entry, 2, data); 535 data, 0, reinterpret_cast<uint8_t*>(&raw), data_length);
536 Dart_ListSetAt(entry, 2, data);
495 537
496 Dart_ListSetAt(list, 0, entry); 538 Dart_ListSetAt(list, 0, entry);
497 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); 539 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
498 Dart_SetReturnValue(args, list); 540 Dart_SetReturnValue(args, list);
499 delete addr; 541 delete addr;
542 }
500 } else { 543 } else {
501 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 544 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
502 } 545 }
503 } 546 }
504 547
505 548
506 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { 549 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
507 intptr_t socket = 550 intptr_t socket =
508 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 551 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
509 OSError os_error; 552 OSError os_error;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 SocketAddress::SetAddrPort(&addr, port); 601 SocketAddress::SetAddrPort(&addr, port);
559 int64_t backlog = DartUtils::GetInt64ValueCheckRange( 602 int64_t backlog = DartUtils::GetInt64ValueCheckRange(
560 Dart_GetNativeArgument(args, 3), 603 Dart_GetNativeArgument(args, 3),
561 0, 604 0,
562 65535); 605 65535);
563 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); 606 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
564 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); 607 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5));
565 608
566 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); 609 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
567 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( 610 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen(
568 socket_object, addr, backlog, v6_only, shared); 611 socket_object, addr, backlog, v6_only, shared, false);
569 Dart_SetReturnValue(args, result); 612 Dart_SetReturnValue(args, result);
570 } 613 }
571 614
615
616 void FUNCTION_NAME(ServerSocket_CreateBindListenUnix)(
617 Dart_NativeArguments args) {
618 RawAddr addr;
619 const char* path =
620 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
621 addr.un.sun_family = AF_UNIX;
622 snprintf(addr.un.sun_path, sizeof(addr.un.sun_path), "%s", path);
623 int64_t backlog = DartUtils::GetInt64ValueCheckRange(
624 Dart_GetNativeArgument(args, 2),
625 0,
626 65535);
627 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
628
629 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
630 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen(
631 socket_object, addr, backlog, false, shared, true);
632 Dart_SetReturnValue(args, result);
633 }
634
572 635
573 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { 636 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
574 intptr_t socket = 637 intptr_t socket =
575 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 638 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
576 intptr_t new_socket = ServerSocket::Accept(socket); 639 intptr_t new_socket = ServerSocket::Accept(socket);
577 if (new_socket >= 0) { 640 if (new_socket >= 0) {
578 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket); 641 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket);
579 Dart_SetReturnValue(args, Dart_True()); 642 Dart_SetReturnValue(args, Dart_True());
580 } else if (new_socket == ServerSocket::kTemporaryFailure) { 643 } else if (new_socket == ServerSocket::kTemporaryFailure) {
581 Dart_SetReturnValue(args, Dart_False()); 644 Dart_SetReturnValue(args, Dart_False());
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { 937 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) {
875 intptr_t socket = 0; 938 intptr_t socket = 0;
876 Dart_Handle err = 939 Dart_Handle err =
877 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); 940 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket);
878 if (Dart_IsError(err)) Dart_PropagateError(err); 941 if (Dart_IsError(err)) Dart_PropagateError(err);
879 return socket; 942 return socket;
880 } 943 }
881 944
882 } // namespace bin 945 } // namespace bin
883 } // namespace dart 946 } // namespace dart
OLDNEW
« 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