| 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 |