| 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/eventhandler.h" | 10 #include "bin/eventhandler.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 | 28 |
| 29 bool short_socket_read = false; | 29 bool short_socket_read = false; |
| 30 | 30 |
| 31 bool short_socket_write = false; | 31 bool short_socket_write = false; |
| 32 | 32 |
| 33 void ListeningSocketRegistry::Initialize() { | 33 void ListeningSocketRegistry::Initialize() { |
| 34 ASSERT(globalTcpListeningSocketRegistry == NULL); | 34 ASSERT(globalTcpListeningSocketRegistry == NULL); |
| 35 globalTcpListeningSocketRegistry = new ListeningSocketRegistry(); | 35 globalTcpListeningSocketRegistry = new ListeningSocketRegistry(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 | |
| 39 ListeningSocketRegistry* ListeningSocketRegistry::Instance() { | 38 ListeningSocketRegistry* ListeningSocketRegistry::Instance() { |
| 40 return globalTcpListeningSocketRegistry; | 39 return globalTcpListeningSocketRegistry; |
| 41 } | 40 } |
| 42 | 41 |
| 43 | |
| 44 void ListeningSocketRegistry::Cleanup() { | 42 void ListeningSocketRegistry::Cleanup() { |
| 45 delete globalTcpListeningSocketRegistry; | 43 delete globalTcpListeningSocketRegistry; |
| 46 globalTcpListeningSocketRegistry = NULL; | 44 globalTcpListeningSocketRegistry = NULL; |
| 47 } | 45 } |
| 48 | 46 |
| 49 | |
| 50 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort( | 47 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByPort( |
| 51 intptr_t port) { | 48 intptr_t port) { |
| 52 HashMap::Entry* entry = sockets_by_port_.Lookup( | 49 HashMap::Entry* entry = sockets_by_port_.Lookup( |
| 53 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), false); | 50 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), false); |
| 54 if (entry == NULL) { | 51 if (entry == NULL) { |
| 55 return NULL; | 52 return NULL; |
| 56 } | 53 } |
| 57 return reinterpret_cast<OSSocket*>(entry->value); | 54 return reinterpret_cast<OSSocket*>(entry->value); |
| 58 } | 55 } |
| 59 | 56 |
| 60 | |
| 61 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) { | 57 void ListeningSocketRegistry::InsertByPort(intptr_t port, OSSocket* socket) { |
| 62 HashMap::Entry* entry = sockets_by_port_.Lookup( | 58 HashMap::Entry* entry = sockets_by_port_.Lookup( |
| 63 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), true); | 59 GetHashmapKeyFromIntptr(port), GetHashmapHashFromIntptr(port), true); |
| 64 ASSERT(entry != NULL); | 60 ASSERT(entry != NULL); |
| 65 entry->value = reinterpret_cast<void*>(socket); | 61 entry->value = reinterpret_cast<void*>(socket); |
| 66 } | 62 } |
| 67 | 63 |
| 68 | |
| 69 void ListeningSocketRegistry::RemoveByPort(intptr_t port) { | 64 void ListeningSocketRegistry::RemoveByPort(intptr_t port) { |
| 70 sockets_by_port_.Remove(GetHashmapKeyFromIntptr(port), | 65 sockets_by_port_.Remove(GetHashmapKeyFromIntptr(port), |
| 71 GetHashmapHashFromIntptr(port)); | 66 GetHashmapHashFromIntptr(port)); |
| 72 } | 67 } |
| 73 | 68 |
| 74 | |
| 75 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd( | 69 ListeningSocketRegistry::OSSocket* ListeningSocketRegistry::LookupByFd( |
| 76 Socket* fd) { | 70 Socket* fd) { |
| 77 HashMap::Entry* entry = sockets_by_fd_.Lookup( | 71 HashMap::Entry* entry = sockets_by_fd_.Lookup( |
| 78 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), | 72 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), |
| 79 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), false); | 73 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), false); |
| 80 if (entry == NULL) { | 74 if (entry == NULL) { |
| 81 return NULL; | 75 return NULL; |
| 82 } | 76 } |
| 83 return reinterpret_cast<OSSocket*>(entry->value); | 77 return reinterpret_cast<OSSocket*>(entry->value); |
| 84 } | 78 } |
| 85 | 79 |
| 86 | |
| 87 void ListeningSocketRegistry::InsertByFd(Socket* fd, OSSocket* socket) { | 80 void ListeningSocketRegistry::InsertByFd(Socket* fd, OSSocket* socket) { |
| 88 HashMap::Entry* entry = sockets_by_fd_.Lookup( | 81 HashMap::Entry* entry = sockets_by_fd_.Lookup( |
| 89 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), | 82 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), |
| 90 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), true); | 83 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd)), true); |
| 91 ASSERT(entry != NULL); | 84 ASSERT(entry != NULL); |
| 92 entry->value = reinterpret_cast<void*>(socket); | 85 entry->value = reinterpret_cast<void*>(socket); |
| 93 } | 86 } |
| 94 | 87 |
| 95 | |
| 96 void ListeningSocketRegistry::RemoveByFd(Socket* fd) { | 88 void ListeningSocketRegistry::RemoveByFd(Socket* fd) { |
| 97 sockets_by_fd_.Remove( | 89 sockets_by_fd_.Remove( |
| 98 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), | 90 GetHashmapKeyFromIntptr(reinterpret_cast<intptr_t>(fd)), |
| 99 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd))); | 91 GetHashmapHashFromIntptr(reinterpret_cast<intptr_t>(fd))); |
| 100 } | 92 } |
| 101 | 93 |
| 102 | |
| 103 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, | 94 Dart_Handle ListeningSocketRegistry::CreateBindListen(Dart_Handle socket_object, |
| 104 RawAddr addr, | 95 RawAddr addr, |
| 105 intptr_t backlog, | 96 intptr_t backlog, |
| 106 bool v6_only, | 97 bool v6_only, |
| 107 bool shared) { | 98 bool shared) { |
| 108 MutexLocker ml(mutex_); | 99 MutexLocker ml(mutex_); |
| 109 | 100 |
| 110 OSSocket* first_os_socket = NULL; | 101 OSSocket* first_os_socket = NULL; |
| 111 intptr_t port = SocketAddress::GetAddrPort(addr); | 102 intptr_t port = SocketAddress::GetAddrPort(addr); |
| 112 if (port > 0) { | 103 if (port > 0) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 InsertByPort(allocated_port, os_socket); | 188 InsertByPort(allocated_port, os_socket); |
| 198 InsertByFd(socketfd, os_socket); | 189 InsertByFd(socketfd, os_socket); |
| 199 | 190 |
| 200 // We set as a side-effect the port on the dart socket_object. | 191 // We set as a side-effect the port on the dart socket_object. |
| 201 Socket::ReuseSocketIdNativeField(socket_object, socketfd, | 192 Socket::ReuseSocketIdNativeField(socket_object, socketfd, |
| 202 Socket::kFinalizerListening); | 193 Socket::kFinalizerListening); |
| 203 | 194 |
| 204 return Dart_True(); | 195 return Dart_True(); |
| 205 } | 196 } |
| 206 | 197 |
| 207 | |
| 208 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket, | 198 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket, |
| 209 bool update_hash_maps) { | 199 bool update_hash_maps) { |
| 210 ASSERT(!mutex_->TryLock()); | 200 ASSERT(!mutex_->TryLock()); |
| 211 ASSERT(os_socket != NULL); | 201 ASSERT(os_socket != NULL); |
| 212 ASSERT(os_socket->ref_count > 0); | 202 ASSERT(os_socket->ref_count > 0); |
| 213 os_socket->ref_count--; | 203 os_socket->ref_count--; |
| 214 if (os_socket->ref_count > 0) { | 204 if (os_socket->ref_count > 0) { |
| 215 return false; | 205 return false; |
| 216 } | 206 } |
| 217 if (update_hash_maps) { | 207 if (update_hash_maps) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 236 // Remove element from the list which is not the first one. | 226 // Remove element from the list which is not the first one. |
| 237 prev->next = os_socket->next; | 227 prev->next = os_socket->next; |
| 238 } | 228 } |
| 239 } | 229 } |
| 240 | 230 |
| 241 ASSERT(os_socket->ref_count == 0); | 231 ASSERT(os_socket->ref_count == 0); |
| 242 delete os_socket; | 232 delete os_socket; |
| 243 return true; | 233 return true; |
| 244 } | 234 } |
| 245 | 235 |
| 246 | |
| 247 void ListeningSocketRegistry::CloseAllSafe() { | 236 void ListeningSocketRegistry::CloseAllSafe() { |
| 248 MutexLocker ml(mutex_); | 237 MutexLocker ml(mutex_); |
| 249 | 238 |
| 250 for (HashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL; | 239 for (HashMap::Entry* cursor = sockets_by_fd_.Start(); cursor != NULL; |
| 251 cursor = sockets_by_fd_.Next(cursor)) { | 240 cursor = sockets_by_fd_.Next(cursor)) { |
| 252 CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false); | 241 CloseOneSafe(reinterpret_cast<OSSocket*>(cursor->value), false); |
| 253 } | 242 } |
| 254 } | 243 } |
| 255 | 244 |
| 256 | |
| 257 bool ListeningSocketRegistry::CloseSafe(Socket* socketfd) { | 245 bool ListeningSocketRegistry::CloseSafe(Socket* socketfd) { |
| 258 ASSERT(!mutex_->TryLock()); | 246 ASSERT(!mutex_->TryLock()); |
| 259 OSSocket* os_socket = LookupByFd(socketfd); | 247 OSSocket* os_socket = LookupByFd(socketfd); |
| 260 if (os_socket != NULL) { | 248 if (os_socket != NULL) { |
| 261 return CloseOneSafe(os_socket, true); | 249 return CloseOneSafe(os_socket, true); |
| 262 } else { | 250 } else { |
| 263 // A finalizer may direct the event handler to close a listening socket | 251 // A finalizer may direct the event handler to close a listening socket |
| 264 // that it has never seen before. In this case, we return true to direct | 252 // that it has never seen before. In this case, we return true to direct |
| 265 // the eventhandler to clean up the socket. | 253 // the eventhandler to clean up the socket. |
| 266 return true; | 254 return true; |
| 267 } | 255 } |
| 268 } | 256 } |
| 269 | 257 |
| 270 | |
| 271 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { | 258 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
| 272 RawAddr addr; | 259 RawAddr addr; |
| 273 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 260 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 274 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 261 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
| 275 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 262 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
| 276 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); | 263 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); |
| 277 intptr_t socket = Socket::CreateConnect(addr); | 264 intptr_t socket = Socket::CreateConnect(addr); |
| 278 OSError error; | 265 OSError error; |
| 279 if (socket >= 0) { | 266 if (socket >= 0) { |
| 280 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, | 267 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
| 281 Socket::kFinalizerNormal); | 268 Socket::kFinalizerNormal); |
| 282 Dart_SetReturnValue(args, Dart_True()); | 269 Dart_SetReturnValue(args, Dart_True()); |
| 283 } else { | 270 } else { |
| 284 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 271 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 285 } | 272 } |
| 286 } | 273 } |
| 287 | 274 |
| 288 | |
| 289 void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) { | 275 void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) { |
| 290 RawAddr addr; | 276 RawAddr addr; |
| 291 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 277 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 292 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 278 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
| 293 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 279 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
| 294 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); | 280 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); |
| 295 RawAddr sourceAddr; | 281 RawAddr sourceAddr; |
| 296 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 3), &sourceAddr); | 282 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 3), &sourceAddr); |
| 297 intptr_t socket = Socket::CreateBindConnect(addr, sourceAddr); | 283 intptr_t socket = Socket::CreateBindConnect(addr, sourceAddr); |
| 298 OSError error; | 284 OSError error; |
| 299 if (socket >= 0) { | 285 if (socket >= 0) { |
| 300 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, | 286 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
| 301 Socket::kFinalizerNormal); | 287 Socket::kFinalizerNormal); |
| 302 Dart_SetReturnValue(args, Dart_True()); | 288 Dart_SetReturnValue(args, Dart_True()); |
| 303 } else { | 289 } else { |
| 304 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 290 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 305 } | 291 } |
| 306 } | 292 } |
| 307 | 293 |
| 308 | |
| 309 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { | 294 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { |
| 310 RawAddr addr; | 295 RawAddr addr; |
| 311 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 296 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 312 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); | 297 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); |
| 313 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); | 298 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); |
| 314 SocketAddress::SetAddrPort(&addr, port); | 299 SocketAddress::SetAddrPort(&addr, port); |
| 315 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); | 300 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); |
| 316 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); | 301 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); |
| 317 if (socket >= 0) { | 302 if (socket >= 0) { |
| 318 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, | 303 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
| 319 Socket::kFinalizerNormal); | 304 Socket::kFinalizerNormal); |
| 320 Dart_SetReturnValue(args, Dart_True()); | 305 Dart_SetReturnValue(args, Dart_True()); |
| 321 } else { | 306 } else { |
| 322 OSError error; | 307 OSError error; |
| 323 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 308 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 324 } | 309 } |
| 325 } | 310 } |
| 326 | 311 |
| 327 | |
| 328 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { | 312 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { |
| 329 Socket* socket = | 313 Socket* socket = |
| 330 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 314 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 331 intptr_t available = SocketBase::Available(socket->fd()); | 315 intptr_t available = SocketBase::Available(socket->fd()); |
| 332 if (available >= 0) { | 316 if (available >= 0) { |
| 333 Dart_SetReturnValue(args, Dart_NewInteger(available)); | 317 Dart_SetReturnValue(args, Dart_NewInteger(available)); |
| 334 } else { | 318 } else { |
| 335 // Available failed. Mark socket as having data, to trigger a future read | 319 // Available failed. Mark socket as having data, to trigger a future read |
| 336 // event where the actual error can be reported. | 320 // event where the actual error can be reported. |
| 337 Dart_SetReturnValue(args, Dart_NewInteger(1)); | 321 Dart_SetReturnValue(args, Dart_NewInteger(1)); |
| 338 } | 322 } |
| 339 } | 323 } |
| 340 | 324 |
| 341 | |
| 342 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { | 325 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { |
| 343 Socket* socket = | 326 Socket* socket = |
| 344 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 327 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 345 int64_t length = 0; | 328 int64_t length = 0; |
| 346 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { | 329 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { |
| 347 if (short_socket_read) { | 330 if (short_socket_read) { |
| 348 length = (length + 1) / 2; | 331 length = (length + 1) / 2; |
| 349 } | 332 } |
| 350 uint8_t* buffer = NULL; | 333 uint8_t* buffer = NULL; |
| 351 Dart_Handle result = IOBuffer::Allocate(length, &buffer); | 334 Dart_Handle result = IOBuffer::Allocate(length, &buffer); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 373 } else { | 356 } else { |
| 374 ASSERT(bytes_read == -1); | 357 ASSERT(bytes_read == -1); |
| 375 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 358 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 376 } | 359 } |
| 377 } else { | 360 } else { |
| 378 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 361 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| 379 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 362 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 380 } | 363 } |
| 381 } | 364 } |
| 382 | 365 |
| 383 | |
| 384 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { | 366 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { |
| 385 Socket* socket = | 367 Socket* socket = |
| 386 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 368 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 387 | 369 |
| 388 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can | 370 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can |
| 389 // handle 64k datagrams. | 371 // handle 64k datagrams. |
| 390 IsolateData* isolate_data = | 372 IsolateData* isolate_data = |
| 391 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); | 373 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
| 392 if (isolate_data->udp_receive_buffer == NULL) { | 374 if (isolate_data->udp_receive_buffer == NULL) { |
| 393 isolate_data->udp_receive_buffer = | 375 isolate_data->udp_receive_buffer = |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 // TODO(sgjesse): Cache the _makeDatagram function somewhere. | 426 // TODO(sgjesse): Cache the _makeDatagram function somewhere. |
| 445 Dart_Handle io_lib = Dart_LookupLibrary(DartUtils::NewString("dart:io")); | 427 Dart_Handle io_lib = Dart_LookupLibrary(DartUtils::NewString("dart:io")); |
| 446 if (Dart_IsError(io_lib)) { | 428 if (Dart_IsError(io_lib)) { |
| 447 Dart_PropagateError(io_lib); | 429 Dart_PropagateError(io_lib); |
| 448 } | 430 } |
| 449 Dart_Handle result = Dart_Invoke( | 431 Dart_Handle result = Dart_Invoke( |
| 450 io_lib, DartUtils::NewString("_makeDatagram"), kNumArgs, dart_args); | 432 io_lib, DartUtils::NewString("_makeDatagram"), kNumArgs, dart_args); |
| 451 Dart_SetReturnValue(args, result); | 433 Dart_SetReturnValue(args, result); |
| 452 } | 434 } |
| 453 | 435 |
| 454 | |
| 455 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { | 436 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { |
| 456 Socket* socket = | 437 Socket* socket = |
| 457 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 438 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 458 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 439 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 459 ASSERT(Dart_IsList(buffer_obj)); | 440 ASSERT(Dart_IsList(buffer_obj)); |
| 460 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 441 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 461 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 442 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 462 bool short_write = false; | 443 bool short_write = false; |
| 463 if (short_socket_write) { | 444 if (short_socket_write) { |
| 464 if (length > 1) { | 445 if (length > 1) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 488 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); | 469 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
| 489 } | 470 } |
| 490 } else { | 471 } else { |
| 491 // Extract OSError before we release data, as it may override the error. | 472 // Extract OSError before we release data, as it may override the error. |
| 492 OSError os_error; | 473 OSError os_error; |
| 493 Dart_TypedDataReleaseData(buffer_obj); | 474 Dart_TypedDataReleaseData(buffer_obj); |
| 494 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 475 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 495 } | 476 } |
| 496 } | 477 } |
| 497 | 478 |
| 498 | |
| 499 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { | 479 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { |
| 500 Socket* socket = | 480 Socket* socket = |
| 501 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 481 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 502 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 482 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 503 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 483 intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 504 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 484 intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 505 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); | 485 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); |
| 506 ASSERT(Dart_IsList(address_obj)); | 486 ASSERT(Dart_IsList(address_obj)); |
| 507 RawAddr addr; | 487 RawAddr addr; |
| 508 SocketAddress::GetSockAddr(address_obj, &addr); | 488 SocketAddress::GetSockAddr(address_obj, &addr); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 525 Dart_TypedDataReleaseData(buffer_obj); | 505 Dart_TypedDataReleaseData(buffer_obj); |
| 526 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); | 506 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
| 527 } else { | 507 } else { |
| 528 // Extract OSError before we release data, as it may override the error. | 508 // Extract OSError before we release data, as it may override the error. |
| 529 OSError os_error; | 509 OSError os_error; |
| 530 Dart_TypedDataReleaseData(buffer_obj); | 510 Dart_TypedDataReleaseData(buffer_obj); |
| 531 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 511 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 532 } | 512 } |
| 533 } | 513 } |
| 534 | 514 |
| 535 | |
| 536 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { | 515 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { |
| 537 Socket* socket = | 516 Socket* socket = |
| 538 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 517 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 539 OSError os_error; | 518 OSError os_error; |
| 540 intptr_t port = SocketBase::GetPort(socket->fd()); | 519 intptr_t port = SocketBase::GetPort(socket->fd()); |
| 541 if (port > 0) { | 520 if (port > 0) { |
| 542 Dart_SetReturnValue(args, Dart_NewInteger(port)); | 521 Dart_SetReturnValue(args, Dart_NewInteger(port)); |
| 543 } else { | 522 } else { |
| 544 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 523 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 545 } | 524 } |
| 546 } | 525 } |
| 547 | 526 |
| 548 | |
| 549 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { | 527 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { |
| 550 Socket* socket = | 528 Socket* socket = |
| 551 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 529 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 552 OSError os_error; | 530 OSError os_error; |
| 553 intptr_t port = 0; | 531 intptr_t port = 0; |
| 554 SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port); | 532 SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port); |
| 555 if (addr != NULL) { | 533 if (addr != NULL) { |
| 556 Dart_Handle list = Dart_NewList(2); | 534 Dart_Handle list = Dart_NewList(2); |
| 557 | 535 |
| 558 Dart_Handle entry = Dart_NewList(3); | 536 Dart_Handle entry = Dart_NewList(3); |
| 559 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); | 537 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); |
| 560 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); | 538 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); |
| 561 | 539 |
| 562 RawAddr raw = addr->addr(); | 540 RawAddr raw = addr->addr(); |
| 563 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw)); | 541 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw)); |
| 564 | 542 |
| 565 Dart_ListSetAt(list, 0, entry); | 543 Dart_ListSetAt(list, 0, entry); |
| 566 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); | 544 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); |
| 567 Dart_SetReturnValue(args, list); | 545 Dart_SetReturnValue(args, list); |
| 568 delete addr; | 546 delete addr; |
| 569 } else { | 547 } else { |
| 570 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 548 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 571 } | 549 } |
| 572 } | 550 } |
| 573 | 551 |
| 574 | |
| 575 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { | 552 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { |
| 576 Socket* socket = | 553 Socket* socket = |
| 577 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 554 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 578 OSError os_error; | 555 OSError os_error; |
| 579 SocketBase::GetError(socket->fd(), &os_error); | 556 SocketBase::GetError(socket->fd(), &os_error); |
| 580 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 557 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 581 } | 558 } |
| 582 | 559 |
| 583 | |
| 584 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) { | 560 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) { |
| 585 Socket* socket = | 561 Socket* socket = |
| 586 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 562 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 587 OSError os_error; | 563 OSError os_error; |
| 588 intptr_t type = SocketBase::GetType(socket->fd()); | 564 intptr_t type = SocketBase::GetType(socket->fd()); |
| 589 if (type >= 0) { | 565 if (type >= 0) { |
| 590 Dart_SetReturnValue(args, Dart_NewInteger(type)); | 566 Dart_SetReturnValue(args, Dart_NewInteger(type)); |
| 591 } else { | 567 } else { |
| 592 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 568 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 593 } | 569 } |
| 594 } | 570 } |
| 595 | 571 |
| 596 | |
| 597 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { | 572 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
| 598 int64_t num = | 573 int64_t num = |
| 599 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); | 574 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); |
| 600 intptr_t socket = SocketBase::GetStdioHandle(num); | 575 intptr_t socket = SocketBase::GetStdioHandle(num); |
| 601 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, | 576 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, |
| 602 Socket::kFinalizerStdio); | 577 Socket::kFinalizerStdio); |
| 603 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); | 578 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); |
| 604 } | 579 } |
| 605 | 580 |
| 606 | |
| 607 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { | 581 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { |
| 608 Socket* socket = | 582 Socket* socket = |
| 609 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 583 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 610 intptr_t id = reinterpret_cast<intptr_t>(socket); | 584 intptr_t id = reinterpret_cast<intptr_t>(socket); |
| 611 Dart_SetReturnValue(args, Dart_NewInteger(id)); | 585 Dart_SetReturnValue(args, Dart_NewInteger(id)); |
| 612 } | 586 } |
| 613 | 587 |
| 614 | |
| 615 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { | 588 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { |
| 616 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 589 intptr_t id = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
| 617 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id, | 590 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id, |
| 618 Socket::kFinalizerNormal); | 591 Socket::kFinalizerNormal); |
| 619 } | 592 } |
| 620 | 593 |
| 621 | |
| 622 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { | 594 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| 623 RawAddr addr; | 595 RawAddr addr; |
| 624 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 596 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 625 int64_t port = DartUtils::GetInt64ValueCheckRange( | 597 int64_t port = DartUtils::GetInt64ValueCheckRange( |
| 626 Dart_GetNativeArgument(args, 2), 0, 65535); | 598 Dart_GetNativeArgument(args, 2), 0, 65535); |
| 627 SocketAddress::SetAddrPort(&addr, port); | 599 SocketAddress::SetAddrPort(&addr, port); |
| 628 int64_t backlog = DartUtils::GetInt64ValueCheckRange( | 600 int64_t backlog = DartUtils::GetInt64ValueCheckRange( |
| 629 Dart_GetNativeArgument(args, 3), 0, 65535); | 601 Dart_GetNativeArgument(args, 3), 0, 65535); |
| 630 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); | 602 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); |
| 631 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); | 603 bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); |
| 632 | 604 |
| 633 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); | 605 Dart_Handle socket_object = Dart_GetNativeArgument(args, 0); |
| 634 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( | 606 Dart_Handle result = ListeningSocketRegistry::Instance()->CreateBindListen( |
| 635 socket_object, addr, backlog, v6_only, shared); | 607 socket_object, addr, backlog, v6_only, shared); |
| 636 Dart_SetReturnValue(args, result); | 608 Dart_SetReturnValue(args, result); |
| 637 } | 609 } |
| 638 | 610 |
| 639 | |
| 640 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { | 611 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
| 641 Socket* socket = | 612 Socket* socket = |
| 642 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 613 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 643 intptr_t new_socket = ServerSocket::Accept(socket->fd()); | 614 intptr_t new_socket = ServerSocket::Accept(socket->fd()); |
| 644 if (new_socket >= 0) { | 615 if (new_socket >= 0) { |
| 645 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket, | 616 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket, |
| 646 Socket::kFinalizerNormal); | 617 Socket::kFinalizerNormal); |
| 647 Dart_SetReturnValue(args, Dart_True()); | 618 Dart_SetReturnValue(args, Dart_True()); |
| 648 } else if (new_socket == ServerSocket::kTemporaryFailure) { | 619 } else if (new_socket == ServerSocket::kTemporaryFailure) { |
| 649 Dart_SetReturnValue(args, Dart_False()); | 620 Dart_SetReturnValue(args, Dart_False()); |
| 650 } else { | 621 } else { |
| 651 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 622 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 652 } | 623 } |
| 653 } | 624 } |
| 654 | 625 |
| 655 | |
| 656 CObject* Socket::LookupRequest(const CObjectArray& request) { | 626 CObject* Socket::LookupRequest(const CObjectArray& request) { |
| 657 if ((request.Length() == 2) && request[0]->IsString() && | 627 if ((request.Length() == 2) && request[0]->IsString() && |
| 658 request[1]->IsInt32()) { | 628 request[1]->IsInt32()) { |
| 659 CObjectString host(request[0]); | 629 CObjectString host(request[0]); |
| 660 CObjectInt32 type(request[1]); | 630 CObjectInt32 type(request[1]); |
| 661 CObject* result = NULL; | 631 CObject* result = NULL; |
| 662 OSError* os_error = NULL; | 632 OSError* os_error = NULL; |
| 663 AddressList<SocketAddress>* addresses = | 633 AddressList<SocketAddress>* addresses = |
| 664 SocketBase::LookupAddress(host.CString(), type.Value(), &os_error); | 634 SocketBase::LookupAddress(host.CString(), type.Value(), &os_error); |
| 665 if (addresses != NULL) { | 635 if (addresses != NULL) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 688 delete addresses; | 658 delete addresses; |
| 689 } else { | 659 } else { |
| 690 result = CObject::NewOSError(os_error); | 660 result = CObject::NewOSError(os_error); |
| 691 delete os_error; | 661 delete os_error; |
| 692 } | 662 } |
| 693 return result; | 663 return result; |
| 694 } | 664 } |
| 695 return CObject::IllegalArgumentError(); | 665 return CObject::IllegalArgumentError(); |
| 696 } | 666 } |
| 697 | 667 |
| 698 | |
| 699 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { | 668 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { |
| 700 if ((request.Length() == 1) && request[0]->IsTypedData()) { | 669 if ((request.Length() == 1) && request[0]->IsTypedData()) { |
| 701 CObjectUint8Array addr_object(request[0]); | 670 CObjectUint8Array addr_object(request[0]); |
| 702 RawAddr addr; | 671 RawAddr addr; |
| 703 int len = addr_object.Length(); | 672 int len = addr_object.Length(); |
| 704 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); | 673 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr)); |
| 705 if (len == sizeof(in_addr)) { | 674 if (len == sizeof(in_addr)) { |
| 706 addr.in.sin_family = AF_INET; | 675 addr.in.sin_family = AF_INET; |
| 707 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), addr_object.Buffer(), | 676 memmove(reinterpret_cast<void*>(&addr.in.sin_addr), addr_object.Buffer(), |
| 708 len); | 677 len); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 720 return new CObjectString(CObject::NewString(host)); | 689 return new CObjectString(CObject::NewString(host)); |
| 721 } else { | 690 } else { |
| 722 CObject* result = CObject::NewOSError(os_error); | 691 CObject* result = CObject::NewOSError(os_error); |
| 723 delete os_error; | 692 delete os_error; |
| 724 return result; | 693 return result; |
| 725 } | 694 } |
| 726 } | 695 } |
| 727 return CObject::IllegalArgumentError(); | 696 return CObject::IllegalArgumentError(); |
| 728 } | 697 } |
| 729 | 698 |
| 730 | |
| 731 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { | 699 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { |
| 732 if ((request.Length() == 1) && request[0]->IsInt32()) { | 700 if ((request.Length() == 1) && request[0]->IsInt32()) { |
| 733 CObjectInt32 type(request[0]); | 701 CObjectInt32 type(request[0]); |
| 734 CObject* result = NULL; | 702 CObject* result = NULL; |
| 735 OSError* os_error = NULL; | 703 OSError* os_error = NULL; |
| 736 AddressList<InterfaceSocketAddress>* addresses = | 704 AddressList<InterfaceSocketAddress>* addresses = |
| 737 SocketBase::ListInterfaces(type.Value(), &os_error); | 705 SocketBase::ListInterfaces(type.Value(), &os_error); |
| 738 if (addresses != NULL) { | 706 if (addresses != NULL) { |
| 739 CObjectArray* array = | 707 CObjectArray* array = |
| 740 new CObjectArray(CObject::NewArray(addresses->count() + 1)); | 708 new CObjectArray(CObject::NewArray(addresses->count() + 1)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 770 delete addresses; | 738 delete addresses; |
| 771 } else { | 739 } else { |
| 772 result = CObject::NewOSError(os_error); | 740 result = CObject::NewOSError(os_error); |
| 773 delete os_error; | 741 delete os_error; |
| 774 } | 742 } |
| 775 return result; | 743 return result; |
| 776 } | 744 } |
| 777 return CObject::IllegalArgumentError(); | 745 return CObject::IllegalArgumentError(); |
| 778 } | 746 } |
| 779 | 747 |
| 780 | |
| 781 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { | 748 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { |
| 782 Socket* socket = | 749 Socket* socket = |
| 783 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 750 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 784 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 751 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 785 intptr_t protocol = static_cast<intptr_t>( | 752 intptr_t protocol = static_cast<intptr_t>( |
| 786 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); | 753 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); |
| 787 bool ok = false; | 754 bool ok = false; |
| 788 switch (option) { | 755 switch (option) { |
| 789 case 0: { // TCP_NODELAY. | 756 case 0: { // TCP_NODELAY. |
| 790 bool enabled; | 757 bool enabled; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 default: | 792 default: |
| 826 UNREACHABLE(); | 793 UNREACHABLE(); |
| 827 break; | 794 break; |
| 828 } | 795 } |
| 829 // In case of failure the return value is not set above. | 796 // In case of failure the return value is not set above. |
| 830 if (!ok) { | 797 if (!ok) { |
| 831 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 798 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 832 } | 799 } |
| 833 } | 800 } |
| 834 | 801 |
| 835 | |
| 836 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { | 802 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { |
| 837 bool result = false; | 803 bool result = false; |
| 838 Socket* socket = | 804 Socket* socket = |
| 839 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 805 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 840 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 806 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); |
| 841 int64_t protocol = DartUtils::GetInt64ValueCheckRange( | 807 int64_t protocol = DartUtils::GetInt64ValueCheckRange( |
| 842 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4, | 808 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4, |
| 843 SocketAddress::TYPE_IPV6); | 809 SocketAddress::TYPE_IPV6); |
| 844 switch (option) { | 810 switch (option) { |
| 845 case 0: // TCP_NODELAY. | 811 case 0: // TCP_NODELAY. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 870 Dart_PropagateError(Dart_NewApiError("Value outside expected range")); | 836 Dart_PropagateError(Dart_NewApiError("Value outside expected range")); |
| 871 break; | 837 break; |
| 872 } | 838 } |
| 873 if (result) { | 839 if (result) { |
| 874 Dart_SetReturnValue(args, Dart_Null()); | 840 Dart_SetReturnValue(args, Dart_Null()); |
| 875 } else { | 841 } else { |
| 876 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 842 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 877 } | 843 } |
| 878 } | 844 } |
| 879 | 845 |
| 880 | |
| 881 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { | 846 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { |
| 882 Socket* socket = | 847 Socket* socket = |
| 883 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 848 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 884 RawAddr addr; | 849 RawAddr addr; |
| 885 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 850 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 886 RawAddr interface; | 851 RawAddr interface; |
| 887 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | 852 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { |
| 888 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | 853 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); |
| 889 } | 854 } |
| 890 int interfaceIndex = | 855 int interfaceIndex = |
| 891 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | 856 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); |
| 892 if (SocketBase::JoinMulticast(socket->fd(), addr, interface, | 857 if (SocketBase::JoinMulticast(socket->fd(), addr, interface, |
| 893 interfaceIndex)) { | 858 interfaceIndex)) { |
| 894 Dart_SetReturnValue(args, Dart_Null()); | 859 Dart_SetReturnValue(args, Dart_Null()); |
| 895 } else { | 860 } else { |
| 896 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 861 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 897 } | 862 } |
| 898 } | 863 } |
| 899 | 864 |
| 900 | |
| 901 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { | 865 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { |
| 902 Socket* socket = | 866 Socket* socket = |
| 903 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 867 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 904 RawAddr addr; | 868 RawAddr addr; |
| 905 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); | 869 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 906 RawAddr interface; | 870 RawAddr interface; |
| 907 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { | 871 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { |
| 908 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); | 872 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); |
| 909 } | 873 } |
| 910 int interfaceIndex = | 874 int interfaceIndex = |
| 911 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); | 875 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); |
| 912 if (SocketBase::LeaveMulticast(socket->fd(), addr, interface, | 876 if (SocketBase::LeaveMulticast(socket->fd(), addr, interface, |
| 913 interfaceIndex)) { | 877 interfaceIndex)) { |
| 914 Dart_SetReturnValue(args, Dart_Null()); | 878 Dart_SetReturnValue(args, Dart_Null()); |
| 915 } else { | 879 } else { |
| 916 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 880 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 917 } | 881 } |
| 918 } | 882 } |
| 919 | 883 |
| 920 | |
| 921 static void NormalSocketFinalizer(void* isolate_data, | 884 static void NormalSocketFinalizer(void* isolate_data, |
| 922 Dart_WeakPersistentHandle handle, | 885 Dart_WeakPersistentHandle handle, |
| 923 void* data) { | 886 void* data) { |
| 924 Socket* socket = reinterpret_cast<Socket*>(data); | 887 Socket* socket = reinterpret_cast<Socket*>(data); |
| 925 if (socket->fd() >= 0) { | 888 if (socket->fd() >= 0) { |
| 926 const int64_t flags = 1 << kCloseCommand; | 889 const int64_t flags = 1 << kCloseCommand; |
| 927 socket->Retain(); | 890 socket->Retain(); |
| 928 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), | 891 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), |
| 929 socket->port(), flags); | 892 socket->port(), flags); |
| 930 } | 893 } |
| 931 socket->Release(); | 894 socket->Release(); |
| 932 } | 895 } |
| 933 | 896 |
| 934 | |
| 935 static void ListeningSocketFinalizer(void* isolate_data, | 897 static void ListeningSocketFinalizer(void* isolate_data, |
| 936 Dart_WeakPersistentHandle handle, | 898 Dart_WeakPersistentHandle handle, |
| 937 void* data) { | 899 void* data) { |
| 938 Socket* socket = reinterpret_cast<Socket*>(data); | 900 Socket* socket = reinterpret_cast<Socket*>(data); |
| 939 if (socket->fd() >= 0) { | 901 if (socket->fd() >= 0) { |
| 940 const int64_t flags = (1 << kListeningSocket) | (1 << kCloseCommand); | 902 const int64_t flags = (1 << kListeningSocket) | (1 << kCloseCommand); |
| 941 socket->Retain(); | 903 socket->Retain(); |
| 942 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), | 904 EventHandler::SendFromNative(reinterpret_cast<intptr_t>(socket), |
| 943 socket->port(), flags); | 905 socket->port(), flags); |
| 944 } | 906 } |
| 945 socket->Release(); | 907 socket->Release(); |
| 946 } | 908 } |
| 947 | 909 |
| 948 | |
| 949 static void StdioSocketFinalizer(void* isolate_data, | 910 static void StdioSocketFinalizer(void* isolate_data, |
| 950 Dart_WeakPersistentHandle handle, | 911 Dart_WeakPersistentHandle handle, |
| 951 void* data) { | 912 void* data) { |
| 952 Socket* socket = reinterpret_cast<Socket*>(data); | 913 Socket* socket = reinterpret_cast<Socket*>(data); |
| 953 if (socket->fd() >= 0) { | 914 if (socket->fd() >= 0) { |
| 954 socket->SetClosedFd(); | 915 socket->SetClosedFd(); |
| 955 } | 916 } |
| 956 socket->Release(); | 917 socket->Release(); |
| 957 } | 918 } |
| 958 | 919 |
| 959 | |
| 960 void Socket::ReuseSocketIdNativeField(Dart_Handle handle, | 920 void Socket::ReuseSocketIdNativeField(Dart_Handle handle, |
| 961 Socket* socket, | 921 Socket* socket, |
| 962 SocketFinalizer finalizer) { | 922 SocketFinalizer finalizer) { |
| 963 Dart_Handle err = Dart_SetNativeInstanceField( | 923 Dart_Handle err = Dart_SetNativeInstanceField( |
| 964 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); | 924 handle, kSocketIdNativeField, reinterpret_cast<intptr_t>(socket)); |
| 965 if (Dart_IsError(err)) { | 925 if (Dart_IsError(err)) { |
| 966 Dart_PropagateError(err); | 926 Dart_PropagateError(err); |
| 967 } | 927 } |
| 968 Dart_WeakPersistentHandleFinalizer callback; | 928 Dart_WeakPersistentHandleFinalizer callback; |
| 969 switch (finalizer) { | 929 switch (finalizer) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 980 callback = NULL; | 940 callback = NULL; |
| 981 UNREACHABLE(); | 941 UNREACHABLE(); |
| 982 break; | 942 break; |
| 983 } | 943 } |
| 984 if (callback != NULL) { | 944 if (callback != NULL) { |
| 985 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), | 945 Dart_NewWeakPersistentHandle(handle, reinterpret_cast<void*>(socket), |
| 986 sizeof(Socket), callback); | 946 sizeof(Socket), callback); |
| 987 } | 947 } |
| 988 } | 948 } |
| 989 | 949 |
| 990 | |
| 991 void Socket::SetSocketIdNativeField(Dart_Handle handle, | 950 void Socket::SetSocketIdNativeField(Dart_Handle handle, |
| 992 intptr_t id, | 951 intptr_t id, |
| 993 SocketFinalizer finalizer) { | 952 SocketFinalizer finalizer) { |
| 994 Socket* socket = new Socket(id); | 953 Socket* socket = new Socket(id); |
| 995 ReuseSocketIdNativeField(handle, socket, finalizer); | 954 ReuseSocketIdNativeField(handle, socket, finalizer); |
| 996 } | 955 } |
| 997 | 956 |
| 998 | |
| 999 Socket* Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { | 957 Socket* Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { |
| 1000 intptr_t id; | 958 intptr_t id; |
| 1001 Dart_Handle err = | 959 Dart_Handle err = |
| 1002 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id); | 960 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &id); |
| 1003 if (Dart_IsError(err)) { | 961 if (Dart_IsError(err)) { |
| 1004 Dart_PropagateError(err); | 962 Dart_PropagateError(err); |
| 1005 } | 963 } |
| 1006 Socket* socket = reinterpret_cast<Socket*>(id); | 964 Socket* socket = reinterpret_cast<Socket*>(id); |
| 1007 return socket; | 965 return socket; |
| 1008 } | 966 } |
| 1009 | 967 |
| 1010 } // namespace bin | 968 } // namespace bin |
| 1011 } // namespace dart | 969 } // namespace dart |
| 1012 | 970 |
| 1013 #endif // !defined(DART_IO_DISABLED) | 971 #endif // !defined(DART_IO_DISABLED) |
| OLD | NEW |