| 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 #if !defined(DART_IO_DISABLED) | 5 #if !defined(DART_IO_DISABLED) |
| 6 | 6 |
| 7 #include "bin/socket.h" | 7 #include "bin/socket.h" |
| 8 | 8 |
| 9 #include "bin/dartutils.h" | 9 #include "bin/dartutils.h" |
| 10 #include "bin/io_buffer.h" | 10 #include "bin/io_buffer.h" |
| 11 #include "bin/isolate_data.h" | 11 #include "bin/isolate_data.h" |
| 12 #include "bin/lockers.h" | 12 #include "bin/lockers.h" |
| 13 #include "bin/thread.h" | 13 #include "bin/thread.h" |
| 14 #include "bin/utils.h" | 14 #include "bin/utils.h" |
| 15 | 15 |
| 16 #include "include/dart_api.h" | 16 #include "include/dart_api.h" |
| 17 | 17 |
| 18 #include "platform/globals.h" | 18 #include "platform/globals.h" |
| 19 #include "platform/utils.h" | 19 #include "platform/utils.h" |
| 20 | 20 |
| 21 namespace dart { | 21 namespace dart { |
| 22 namespace bin { | 22 namespace bin { |
| 23 | 23 |
| 24 static const int kSocketIdNativeField = 0; | 24 static const int kSocketIdNativeField = 0; |
| 25 | 25 |
| 26 ListeningSocketRegistry *globalTcpListeningSocketRegistry = NULL; | 26 ListeningSocketRegistry* globalTcpListeningSocketRegistry = NULL; |
| 27 | 27 |
| 28 bool short_socket_read = false; | 28 bool short_socket_read = false; |
| 29 | 29 |
| 30 bool short_socket_write = false; | 30 bool short_socket_write = false; |
| 31 | 31 |
| 32 void ListeningSocketRegistry::Initialize() { | 32 void ListeningSocketRegistry::Initialize() { |
| 33 ASSERT(globalTcpListeningSocketRegistry == NULL); | 33 ASSERT(globalTcpListeningSocketRegistry == NULL); |
| 34 globalTcpListeningSocketRegistry = new ListeningSocketRegistry(); | 34 globalTcpListeningSocketRegistry = new ListeningSocketRegistry(); |
| 35 } | 35 } |
| 36 | 36 |
| 37 | 37 |
| 38 ListeningSocketRegistry *ListeningSocketRegistry::Instance() { | 38 ListeningSocketRegistry* ListeningSocketRegistry::Instance() { |
| 39 return globalTcpListeningSocketRegistry; | 39 return globalTcpListeningSocketRegistry; |
| 40 } | 40 } |
| 41 | 41 |
| 42 | 42 |
| 43 void ListeningSocketRegistry::Cleanup() { | 43 void ListeningSocketRegistry::Cleanup() { |
| 44 delete globalTcpListeningSocketRegistry; | 44 delete globalTcpListeningSocketRegistry; |
| 45 globalTcpListeningSocketRegistry = NULL; | 45 globalTcpListeningSocketRegistry = NULL; |
| 46 } | 46 } |
| 47 | 47 |
| 48 | 48 |
| 49 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort( | 49 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort( |
| 50 intptr_t port) { | 50 intptr_t port) { |
| 51 HashMap::Entry* entry = | 51 HashMap::Entry* entry = sockets_by_port_.Lookup( |
| 52 sockets_by_port_.Lookup(GetHashmapKeyFromIntptr(port), | 52 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), false); |
| 53 GetHashmapHashFromIntptr(port), false); | |
| 54 if (entry == NULL) { | 53 if (entry == NULL) { |
| 55 return NULL; | 54 return NULL; |
| 56 } | 55 } |
| 57 return reinterpret_cast<OSSocket*>(entry->value); | 56 return reinterpret_cast<OSSocket*>(entry->value); |
| 58 } | 57 } |
| 59 | 58 |
| 60 | 59 |
| 61 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) { | 60 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) { |
| 62 HashMap::Entry* entry = | 61 HashMap::Entry* entry = sockets_by_port_.Lookup( |
| 63 sockets_by_port_.Lookup(GetHashmapKeyFromIntptr(port), | 62 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), true); |
| 64 GetHashmapHashFromIntptr(port), true); | |
| 65 ASSERT(entry != NULL); | 63 ASSERT(entry != NULL); |
| 66 entry->value = reinterpret_cast<void*>(socket); | 64 entry->value = reinterpret_cast<void*>(socket); |
| 67 } | 65 } |
| 68 | 66 |
| 69 | 67 |
| 70 void ListeningSocketRegistry::RemoveByPort(intptr_t port) { | 68 void ListeningSocketRegistry::RemoveByPort(intptr_t port) { |
| 71 sockets_by_port_.Remove( | 69 sockets_by_port_.Remove(GetHashmapKeyFromIntptr(port), |
| 72 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port)); | 70 GetHashmapHashFromIntptr(port)); |
| 73 } | 71 } |
| 74 | 72 |
| 75 | 73 |
| 76 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd( | 74 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd( |
| 77 intptr_t fd) { | 75 intptr_t fd) { |
| 78 HashMap::Entry* entry = | 76 HashMap::Entry* entry = sockets_by_fd_.Lookup( |
| 79 sockets_by_fd_.Lookup(GetHashmapKeyFromIntptr(fd), | 77 GetHashmapKeyFromIntptr(fd), GetHashmapHashFromIntptr(fd), false); |
| 80 GetHashmapHashFromIntptr(fd), false); | |
| 81 if (entry == NULL) { | 78 if (entry == NULL) { |
| 82 return NULL; | 79 return NULL; |
| 83 } | 80 } |
| 84 return reinterpret_cast<OSSocket*>(entry->value); | 81 return reinterpret_cast<OSSocket*>(entry->value); |
| 85 } | 82 } |
| 86 | 83 |
| 87 | 84 |
| 88 void ListeningSocketRegistry::InsertByFd(intptr_t fd, OSSocket* socket) { | 85 void ListeningSocketRegistry::InsertByFd(intptr_t fd, OSSocket* socket) { |
| 89 HashMap::Entry* entry = | 86 HashMap::Entry* entry = sockets_by_fd_.Lookup( |
| 90 sockets_by_fd_.Lookup(GetHashmapKeyFromIntptr(fd), | 87 GetHashmapKeyFromIntptr(fd), GetHashmapHashFromIntptr(fd), true); |
| 91 GetHashmapHashFromIntptr(fd), true); | |
| 92 ASSERT(entry != NULL); | 88 ASSERT(entry != NULL); |
| 93 entry->value = reinterpret_cast<void*>(socket); | 89 entry->value = reinterpret_cast<void*>(socket); |
| 94 } | 90 } |
| 95 | 91 |
| 96 | 92 |
| 97 void ListeningSocketRegistry::RemoveByFd(intptr_t fd) { | 93 void ListeningSocketRegistry::RemoveByFd(intptr_t fd) { |
| 98 sockets_by_fd_.Remove( | 94 sockets_by_fd_.Remove(GetHashmapKeyFromIntptr(fd), |
| 99 GetHashmapKeyFromIntptr(fd), GetHashmapHashFromIntptr(fd)); | 95 GetHashmapHashFromIntptr(fd)); |
| 100 } | 96 } |
| 101 | 97 |
| 102 | 98 |
| 103 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, | 99 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
| 104 RawAddr addr, | 100 RawAddr addr, |
| 105 intptr_t backlog, | 101 intptr_t backlog, |
| 106 bool v6_only, | 102 bool v6_only, |
| 107 bool shared) { | 103 bool shared) { |
| 108 MutexLocker ml(ListeningSocketRegistry::mutex_); | 104 MutexLocker ml(ListeningSocketRegistry::mutex_); |
| 109 | 105 |
| 110 intptr_t port = SocketAddress::GetAddrPort(addr); | 106 intptr_t port = SocketAddress::GetAddrPort(addr); |
| 111 OSSocket* first_os_socket = LookupByPort(port); | 107 OSSocket* first_os_socket = LookupByPort(port); |
| 112 if (first_os_socket != NULL) { | 108 if (first_os_socket != NULL) { |
| 113 // There is already a socket listening on this port. We need to ensure | 109 // There is already a socket listening on this port. We need to ensure |
| 114 // that if there is one also listening on the same address, it was created | 110 // that if there is one also listening on the same address, it was created |
| 115 // with `shared = true`, ... | 111 // with `shared = true`, ... |
| 116 OSSocket *os_socket = first_os_socket; | 112 OSSocket* os_socket = first_os_socket; |
| 117 OSSocket *os_socket_same_addr = findOSSocketWithAddress(os_socket, addr); | 113 OSSocket* os_socket_same_addr = findOSSocketWithAddress(os_socket, addr); |
| 118 | 114 |
| 119 if (os_socket_same_addr != NULL) { | 115 if (os_socket_same_addr != NULL) { |
| 120 if (!os_socket_same_addr->shared || !shared) { | 116 if (!os_socket_same_addr->shared || !shared) { |
| 121 OSError os_error(-1, | 117 OSError os_error(-1, |
| 122 "The shared flag to bind() needs to be `true` if " | 118 "The shared flag to bind() needs to be `true` if " |
| 123 "binding multiple times on the same (address, port) " | 119 "binding multiple times on the same (address, port) " |
| 124 "combination.", | 120 "combination.", |
| 125 OSError::kUnknown); | 121 OSError::kUnknown); |
| 126 return DartUtils::NewDartOSError(&os_error); | 122 return DartUtils::NewDartOSError(&os_error); |
| 127 } | 123 } |
| 128 if (os_socket_same_addr->v6_only != v6_only) { | 124 if (os_socket_same_addr->v6_only != v6_only) { |
| 129 OSError os_error(-1, | 125 OSError os_error(-1, |
| 130 "The v6Only flag to bind() needs to be the same if " | 126 "The v6Only flag to bind() needs to be the same if " |
| 131 "binding multiple times on the same (address, port) " | 127 "binding multiple times on the same (address, port) " |
| 132 "combination.", | 128 "combination.", |
| 133 OSError::kUnknown); | 129 OSError::kUnknown); |
| 134 return DartUtils::NewDartOSError(&os_error); | 130 return DartUtils::NewDartOSError(&os_error); |
| 135 } | 131 } |
| 136 | 132 |
| 137 // This socket creation is the exact same as the one which originally | 133 // This socket creation is the exact same as the one which originally |
| 138 // created the socket. We therefore increment the refcount and reuse | 134 // created the socket. We therefore increment the refcount and reuse |
| 139 // the file descriptor. | 135 // the file descriptor. |
| 140 os_socket->ref_count++; | 136 os_socket->ref_count++; |
| 141 | 137 |
| 142 // We set as a side-effect the file descriptor on the dart socket_object. | 138 // We set as a side-effect the file descriptor on the dart socket_object. |
| 143 Socket::SetSocketIdNativeField(socket_object, os_socket->socketfd); | 139 Socket::SetSocketIdNativeField(socket_object, os_socket->socketfd); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 156 OSError error; | 152 OSError error; |
| 157 return DartUtils::NewDartOSError(&error); | 153 return DartUtils::NewDartOSError(&error); |
| 158 } | 154 } |
| 159 if (!ServerSocket::StartAccept(socketfd)) { | 155 if (!ServerSocket::StartAccept(socketfd)) { |
| 160 OSError os_error(-1, "Failed to start accept", OSError::kUnknown); | 156 OSError os_error(-1, "Failed to start accept", OSError::kUnknown); |
| 161 return DartUtils::NewDartOSError(&os_error); | 157 return DartUtils::NewDartOSError(&os_error); |
| 162 } | 158 } |
| 163 intptr_t allocated_port = Socket::GetPort(socketfd); | 159 intptr_t allocated_port = Socket::GetPort(socketfd); |
| 164 ASSERT(allocated_port > 0); | 160 ASSERT(allocated_port > 0); |
| 165 | 161 |
| 166 OSSocket *os_socket = | 162 OSSocket* os_socket = |
| 167 new OSSocket(addr, allocated_port, v6_only, shared, socketfd); | 163 new OSSocket(addr, allocated_port, v6_only, shared, socketfd); |
| 168 os_socket->ref_count = 1; | 164 os_socket->ref_count = 1; |
| 169 os_socket->next = first_os_socket; | 165 os_socket->next = first_os_socket; |
| 170 | 166 |
| 171 InsertByPort(allocated_port, os_socket); | 167 InsertByPort(allocated_port, os_socket); |
| 172 InsertByFd(socketfd, os_socket); | 168 InsertByFd(socketfd, os_socket); |
| 173 | 169 |
| 174 // We set as a side-effect the port on the dart socket_object. | 170 // We set as a side-effect the port on the dart socket_object. |
| 175 Socket::SetSocketIdNativeField(socket_object, socketfd); | 171 Socket::SetSocketIdNativeField(socket_object, socketfd); |
| 176 | 172 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 } | 205 } |
| 210 | 206 |
| 211 ASSERT(os_socket->ref_count == 0); | 207 ASSERT(os_socket->ref_count == 0); |
| 212 delete os_socket; | 208 delete os_socket; |
| 213 return true; | 209 return true; |
| 214 } | 210 } |
| 215 | 211 |
| 216 | 212 |
| 217 void ListeningSocketRegistry::CloseAllSafe() { | 213 void ListeningSocketRegistry::CloseAllSafe() { |
| 218 MutexLocker ml(mutex_); | 214 MutexLocker ml(mutex_); |
| 219 for (HashMap::Entry* p = sockets_by_fd_.Start(); | 215 for (HashMap::Entry* p = sockets_by_fd_.Start(); p != NULL; |
| 220 p != NULL; | |
| 221 p = sockets_by_fd_.Next(p)) { | 216 p = sockets_by_fd_.Next(p)) { |
| 222 CloseOneSafe(reinterpret_cast<OSSocket*>(p->value)); | 217 CloseOneSafe(reinterpret_cast<OSSocket*>(p->value)); |
| 223 } | 218 } |
| 224 } | 219 } |
| 225 | 220 |
| 226 | 221 |
| 227 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { | 222 bool ListeningSocketRegistry::CloseSafe(intptr_t socketfd) { |
| 228 ASSERT(!mutex_->TryLock()); | 223 ASSERT(!mutex_->TryLock()); |
| 229 OSSocket* os_socket = LookupByFd(socketfd); | 224 OSSocket* os_socket = LookupByFd(socketfd); |
| 230 if (os_socket != NULL) { | 225 if (os_socket != NULL) { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 dart_args[1] = Dart_NewStringFromCString(numeric_address); | 428 dart_args[1] = Dart_NewStringFromCString(numeric_address); |
| 434 if (Dart_IsError(dart_args[1])) { | 429 if (Dart_IsError(dart_args[1])) { |
| 435 Dart_PropagateError(dart_args[1]); | 430 Dart_PropagateError(dart_args[1]); |
| 436 } | 431 } |
| 437 dart_args[2] = SocketAddress::ToTypedData(addr); | 432 dart_args[2] = SocketAddress::ToTypedData(addr); |
| 438 dart_args[3] = Dart_NewInteger(port); | 433 dart_args[3] = Dart_NewInteger(port); |
| 439 if (Dart_IsError(dart_args[3])) { | 434 if (Dart_IsError(dart_args[3])) { |
| 440 Dart_PropagateError(dart_args[3]); | 435 Dart_PropagateError(dart_args[3]); |
| 441 } | 436 } |
| 442 // TODO(sgjesse): Cache the _makeDatagram function somewhere. | 437 // TODO(sgjesse): Cache the _makeDatagram function somewhere. |
| 443 Dart_Handle io_lib = | 438 Dart_Handle io_lib = Dart_LookupLibrary(DartUtils::NewString("dart:io")); |
| 444 Dart_LookupLibrary(DartUtils::NewString("dart:io")); | |
| 445 if (Dart_IsError(io_lib)) { | 439 if (Dart_IsError(io_lib)) { |
| 446 Dart_PropagateError(io_lib); | 440 Dart_PropagateError(io_lib); |
| 447 } | 441 } |
| 448 Dart_Handle result = | 442 Dart_Handle result = Dart_Invoke( |
| 449 Dart_Invoke(io_lib, | 443 io_lib, DartUtils::NewString("_makeDatagram"), kNumArgs, dart_args); |
| 450 DartUtils::NewString("_makeDatagram"), | |
| 451 kNumArgs, | |
| 452 dart_args); | |
| 453 Dart_SetReturnValue(args, result); | 444 Dart_SetReturnValue(args, result); |
| 454 } | 445 } |
| 455 | 446 |
| 456 | 447 |
| 457 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { | 448 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { |
| 458 intptr_t socket = | 449 intptr_t socket = |
| 459 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 450 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 460 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 451 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 461 ASSERT(Dart_IsList(buffer_obj)); | 452 ASSERT(Dart_IsList(buffer_obj)); |
| 462 intptr_t offset = | 453 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 463 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 454 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 464 intptr_t length = | |
| 465 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | |
| 466 bool short_write = false; | 455 bool short_write = false; |
| 467 if (short_socket_write) { | 456 if (short_socket_write) { |
| 468 if (length > 1) { | 457 if (length > 1) { |
| 469 short_write = true; | 458 short_write = true; |
| 470 } | 459 } |
| 471 length = (length + 1) / 2; | 460 length = (length + 1) / 2; |
| 472 } | 461 } |
| 473 Dart_TypedData_Type type; | 462 Dart_TypedData_Type type; |
| 474 uint8_t* buffer = NULL; | 463 uint8_t* buffer = NULL; |
| 475 intptr_t len; | 464 intptr_t len; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 496 Dart_TypedDataReleaseData(buffer_obj); | 485 Dart_TypedDataReleaseData(buffer_obj); |
| 497 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 486 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 498 } | 487 } |
| 499 } | 488 } |
| 500 | 489 |
| 501 | 490 |
| 502 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { | 491 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { |
| 503 intptr_t socket = | 492 intptr_t socket = |
| 504 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 493 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 505 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 494 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 506 intptr_t offset = | 495 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 507 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 496 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 508 intptr_t length = | |
| 509 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | |
| 510 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); | 497 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); |
| 511 ASSERT(Dart_IsList(address_obj)); | 498 ASSERT(Dart_IsList(address_obj)); |
| 512 RawAddr addr; | 499 RawAddr addr; |
| 513 SocketAddress::GetSockAddr(address_obj, &addr); | 500 SocketAddress::GetSockAddr(address_obj, &addr); |
| 514 int64_t port = DartUtils::GetInt64ValueCheckRange( | 501 int64_t port = DartUtils::GetInt64ValueCheckRange( |
| 515 Dart_GetNativeArgument(args, 5), | 502 Dart_GetNativeArgument(args, 5), 0, 65535); |
| 516 0, | |
| 517 65535); | |
| 518 SocketAddress::SetAddrPort(&addr, port); | 503 SocketAddress::SetAddrPort(&addr, port); |
| 519 Dart_TypedData_Type type; | 504 Dart_TypedData_Type type; |
| 520 uint8_t* buffer = NULL; | 505 uint8_t* buffer = NULL; |
| 521 intptr_t len; | 506 intptr_t len; |
| 522 Dart_Handle result = Dart_TypedDataAcquireData( | 507 Dart_Handle result = Dart_TypedDataAcquireData( |
| 523 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); | 508 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); |
| 524 if (Dart_IsError(result)) { | 509 if (Dart_IsError(result)) { |
| 525 Dart_PropagateError(result); | 510 Dart_PropagateError(result); |
| 526 } | 511 } |
| 527 ASSERT((offset + length) <= len); | 512 ASSERT((offset + length) <= len); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 intptr_t type = Socket::GetType(socket); | 582 intptr_t type = Socket::GetType(socket); |
| 598 if (type >= 0) { | 583 if (type >= 0) { |
| 599 Dart_SetReturnValue(args, Dart_NewInteger(type)); | 584 Dart_SetReturnValue(args, Dart_NewInteger(type)); |
| 600 } else { | 585 } else { |
| 601 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 586 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 602 } | 587 } |
| 603 } | 588 } |
| 604 | 589 |
| 605 | 590 |
| 606 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { | 591 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
| 607 int64_t num = DartUtils::GetInt64ValueCheckRange( | 592 int64_t num = |
| 608 Dart_GetNativeArgument(args, 1), 0, 2); | 593 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); |
| 609 intptr_t socket = Socket::GetStdioHandle(num); | 594 intptr_t socket = Socket::GetStdioHandle(num); |
| 610 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); | 595 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 611 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); | 596 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); |
| 612 } | 597 } |
| 613 | 598 |
| 614 | 599 |
| 615 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { | 600 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { |
| 616 intptr_t id = Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 601 intptr_t id = Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 617 Dart_SetReturnValue(args, Dart_NewInteger(id)); | 602 Dart_SetReturnValue(args, Dart_NewInteger(id)); |
| 618 } | 603 } |
| 619 | 604 |
| 620 | 605 |
| 621 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { | 606 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { |
| 622 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 607 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
| 623 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); | 608 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); |
| 624 } | 609 } |
| 625 | 610 |
| 626 | 611 |
| 627 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { | 612 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| 628 RawAddr addr; | 613 RawAddr addr; |
| 629 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 614 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 630 int64_t port = DartUtils::GetInt64ValueCheckRange( | 615 int64_t port = DartUtils::GetInt64ValueCheckRange( |
| 631 Dart_GetNativeArgument(args, 2), | 616 Dart_GetNativeArgument(args, 2), 0, 65535); |
| 632 0, | |
| 633 65535); | |
| 634 SocketAddress::SetAddrPort(&addr, port); | 617 SocketAddress::SetAddrPort(&addr, port); |
| 635 int64_t backlog = DartUtils::GetInt64ValueCheckRange( | 618 int64_t backlog = DartUtils::GetInt64ValueCheckRange( |
| 636 Dart_GetNativeArgument(args, 3), | 619 Dart_GetNativeArgument(args, 3), 0, 65535); |
| 637 0, | |
| 638 65535); | |
| 639 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); | 620 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); |
| 640 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); | 621 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); |
| 641 | 622 |
| 642 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); | 623 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); |
| 643 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( | 624 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( |
| 644 socket_object, addr, backlog, v6_only, shared); | 625 socket_object, addr, backlog, v6_only, shared); |
| 645 Dart_SetReturnValue(args, result); | 626 Dart_SetReturnValue(args, result); |
| 646 } | 627 } |
| 647 | 628 |
| 648 | 629 |
| 649 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { | 630 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
| 650 intptr_t socket = | 631 intptr_t socket = |
| 651 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 632 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 652 intptr_t new_socket = ServerSocket::Accept(socket); | 633 intptr_t new_socket = ServerSocket::Accept(socket); |
| 653 if (new_socket >= 0) { | 634 if (new_socket >= 0) { |
| 654 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket); | 635 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket); |
| 655 Dart_SetReturnValue(args, Dart_True()); | 636 Dart_SetReturnValue(args, Dart_True()); |
| 656 } else if (new_socket == ServerSocket::kTemporaryFailure) { | 637 } else if (new_socket == ServerSocket::kTemporaryFailure) { |
| 657 Dart_SetReturnValue(args, Dart_False()); | 638 Dart_SetReturnValue(args, Dart_False()); |
| 658 } else { | 639 } else { |
| 659 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 640 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 660 } | 641 } |
| 661 } | 642 } |
| 662 | 643 |
| 663 | 644 |
| 664 CObject* Socket::LookupRequest(const CObjectArray& request) { | 645 CObject* Socket::LookupRequest(const CObjectArray& request) { |
| 665 if ((request.Length() == 2) && | 646 if ((request.Length() == 2) && request[0]->IsString() && |
| 666 request[0]->IsString() && | |
| 667 request[1]->IsInt32()) { | 647 request[1]->IsInt32()) { |
| 668 CObjectString host(request[0]); | 648 CObjectString host(request[0]); |
| 669 CObjectInt32 type(request[1]); | 649 CObjectInt32 type(request[1]); |
| 670 CObject* result = NULL; | 650 CObject* result = NULL; |
| 671 OSError* os_error = NULL; | 651 OSError* os_error = NULL; |
| 672 AddressList<SocketAddress>* addresses = | 652 AddressList<SocketAddress>* addresses = |
| 673 Socket::LookupAddress(host.CString(), type.Value(), &os_error); | 653 Socket::LookupAddress(host.CString(), type.Value(), &os_error); |
| 674 if (addresses != NULL) { | 654 if (addresses != NULL) { |
| 675 CObjectArray* array = new CObjectArray( | 655 CObjectArray* array = |
| 676 CObject::NewArray(addresses->count() + 1)); | 656 new CObjectArray(CObject::NewArray(addresses->count() + 1)); |
| 677 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); | 657 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
| 678 for (intptr_t i = 0; i < addresses->count(); i++) { | 658 for (intptr_t i = 0; i < addresses->count(); i++) { |
| 679 SocketAddress* addr = addresses->GetAt(i); | 659 SocketAddress* addr = addresses->GetAt(i); |
| 680 CObjectArray* entry = new CObjectArray(CObject::NewArray(3)); | 660 CObjectArray* entry = new CObjectArray(CObject::NewArray(3)); |
| 681 | 661 |
| 682 CObjectInt32* type = new CObjectInt32( | 662 CObjectInt32* type = |
| 683 CObject::NewInt32(addr->GetType())); | 663 new CObjectInt32(CObject::NewInt32(addr->GetType())); |
| 684 entry->SetAt(0, type); | 664 entry->SetAt(0, type); |
| 685 | 665 |
| 686 CObjectString* as_string = new CObjectString(CObject::NewString( | 666 CObjectString* as_string = |
| 687 addr->as_string())); | 667 new CObjectString(CObject::NewString(addr->as_string())); |
| 688 entry->SetAt(1, as_string); | 668 entry->SetAt(1, as_string); |
| 689 | 669 |
| 690 RawAddr raw = addr->addr(); | 670 RawAddr raw = addr->addr(); |
| 691 CObjectUint8Array* data = SocketAddress::ToCObject(raw); | 671 CObjectUint8Array* data = SocketAddress::ToCObject(raw); |
| 692 entry->SetAt(2, data); | 672 entry->SetAt(2, data); |
| 693 | 673 |
| 694 array->SetAt(i + 1, entry); | 674 array->SetAt(i + 1, entry); |
| 695 } | 675 } |
| 696 result = array; | 676 result = array; |
| 697 delete addresses; | 677 delete addresses; |
| 698 } else { | 678 } else { |
| 699 result = CObject::NewOSError(os_error); | 679 result = CObject::NewOSError(os_error); |
| 700 delete os_error; | 680 delete os_error; |
| 701 } | 681 } |
| 702 return result; | 682 return result; |
| 703 } | 683 } |
| 704 return CObject::IllegalArgumentError(); | 684 return CObject::IllegalArgumentError(); |
| 705 } | 685 } |
| 706 | 686 |
| 707 | 687 |
| 708 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { | 688 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { |
| 709 if ((request.Length() == 1) && | 689 if ((request.Length() == 1) && request[0]->IsTypedData()) { |
| 710 request[0]->IsTypedData()) { | |
| 711 CObjectUint8Array addr_object(request[0]); | 690 CObjectUint8Array addr_object(request[0]); |
| 712 RawAddr addr; | 691 RawAddr addr; |
| 713 int len = addr_object.Length(); | 692 int len = addr_object.Length(); |
| 714 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); | 693 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); |
| 715 if (len == sizeof(in_addr)) { | 694 if (len == sizeof(in_addr)) { |
| 716 addr.in.sin_family = AF_INET; | 695 addr.in.sin_family = AF_INET; |
| 717 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), | 696 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), addr_object.Buffer(), |
| 718 addr_object.Buffer(), | |
| 719 len); | 697 len); |
| 720 } else { | 698 } else { |
| 721 ASSERT(len == sizeof(in6_addr)); | 699 ASSERT(len == sizeof(in6_addr)); |
| 722 addr.in6.sin6_family = AF_INET6; | 700 addr.in6.sin6_family = AF_INET6; |
| 723 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr), | 701 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr), |
| 724 addr_object.Buffer(), | 702 addr_object.Buffer(), len); |
| 725 len); | |
| 726 } | 703 } |
| 727 | 704 |
| 728 OSError* os_error = NULL; | 705 OSError* os_error = NULL; |
| 729 const intptr_t kMaxHostLength = 1025; | 706 const intptr_t kMaxHostLength = 1025; |
| 730 char host[kMaxHostLength]; | 707 char host[kMaxHostLength]; |
| 731 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { | 708 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { |
| 732 return new CObjectString(CObject::NewString(host)); | 709 return new CObjectString(CObject::NewString(host)); |
| 733 } else { | 710 } else { |
| 734 CObject* result = CObject::NewOSError(os_error); | 711 CObject* result = CObject::NewOSError(os_error); |
| 735 delete os_error; | 712 delete os_error; |
| 736 return result; | 713 return result; |
| 737 } | 714 } |
| 738 } | 715 } |
| 739 return CObject::IllegalArgumentError(); | 716 return CObject::IllegalArgumentError(); |
| 740 } | 717 } |
| 741 | 718 |
| 742 | 719 |
| 743 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { | 720 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { |
| 744 if ((request.Length() == 1) && | 721 if ((request.Length() == 1) && request[0]->IsInt32()) { |
| 745 request[0]->IsInt32()) { | |
| 746 CObjectInt32 type(request[0]); | 722 CObjectInt32 type(request[0]); |
| 747 CObject* result = NULL; | 723 CObject* result = NULL; |
| 748 OSError* os_error = NULL; | 724 OSError* os_error = NULL; |
| 749 AddressList<InterfaceSocketAddress>* addresses = Socket::ListInterfaces( | 725 AddressList<InterfaceSocketAddress>* addresses = |
| 750 type.Value(), &os_error); | 726 Socket::ListInterfaces(type.Value(), &os_error); |
| 751 if (addresses != NULL) { | 727 if (addresses != NULL) { |
| 752 CObjectArray* array = new CObjectArray( | 728 CObjectArray* array = |
| 753 CObject::NewArray(addresses->count() + 1)); | 729 new CObjectArray(CObject::NewArray(addresses->count() + 1)); |
| 754 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); | 730 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
| 755 for (intptr_t i = 0; i < addresses->count(); i++) { | 731 for (intptr_t i = 0; i < addresses->count(); i++) { |
| 756 InterfaceSocketAddress* interface = addresses->GetAt(i); | 732 InterfaceSocketAddress* interface = addresses->GetAt(i); |
| 757 SocketAddress* addr = interface->socket_address(); | 733 SocketAddress* addr = interface->socket_address(); |
| 758 CObjectArray* entry = new CObjectArray(CObject::NewArray(5)); | 734 CObjectArray* entry = new CObjectArray(CObject::NewArray(5)); |
| 759 | 735 |
| 760 CObjectInt32* type = new CObjectInt32( | 736 CObjectInt32* type = |
| 761 CObject::NewInt32(addr->GetType())); | 737 new CObjectInt32(CObject::NewInt32(addr->GetType())); |
| 762 entry->SetAt(0, type); | 738 entry->SetAt(0, type); |
| 763 | 739 |
| 764 CObjectString* as_string = new CObjectString(CObject::NewString( | 740 CObjectString* as_string = |
| 765 addr->as_string())); | 741 new CObjectString(CObject::NewString(addr->as_string())); |
| 766 entry->SetAt(1, as_string); | 742 entry->SetAt(1, as_string); |
| 767 | 743 |
| 768 RawAddr raw = addr->addr(); | 744 RawAddr raw = addr->addr(); |
| 769 CObjectUint8Array* data = SocketAddress::ToCObject(raw); | 745 CObjectUint8Array* data = SocketAddress::ToCObject(raw); |
| 770 entry->SetAt(2, data); | 746 entry->SetAt(2, data); |
| 771 | 747 |
| 772 CObjectString* interface_name = new CObjectString(CObject::NewString( | 748 CObjectString* interface_name = |
| 773 interface->interface_name())); | 749 new CObjectString(CObject::NewString(interface->interface_name())); |
| 774 entry->SetAt(3, interface_name); | 750 entry->SetAt(3, interface_name); |
| 775 | 751 |
| 776 CObjectInt64* interface_index = new CObjectInt64(CObject::NewInt64( | 752 CObjectInt64* interface_index = |
| 777 interface->interface_index())); | 753 new CObjectInt64(CObject::NewInt64(interface->interface_index())); |
| 778 entry->SetAt(4, interface_index); | 754 entry->SetAt(4, interface_index); |
| 779 | 755 |
| 780 array->SetAt(i + 1, entry); | 756 array->SetAt(i + 1, entry); |
| 781 } | 757 } |
| 782 result = array; | 758 result = array; |
| 783 delete addresses; | 759 delete addresses; |
| 784 } else { | 760 } else { |
| 785 result = CObject::NewOSError(os_error); | 761 result = CObject::NewOSError(os_error); |
| 786 delete os_error; | 762 delete os_error; |
| 787 } | 763 } |
| 788 return result; | 764 return result; |
| 789 } | 765 } |
| 790 return CObject::IllegalArgumentError(); | 766 return CObject::IllegalArgumentError(); |
| 791 } | 767 } |
| 792 | 768 |
| 793 | 769 |
| 794 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { | 770 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { |
| 795 intptr_t socket = | 771 intptr_t socket = |
| 796 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 772 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 797 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 773 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 798 intptr_t protocol = | 774 intptr_t protocol = static_cast<intptr_t>( |
| 799 static_cast<intptr_t>( | 775 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); |
| 800 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); | |
| 801 bool ok = false; | 776 bool ok = false; |
| 802 switch (option) { | 777 switch (option) { |
| 803 case 0: { // TCP_NODELAY. | 778 case 0: { // TCP_NODELAY. |
| 804 bool enabled; | 779 bool enabled; |
| 805 ok = Socket::GetNoDelay(socket, &enabled); | 780 ok = Socket::GetNoDelay(socket, &enabled); |
| 806 if (ok) { | 781 if (ok) { |
| 807 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); | 782 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); |
| 808 } | 783 } |
| 809 break; | 784 break; |
| 810 } | 785 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 } | 821 } |
| 847 } | 822 } |
| 848 | 823 |
| 849 | 824 |
| 850 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { | 825 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { |
| 851 bool result = false; | 826 bool result = false; |
| 852 intptr_t socket = | 827 intptr_t socket = |
| 853 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 828 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 854 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 829 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 855 int64_t protocol = DartUtils::GetInt64ValueCheckRange( | 830 int64_t protocol = DartUtils::GetInt64ValueCheckRange( |
| 856 Dart_GetNativeArgument(args, 2), | 831 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4, |
| 857 SocketAddress::TYPE_IPV4, | |
| 858 SocketAddress::TYPE_IPV6); | 832 SocketAddress::TYPE_IPV6); |
| 859 switch (option) { | 833 switch (option) { |
| 860 case 0: // TCP_NODELAY. | 834 case 0: // TCP_NODELAY. |
| 861 result = Socket::SetNoDelay( | 835 result = Socket::SetNoDelay( |
| 862 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | 836 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); |
| 863 break; | 837 break; |
| 864 case 1: // IP_MULTICAST_LOOP. | 838 case 1: // IP_MULTICAST_LOOP. |
| 865 result = Socket::SetMulticastLoop( | 839 result = Socket::SetMulticastLoop( |
| 866 socket, | 840 socket, protocol, |
| 867 protocol, | |
| 868 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | 841 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); |
| 869 break; | 842 break; |
| 870 case 2: // IP_MULTICAST_TTL. | 843 case 2: // IP_MULTICAST_TTL. |
| 871 result = Socket::SetMulticastHops( | 844 result = Socket::SetMulticastHops( |
| 872 socket, | 845 socket, protocol, |
| 873 protocol, | |
| 874 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3))); | 846 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3))); |
| 875 break; | 847 break; |
| 876 case 3: { // IP_MULTICAST_IF. | 848 case 3: { // IP_MULTICAST_IF. |
| 877 UNIMPLEMENTED(); | 849 UNIMPLEMENTED(); |
| 878 break; | 850 break; |
| 879 } | 851 } |
| 880 case 4: // IP_BROADCAST. | 852 case 4: // IP_BROADCAST. |
| 881 result = Socket::SetBroadcast( | 853 result = Socket::SetBroadcast( |
| 882 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); | 854 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); |
| 883 break; | 855 break; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 if (Dart_IsError(err)) { | 919 if (Dart_IsError(err)) { |
| 948 Dart_PropagateError(err); | 920 Dart_PropagateError(err); |
| 949 } | 921 } |
| 950 return socket; | 922 return socket; |
| 951 } | 923 } |
| 952 | 924 |
| 953 } // namespace bin | 925 } // namespace bin |
| 954 } // namespace dart | 926 } // namespace dart |
| 955 | 927 |
| 956 #endif // !defined(DART_IO_DISABLED) | 928 #endif // !defined(DART_IO_DISABLED) |
| OLD | NEW |