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

Side by Side Diff: runtime/bin/socket.cc

Issue 113923004: Only store the address bytes for an internet address in Dart (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_patch.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/io_buffer.h" 5 #include "bin/io_buffer.h"
6 #include "bin/isolate_data.h" 6 #include "bin/isolate_data.h"
7 #include "bin/socket.h" 7 #include "bin/socket.h"
8 #include "bin/dartutils.h" 8 #include "bin/dartutils.h"
9 #include "bin/thread.h" 9 #include "bin/thread.h"
10 #include "bin/utils.h" 10 #include "bin/utils.h"
11 11
12 #include "platform/globals.h" 12 #include "platform/globals.h"
13 #include "platform/thread.h" 13 #include "platform/thread.h"
14 #include "platform/utils.h" 14 #include "platform/utils.h"
15 15
16 #include "include/dart_api.h" 16 #include "include/dart_api.h"
17 17
18 namespace dart { 18 namespace dart {
19 namespace bin { 19 namespace bin {
20 20
21 static const int kSocketIdNativeField = 0; 21 static const int kSocketIdNativeField = 0;
22 22
23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); 23 dart::Mutex* Socket::mutex_ = new dart::Mutex();
24 int Socket::service_ports_size_ = 0; 24 int Socket::service_ports_size_ = 0;
25 Dart_Port* Socket::service_ports_ = NULL; 25 Dart_Port* Socket::service_ports_ = NULL;
26 int Socket::service_ports_index_ = 0; 26 int Socket::service_ports_index_ = 0;
27 27
28 28
29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) {
30 Dart_TypedData_Type data_type;
31 uint8_t* data = NULL;
32 intptr_t len;
33 Dart_Handle result = Dart_TypedDataAcquireData(
34 obj, &data_type, reinterpret_cast<void**>(&data), &len);
35 if (Dart_IsError(result)) Dart_PropagateError(result);
36 if (data_type != Dart_TypedData_kUint8) {
37 Dart_PropagateError(Dart_NewApiError("Unexpected type for socket address"));
38 }
39 memmove(reinterpret_cast<void *>(addr), data, len);
40 Dart_TypedDataReleaseData(obj);
41 }
42
43
44 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) {
45 int64_t id = 0;
46 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id);
47 ASSERT(ok);
48 USE(ok);
49 RawAddr raw;
50 memset(&raw, 0, sizeof(raw));
51 switch (id) {
52 case SocketAddress::ADDRESS_LOOPBACK_IP_V4: {
53 raw.in.sin_family = AF_INET;
54 raw.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
55 break;
56 }
57 case SocketAddress::ADDRESS_LOOPBACK_IP_V6: {
58 raw.in6.sin6_family = AF_INET6;
59 raw.in6.sin6_addr = in6addr_loopback;
60 break;
61 }
62 case SocketAddress::ADDRESS_ANY_IP_V4: {
63 raw.in.sin_family = AF_INET;
64 raw.in.sin_addr.s_addr = INADDR_ANY;
65 break;
66 }
67 case SocketAddress::ADDRESS_ANY_IP_V6: {
68 raw.in6.sin6_family = AF_INET6;
69 raw.in6.sin6_addr = in6addr_any;
70 break;
71 }
72 default:
73 Dart_Handle error = DartUtils::NewDartArgumentError("");
74 if (Dart_IsError(error)) Dart_PropagateError(error);
75 Dart_ThrowException(error);
76 }
77 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw));
78 }
79
80
81 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) { 29 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
82 int64_t type = 0;
83 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &type);
84 ASSERT(ok);
85 USE(ok);
86 const char* address = 30 const char* address =
87 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); 31 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
88 ASSERT(address != NULL); 32 ASSERT(address != NULL);
89 RawAddr raw; 33 RawAddr raw;
90 memset(&raw, 0, sizeof(raw)); 34 memset(&raw, 0, sizeof(raw));
35 int type = strchr(address, ':') == NULL ? SocketAddress::TYPE_IPV4
36 : SocketAddress::TYPE_IPV6;
91 if (type == SocketAddress::TYPE_IPV4) { 37 if (type == SocketAddress::TYPE_IPV4) {
92 raw.addr.sa_family = AF_INET; 38 raw.addr.sa_family = AF_INET;
93 } else { 39 } else {
94 ASSERT(type == SocketAddress::TYPE_IPV6);
95 raw.addr.sa_family = AF_INET6; 40 raw.addr.sa_family = AF_INET6;
96 } 41 }
97 ok = Socket::ParseAddress(type, address, &raw); 42 bool ok = Socket::ParseAddress(type, address, &raw);
98 if (!ok) { 43 if (!ok) {
99 Dart_SetReturnValue(args, Dart_Null()); 44 Dart_SetReturnValue(args, Dart_Null());
100 } else { 45 } else {
101 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw)); 46 Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw));
102 } 47 }
103 } 48 }
104 49
105 50
106 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 51 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
107 RawAddr addr; 52 RawAddr addr;
108 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 53 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
109 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 54 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
110 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 55 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
111 intptr_t socket = Socket::CreateConnect(addr, port); 56 intptr_t socket = Socket::CreateConnect(addr, port);
112 OSError error; 57 OSError error;
113 if (socket >= 0) { 58 if (socket >= 0) {
114 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); 59 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
115 Dart_SetReturnValue(args, Dart_True()); 60 Dart_SetReturnValue(args, Dart_True());
116 } else { 61 } else {
117 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 62 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
118 } 63 }
119 } 64 }
120 65
121 66
122 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { 67 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
123 RawAddr addr; 68 RawAddr addr;
124 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 69 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
125 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 70 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
126 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 71 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
127 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); 72 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
128 intptr_t socket = Socket::CreateBindDatagram(&addr, port, reuse_addr); 73 intptr_t socket = Socket::CreateBindDatagram(&addr, port, reuse_addr);
129 if (socket >= 0) { 74 if (socket >= 0) {
130 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); 75 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
131 Dart_SetReturnValue(args, Dart_True()); 76 Dart_SetReturnValue(args, Dart_True());
132 } else { 77 } else {
133 OSError error; 78 OSError error;
134 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 79 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 addr.in.sin_port = 0; 183 addr.in.sin_port = 0;
239 } else { 184 } else {
240 ASSERT(addr.addr.sa_family == AF_INET6); 185 ASSERT(addr.addr.sa_family == AF_INET6);
241 addr.in6.sin6_port = 0; 186 addr.in6.sin6_port = 0;
242 } 187 }
243 // Format the address to a string using the numeric format. 188 // Format the address to a string using the numeric format.
244 char numeric_address[INET6_ADDRSTRLEN]; 189 char numeric_address[INET6_ADDRSTRLEN];
245 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN); 190 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN);
246 191
247 // Create a Datagram object with the data and sender address and port. 192 // Create a Datagram object with the data and sender address and port.
248 const int kNumArgs = 5; 193 const int kNumArgs = 4;
249 Dart_Handle dart_args[kNumArgs]; 194 Dart_Handle dart_args[kNumArgs];
250 dart_args[0] = data; 195 dart_args[0] = data;
251 dart_args[1] = Dart_NewBoolean(addr.addr.sa_family == AF_INET6); 196 dart_args[1] = Dart_NewStringFromCString(numeric_address);
252 dart_args[2] = Dart_NewStringFromCString(numeric_address); 197 if (Dart_IsError(dart_args[1])) Dart_PropagateError(dart_args[1]);
253 if (Dart_IsError(dart_args[2])) Dart_PropagateError(dart_args[2]); 198 dart_args[2] = SocketAddress::ToTypedData(&addr);
254 int len = SocketAddress::GetAddrLength(&addr); 199 dart_args[3] = Dart_NewInteger(port);
255 dart_args[3] = Dart_NewTypedData(Dart_TypedData_kUint8, len);
256 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]); 200 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]);
257 Dart_Handle err = Dart_ListSetAsBytes(
258 dart_args[3], 0, reinterpret_cast<uint8_t *>(&addr), len);
259 if (Dart_IsError(err)) Dart_PropagateError(err);
260 dart_args[4] = Dart_NewInteger(port);
261 if (Dart_IsError(dart_args[4])) Dart_PropagateError(dart_args[4]);
262 // TODO(sgjesse): Cache the _makeDatagram function somewhere. 201 // TODO(sgjesse): Cache the _makeDatagram function somewhere.
263 Dart_Handle io_lib = 202 Dart_Handle io_lib =
264 Dart_LookupLibrary(DartUtils::NewString("dart:io")); 203 Dart_LookupLibrary(DartUtils::NewString("dart:io"));
265 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); 204 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib);
266 Dart_Handle result = 205 Dart_Handle result =
267 Dart_Invoke(io_lib, 206 Dart_Invoke(io_lib,
268 DartUtils::NewString("_makeDatagram"), 207 DartUtils::NewString("_makeDatagram"),
269 kNumArgs, 208 kNumArgs,
270 dart_args); 209 dart_args);
271 if (Dart_IsError(result)) Dart_PropagateError(result); 210 if (Dart_IsError(result)) Dart_PropagateError(result);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 intptr_t socket = 250 intptr_t socket =
312 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 251 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
313 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 252 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
314 intptr_t offset = 253 intptr_t offset =
315 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); 254 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
316 intptr_t length = 255 intptr_t length =
317 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); 256 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
318 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); 257 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4);
319 ASSERT(Dart_IsList(address_obj)); 258 ASSERT(Dart_IsList(address_obj));
320 RawAddr addr; 259 RawAddr addr;
321 GetSockAddr(address_obj, &addr); 260 SocketAddress::GetSockAddr(address_obj, &addr);
322 int64_t port = DartUtils::GetInt64ValueCheckRange( 261 int64_t port = DartUtils::GetInt64ValueCheckRange(
323 Dart_GetNativeArgument(args, 5), 262 Dart_GetNativeArgument(args, 5),
324 0, 263 0,
325 65535); 264 65535);
326 SocketAddress::SetAddrPort(&addr, port); 265 SocketAddress::SetAddrPort(&addr, port);
327 Dart_TypedData_Type type; 266 Dart_TypedData_Type type;
328 uint8_t* buffer = NULL; 267 uint8_t* buffer = NULL;
329 intptr_t len; 268 intptr_t len;
330 Dart_Handle result = Dart_TypedDataAcquireData( 269 Dart_Handle result = Dart_TypedDataAcquireData(
331 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); 270 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 359
421 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) { 360 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
422 intptr_t id = 361 intptr_t id =
423 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); 362 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
424 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id); 363 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id);
425 } 364 }
426 365
427 366
428 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { 367 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
429 RawAddr addr; 368 RawAddr addr;
430 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 369 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
431 int64_t port = DartUtils::GetInt64ValueCheckRange( 370 int64_t port = DartUtils::GetInt64ValueCheckRange(
432 Dart_GetNativeArgument(args, 2), 371 Dart_GetNativeArgument(args, 2),
433 0, 372 0,
434 65535); 373 65535);
435 int64_t backlog = DartUtils::GetInt64ValueCheckRange( 374 int64_t backlog = DartUtils::GetInt64ValueCheckRange(
436 Dart_GetNativeArgument(args, 3), 375 Dart_GetNativeArgument(args, 3),
437 0, 376 0,
438 65535); 377 65535);
439 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); 378 bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
440 intptr_t socket = ServerSocket::CreateBindListen( 379 intptr_t socket = ServerSocket::CreateBindListen(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 428
490 CObjectInt32* type = new CObjectInt32( 429 CObjectInt32* type = new CObjectInt32(
491 CObject::NewInt32(addr->GetType())); 430 CObject::NewInt32(addr->GetType()));
492 entry->SetAt(0, type); 431 entry->SetAt(0, type);
493 432
494 CObjectString* as_string = new CObjectString(CObject::NewString( 433 CObjectString* as_string = new CObjectString(CObject::NewString(
495 addr->as_string())); 434 addr->as_string()));
496 entry->SetAt(1, as_string); 435 entry->SetAt(1, as_string);
497 436
498 RawAddr raw = addr->addr(); 437 RawAddr raw = addr->addr();
499 CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array( 438 CObjectUint8Array* data = SocketAddress::ToCObject(&raw);
500 SocketAddress::GetAddrLength(&raw))); 439 entry->SetAt(2, data);
501 memmove(data->Buffer(),
502 reinterpret_cast<void *>(&raw),
503 SocketAddress::GetAddrLength(&raw));
504 440
505 entry->SetAt(2, data);
506 array->SetAt(i + 1, entry); 441 array->SetAt(i + 1, entry);
507 } 442 }
508 result = array; 443 result = array;
509 delete addresses; 444 delete addresses;
510 } else { 445 } else {
511 result = CObject::NewOSError(os_error); 446 result = CObject::NewOSError(os_error);
512 delete os_error; 447 delete os_error;
513 } 448 }
514 return result; 449 return result;
515 } 450 }
516 return CObject::IllegalArgumentError(); 451 return CObject::IllegalArgumentError();
517 } 452 }
518 453
519 454
520 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) { 455 CObject* Socket::ReverseLookupRequest(const CObjectArray& request) {
521 if (request.Length() == 1 && 456 if (request.Length() == 1 &&
522 request[0]->IsTypedData()) { 457 request[0]->IsTypedData()) {
523 CObjectUint8Array addr_object(request[0]); 458 CObjectUint8Array addr_object(request[0]);
524 RawAddr addr; 459 RawAddr addr;
525 memmove(reinterpret_cast<void *>(&addr), 460 int len = addr_object.Length();
526 addr_object.Buffer(), 461 memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr));
527 addr_object.Length()); 462 if (len == sizeof(in_addr)) {
463 addr.in.sin_family = AF_INET;
464 memmove(reinterpret_cast<void*>(&addr.in.sin_addr),
465 addr_object.Buffer(),
466 len);
467 } else {
468 ASSERT(len == sizeof(in6_addr));
469 addr.in6.sin6_family = AF_INET6;
470 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr),
471 addr_object.Buffer(),
472 len);
473 }
474
528 OSError* os_error = NULL; 475 OSError* os_error = NULL;
529 const intptr_t kMaxHostLength = 1025; 476 const intptr_t kMaxHostLength = 1025;
530 char host[kMaxHostLength]; 477 char host[kMaxHostLength];
531 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { 478 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) {
532 return new CObjectString(CObject::NewString(host)); 479 return new CObjectString(CObject::NewString(host));
533 } else { 480 } else {
534 CObject* result = CObject::NewOSError(os_error); 481 CObject* result = CObject::NewOSError(os_error);
535 delete os_error; 482 delete os_error;
536 return result; 483 return result;
537 } 484 }
(...skipping 21 matching lines...) Expand all
559 506
560 CObjectInt32* type = new CObjectInt32( 507 CObjectInt32* type = new CObjectInt32(
561 CObject::NewInt32(addr->GetType())); 508 CObject::NewInt32(addr->GetType()));
562 entry->SetAt(0, type); 509 entry->SetAt(0, type);
563 510
564 CObjectString* as_string = new CObjectString(CObject::NewString( 511 CObjectString* as_string = new CObjectString(CObject::NewString(
565 addr->as_string())); 512 addr->as_string()));
566 entry->SetAt(1, as_string); 513 entry->SetAt(1, as_string);
567 514
568 RawAddr raw = addr->addr(); 515 RawAddr raw = addr->addr();
569 CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array( 516 CObjectUint8Array* data = SocketAddress::ToCObject(&raw);
570 SocketAddress::GetAddrLength(&raw)));
571 memmove(data->Buffer(),
572 reinterpret_cast<void *>(&raw),
573 SocketAddress::GetAddrLength(&raw));
574 entry->SetAt(2, data); 517 entry->SetAt(2, data);
575 518
576 CObjectString* interface_name = new CObjectString(CObject::NewString( 519 CObjectString* interface_name = new CObjectString(CObject::NewString(
577 interface->interface_name())); 520 interface->interface_name()));
578 entry->SetAt(3, interface_name); 521 entry->SetAt(3, interface_name);
579 522
580 CObjectInt64* interface_index = new CObjectInt64(CObject::NewInt64( 523 CObjectInt64* interface_index = new CObjectInt64(CObject::NewInt64(
581 interface->interface_index())); 524 interface->interface_index()));
582 entry->SetAt(4, interface_index); 525 entry->SetAt(4, interface_index);
583 526
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 } else { 637 } else {
695 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 638 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
696 } 639 }
697 } 640 }
698 641
699 642
700 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { 643 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) {
701 intptr_t socket = 644 intptr_t socket =
702 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 645 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
703 RawAddr addr; 646 RawAddr addr;
704 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 647 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
705 RawAddr interface; 648 RawAddr interface;
706 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 649 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
707 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 650 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
708 } 651 }
709 int interfaceIndex = 652 int interfaceIndex =
710 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 653 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
711 if (Socket::JoinMulticast(socket, &addr, &interface, interfaceIndex)) { 654 if (Socket::JoinMulticast(socket, &addr, &interface, interfaceIndex)) {
712 Dart_SetReturnValue(args, Dart_Null()); 655 Dart_SetReturnValue(args, Dart_Null());
713 } else { 656 } else {
714 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 657 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
715 } 658 }
716 } 659 }
717 660
718 661
719 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { 662 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
720 intptr_t socket = 663 intptr_t socket =
721 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 664 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
722 RawAddr addr; 665 RawAddr addr;
723 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 666 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
724 RawAddr interface; 667 RawAddr interface;
725 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 668 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
726 GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 669 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
727 } 670 }
728 int interfaceIndex = 671 int interfaceIndex =
729 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 672 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
730 if (Socket::LeaveMulticast(socket, &addr, &interface, interfaceIndex)) { 673 if (Socket::LeaveMulticast(socket, &addr, &interface, interfaceIndex)) {
731 Dart_SetReturnValue(args, Dart_Null()); 674 Dart_SetReturnValue(args, Dart_Null());
732 } else { 675 } else {
733 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 676 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
734 } 677 }
735 } 678 }
736 679
737 680
738 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { 681 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
739 Dart_Handle err = 682 Dart_Handle err =
740 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); 683 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
741 if (Dart_IsError(err)) Dart_PropagateError(err); 684 if (Dart_IsError(err)) Dart_PropagateError(err);
742 } 685 }
743 686
744 687
745 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { 688 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) {
746 intptr_t socket = 0; 689 intptr_t socket = 0;
747 Dart_Handle err = 690 Dart_Handle err =
748 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); 691 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket);
749 if (Dart_IsError(err)) Dart_PropagateError(err); 692 if (Dart_IsError(err)) Dart_PropagateError(err);
750 return socket; 693 return socket;
751 } 694 }
752 695
753 } // namespace bin 696 } // namespace bin
754 } // namespace dart 697 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698