OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |