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

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

Issue 2797993005: Re-land socket refactor with fixes for Windows. (Closed)
Patch Set: Rebased + reverted original revert Created 3 years, 8 months 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
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.h » ('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 #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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 // the file descriptor. 141 // the file descriptor.
142 os_socket->ref_count++; 142 os_socket->ref_count++;
143 143
144 // The same Socket is used by a second Dart _NativeSocket object. 144 // The same Socket is used by a second Dart _NativeSocket object.
145 // It Retains a reference. 145 // It Retains a reference.
146 os_socket->socketfd->Retain(); 146 os_socket->socketfd->Retain();
147 // We set as a side-effect the file descriptor on the dart 147 // We set as a side-effect the file descriptor on the dart
148 // socket_object. 148 // socket_object.
149 Socket::ReuseSocketIdNativeField(socket_object, os_socket->socketfd, 149 Socket::ReuseSocketIdNativeField(socket_object, os_socket->socketfd,
150 Socket::kFinalizerListening); 150 Socket::kFinalizerListening);
151
152 return Dart_True(); 151 return Dart_True();
153 } 152 }
154 } 153 }
155 } 154 }
156 155
157 // There is no socket listening on that (address, port), so we create new one. 156 // There is no socket listening on that (address, port), so we create new one.
158 intptr_t fd = ServerSocket::CreateBindListen(addr, backlog, v6_only); 157 intptr_t fd = ServerSocket::CreateBindListen(addr, backlog, v6_only);
159 if (fd == -5) { 158 if (fd == -5) {
160 OSError os_error(-1, "Invalid host", OSError::kUnknown); 159 OSError os_error(-1, "Invalid host", OSError::kUnknown);
161 return DartUtils::NewDartOSError(&os_error); 160 return DartUtils::NewDartOSError(&os_error);
162 } 161 }
163 if (fd < 0) { 162 if (fd < 0) {
164 OSError error; 163 OSError error;
165 return DartUtils::NewDartOSError(&error); 164 return DartUtils::NewDartOSError(&error);
166 } 165 }
167 if (!ServerSocket::StartAccept(fd)) { 166 if (!ServerSocket::StartAccept(fd)) {
168 OSError os_error(-1, "Failed to start accept", OSError::kUnknown); 167 OSError os_error(-1, "Failed to start accept", OSError::kUnknown);
169 return DartUtils::NewDartOSError(&os_error); 168 return DartUtils::NewDartOSError(&os_error);
170 } 169 }
171 intptr_t allocated_port = Socket::GetPort(fd); 170 intptr_t allocated_port = SocketBase::GetPort(fd);
172 ASSERT(allocated_port > 0); 171 ASSERT(allocated_port > 0);
173 172
174 if (allocated_port != port) { 173 if (allocated_port != port) {
175 // There are two cases to consider: 174 // There are two cases to consider:
176 // 175 //
177 // a) The user requested (address, port) where port != 0 which means 176 // a) The user requested (address, port) where port != 0 which means
178 // we re-use an existing socket if available (and it is shared) or we 177 // we re-use an existing socket if available (and it is shared) or we
179 // create a new one. The new socket is guaranteed to have that 178 // create a new one. The new socket is guaranteed to have that
180 // selected port. 179 // selected port.
181 // 180 //
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 return CloseOneSafe(os_socket, true); 261 return CloseOneSafe(os_socket, true);
263 } else { 262 } else {
264 // A finalizer may direct the event handler to close a listening socket 263 // A finalizer may direct the event handler to close a listening socket
265 // that it has never seen before. In this case, we return true to direct 264 // that it has never seen before. In this case, we return true to direct
266 // the eventhandler to clean up the socket. 265 // the eventhandler to clean up the socket.
267 return true; 266 return true;
268 } 267 }
269 } 268 }
270 269
271 270
272 void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
273 const char* address =
274 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
275 ASSERT(address != NULL);
276 RawAddr raw;
277 memset(&raw, 0, sizeof(raw));
278 int type = strchr(address, ':') == NULL ? SocketAddress::TYPE_IPV4
279 : SocketAddress::TYPE_IPV6;
280 if (type == SocketAddress::TYPE_IPV4) {
281 raw.addr.sa_family = AF_INET;
282 } else {
283 raw.addr.sa_family = AF_INET6;
284 }
285 bool ok = Socket::ParseAddress(type, address, &raw);
286 if (!ok) {
287 Dart_SetReturnValue(args, Dart_Null());
288 } else {
289 Dart_SetReturnValue(args, SocketAddress::ToTypedData(raw));
290 }
291 }
292
293
294 void FUNCTION_NAME(NetworkInterface_ListSupported)(Dart_NativeArguments args) {
295 Dart_SetReturnValue(args, Dart_NewBoolean(Socket::ListInterfacesSupported()));
296 }
297
298
299 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 271 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
300 RawAddr addr; 272 RawAddr addr;
301 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 273 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
302 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 274 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
303 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 275 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
304 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port)); 276 SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port));
305 intptr_t socket = Socket::CreateConnect(addr); 277 intptr_t socket = Socket::CreateConnect(addr);
306 OSError error; 278 OSError error;
307 if (socket >= 0) { 279 if (socket >= 0) {
308 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 280 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
(...skipping 17 matching lines...) Expand all
326 OSError error; 298 OSError error;
327 if (socket >= 0) { 299 if (socket >= 0) {
328 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 300 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
329 Socket::kFinalizerNormal); 301 Socket::kFinalizerNormal);
330 Dart_SetReturnValue(args, Dart_True()); 302 Dart_SetReturnValue(args, Dart_True());
331 } else { 303 } else {
332 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 304 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
333 } 305 }
334 } 306 }
335 307
336 void FUNCTION_NAME(Socket_IsBindError)(Dart_NativeArguments args) {
337 intptr_t error_number =
338 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
339 bool is_bind_error = Socket::IsBindError(error_number);
340 Dart_SetReturnValue(args, is_bind_error ? Dart_True() : Dart_False());
341 }
342 308
343 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { 309 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
344 RawAddr addr; 310 RawAddr addr;
345 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 311 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
346 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2); 312 Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
347 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535); 313 int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
348 SocketAddress::SetAddrPort(&addr, port); 314 SocketAddress::SetAddrPort(&addr, port);
349 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); 315 bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
350 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr); 316 intptr_t socket = Socket::CreateBindDatagram(addr, reuse_addr);
351 if (socket >= 0) { 317 if (socket >= 0) {
352 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 318 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
353 Socket::kFinalizerNormal); 319 Socket::kFinalizerNormal);
354 Dart_SetReturnValue(args, Dart_True()); 320 Dart_SetReturnValue(args, Dart_True());
355 } else { 321 } else {
356 OSError error; 322 OSError error;
357 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); 323 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
358 } 324 }
359 } 325 }
360 326
361 327
362 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { 328 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
363 Socket* socket = 329 Socket* socket =
364 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 330 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
365 intptr_t available = Socket::Available(socket->fd()); 331 intptr_t available = SocketBase::Available(socket->fd());
366 if (available >= 0) { 332 if (available >= 0) {
367 Dart_SetReturnValue(args, Dart_NewInteger(available)); 333 Dart_SetReturnValue(args, Dart_NewInteger(available));
368 } else { 334 } else {
369 // Available failed. Mark socket as having data, to trigger a future read 335 // Available failed. Mark socket as having data, to trigger a future read
370 // event where the actual error can be reported. 336 // event where the actual error can be reported.
371 Dart_SetReturnValue(args, Dart_NewInteger(1)); 337 Dart_SetReturnValue(args, Dart_NewInteger(1));
372 } 338 }
373 } 339 }
374 340
375 341
376 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) { 342 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
377 Socket* socket = 343 Socket* socket =
378 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 344 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
379 int64_t length = 0; 345 int64_t length = 0;
380 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) { 346 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) {
381 if (short_socket_read) { 347 if (short_socket_read) {
382 length = (length + 1) / 2; 348 length = (length + 1) / 2;
383 } 349 }
384 uint8_t* buffer = NULL; 350 uint8_t* buffer = NULL;
385 Dart_Handle result = IOBuffer::Allocate(length, &buffer); 351 Dart_Handle result = IOBuffer::Allocate(length, &buffer);
386 if (Dart_IsError(result)) { 352 if (Dart_IsError(result)) {
387 Dart_PropagateError(result); 353 Dart_PropagateError(result);
388 } 354 }
389 ASSERT(buffer != NULL); 355 ASSERT(buffer != NULL);
390 intptr_t bytes_read = Socket::Read(socket->fd(), buffer, length); 356 intptr_t bytes_read = SocketBase::Read(socket->fd(), buffer, length);
391 if (bytes_read == length) { 357 if (bytes_read == length) {
392 Dart_SetReturnValue(args, result); 358 Dart_SetReturnValue(args, result);
393 } else if (bytes_read > 0) { 359 } else if (bytes_read > 0) {
394 uint8_t* new_buffer = NULL; 360 uint8_t* new_buffer = NULL;
395 Dart_Handle new_result = IOBuffer::Allocate(bytes_read, &new_buffer); 361 Dart_Handle new_result = IOBuffer::Allocate(bytes_read, &new_buffer);
396 if (Dart_IsError(new_result)) { 362 if (Dart_IsError(new_result)) {
397 Dart_PropagateError(new_result); 363 Dart_PropagateError(new_result);
398 } 364 }
399 ASSERT(new_buffer != NULL); 365 ASSERT(new_buffer != NULL);
400 memmove(new_buffer, buffer, bytes_read); 366 memmove(new_buffer, buffer, bytes_read);
(...skipping 19 matching lines...) Expand all
420 386
421 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can 387 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can
422 // handle 64k datagrams. 388 // handle 64k datagrams.
423 IsolateData* isolate_data = 389 IsolateData* isolate_data =
424 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); 390 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
425 if (isolate_data->udp_receive_buffer == NULL) { 391 if (isolate_data->udp_receive_buffer == NULL) {
426 isolate_data->udp_receive_buffer = 392 isolate_data->udp_receive_buffer =
427 reinterpret_cast<uint8_t*>(malloc(65536)); 393 reinterpret_cast<uint8_t*>(malloc(65536));
428 } 394 }
429 RawAddr addr; 395 RawAddr addr;
430 intptr_t bytes_read = Socket::RecvFrom( 396 intptr_t bytes_read = SocketBase::RecvFrom(
431 socket->fd(), isolate_data->udp_receive_buffer, 65536, &addr); 397 socket->fd(), isolate_data->udp_receive_buffer, 65536, &addr);
432 if (bytes_read == 0) { 398 if (bytes_read == 0) {
433 Dart_SetReturnValue(args, Dart_Null()); 399 Dart_SetReturnValue(args, Dart_Null());
434 return; 400 return;
435 } 401 }
436 if (bytes_read < 0) { 402 if (bytes_read < 0) {
437 ASSERT(bytes_read == -1); 403 ASSERT(bytes_read == -1);
438 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 404 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
439 return; 405 return;
440 } 406 }
(...skipping 10 matching lines...) Expand all
451 // Get the port and clear it in the sockaddr structure. 417 // Get the port and clear it in the sockaddr structure.
452 int port = SocketAddress::GetAddrPort(addr); 418 int port = SocketAddress::GetAddrPort(addr);
453 if (addr.addr.sa_family == AF_INET) { 419 if (addr.addr.sa_family == AF_INET) {
454 addr.in.sin_port = 0; 420 addr.in.sin_port = 0;
455 } else { 421 } else {
456 ASSERT(addr.addr.sa_family == AF_INET6); 422 ASSERT(addr.addr.sa_family == AF_INET6);
457 addr.in6.sin6_port = 0; 423 addr.in6.sin6_port = 0;
458 } 424 }
459 // Format the address to a string using the numeric format. 425 // Format the address to a string using the numeric format.
460 char numeric_address[INET6_ADDRSTRLEN]; 426 char numeric_address[INET6_ADDRSTRLEN];
461 Socket::FormatNumericAddress(addr, numeric_address, INET6_ADDRSTRLEN); 427 SocketBase::FormatNumericAddress(addr, numeric_address, INET6_ADDRSTRLEN);
462 428
463 // Create a Datagram object with the data and sender address and port. 429 // Create a Datagram object with the data and sender address and port.
464 const int kNumArgs = 4; 430 const int kNumArgs = 4;
465 Dart_Handle dart_args[kNumArgs]; 431 Dart_Handle dart_args[kNumArgs];
466 dart_args[0] = data; 432 dart_args[0] = data;
467 dart_args[1] = Dart_NewStringFromCString(numeric_address); 433 dart_args[1] = Dart_NewStringFromCString(numeric_address);
468 if (Dart_IsError(dart_args[1])) { 434 if (Dart_IsError(dart_args[1])) {
469 Dart_PropagateError(dart_args[1]); 435 Dart_PropagateError(dart_args[1]);
470 } 436 }
471 dart_args[2] = SocketAddress::ToTypedData(addr); 437 dart_args[2] = SocketAddress::ToTypedData(addr);
(...skipping 29 matching lines...) Expand all
501 Dart_TypedData_Type type; 467 Dart_TypedData_Type type;
502 uint8_t* buffer = NULL; 468 uint8_t* buffer = NULL;
503 intptr_t len; 469 intptr_t len;
504 Dart_Handle result = Dart_TypedDataAcquireData( 470 Dart_Handle result = Dart_TypedDataAcquireData(
505 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); 471 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len);
506 if (Dart_IsError(result)) { 472 if (Dart_IsError(result)) {
507 Dart_PropagateError(result); 473 Dart_PropagateError(result);
508 } 474 }
509 ASSERT((offset + length) <= len); 475 ASSERT((offset + length) <= len);
510 buffer += offset; 476 buffer += offset;
511 intptr_t bytes_written = Socket::Write(socket->fd(), buffer, length); 477 intptr_t bytes_written = SocketBase::Write(socket->fd(), buffer, length);
512 if (bytes_written >= 0) { 478 if (bytes_written >= 0) {
513 Dart_TypedDataReleaseData(buffer_obj); 479 Dart_TypedDataReleaseData(buffer_obj);
514 if (short_write) { 480 if (short_write) {
515 // If the write was forced 'short', indicate by returning the negative 481 // If the write was forced 'short', indicate by returning the negative
516 // number of bytes. A forced short write may not trigger a write event. 482 // number of bytes. A forced short write may not trigger a write event.
517 Dart_SetReturnValue(args, Dart_NewInteger(-bytes_written)); 483 Dart_SetReturnValue(args, Dart_NewInteger(-bytes_written));
518 } else { 484 } else {
519 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); 485 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
520 } 486 }
521 } else { 487 } else {
(...skipping 21 matching lines...) Expand all
543 Dart_TypedData_Type type; 509 Dart_TypedData_Type type;
544 uint8_t* buffer = NULL; 510 uint8_t* buffer = NULL;
545 intptr_t len; 511 intptr_t len;
546 Dart_Handle result = Dart_TypedDataAcquireData( 512 Dart_Handle result = Dart_TypedDataAcquireData(
547 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); 513 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len);
548 if (Dart_IsError(result)) { 514 if (Dart_IsError(result)) {
549 Dart_PropagateError(result); 515 Dart_PropagateError(result);
550 } 516 }
551 ASSERT((offset + length) <= len); 517 ASSERT((offset + length) <= len);
552 buffer += offset; 518 buffer += offset;
553 intptr_t bytes_written = Socket::SendTo(socket->fd(), buffer, length, addr); 519 intptr_t bytes_written =
520 SocketBase::SendTo(socket->fd(), buffer, length, addr);
554 if (bytes_written >= 0) { 521 if (bytes_written >= 0) {
555 Dart_TypedDataReleaseData(buffer_obj); 522 Dart_TypedDataReleaseData(buffer_obj);
556 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); 523 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
557 } else { 524 } else {
558 // Extract OSError before we release data, as it may override the error. 525 // Extract OSError before we release data, as it may override the error.
559 OSError os_error; 526 OSError os_error;
560 Dart_TypedDataReleaseData(buffer_obj); 527 Dart_TypedDataReleaseData(buffer_obj);
561 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 528 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
562 } 529 }
563 } 530 }
564 531
565 532
566 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { 533 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
567 Socket* socket = 534 Socket* socket =
568 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 535 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
569 OSError os_error; 536 OSError os_error;
570 intptr_t port = Socket::GetPort(socket->fd()); 537 intptr_t port = SocketBase::GetPort(socket->fd());
571 if (port > 0) { 538 if (port > 0) {
572 Dart_SetReturnValue(args, Dart_NewInteger(port)); 539 Dart_SetReturnValue(args, Dart_NewInteger(port));
573 } else { 540 } else {
574 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 541 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
575 } 542 }
576 } 543 }
577 544
578 545
579 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { 546 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
580 Socket* socket = 547 Socket* socket =
581 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 548 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
582 OSError os_error; 549 OSError os_error;
583 intptr_t port = 0; 550 intptr_t port = 0;
584 SocketAddress* addr = Socket::GetRemotePeer(socket->fd(), &port); 551 SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port);
585 if (addr != NULL) { 552 if (addr != NULL) {
586 Dart_Handle list = Dart_NewList(2); 553 Dart_Handle list = Dart_NewList(2);
587 554
588 Dart_Handle entry = Dart_NewList(3); 555 Dart_Handle entry = Dart_NewList(3);
589 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType())); 556 Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType()));
590 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string())); 557 Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
591 558
592 RawAddr raw = addr->addr(); 559 RawAddr raw = addr->addr();
593 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw)); 560 Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
594 561
595 Dart_ListSetAt(list, 0, entry); 562 Dart_ListSetAt(list, 0, entry);
596 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); 563 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
597 Dart_SetReturnValue(args, list); 564 Dart_SetReturnValue(args, list);
598 delete addr; 565 delete addr;
599 } else { 566 } else {
600 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 567 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
601 } 568 }
602 } 569 }
603 570
604 571
605 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { 572 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
606 Socket* socket = 573 Socket* socket =
607 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 574 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
608 OSError os_error; 575 OSError os_error;
609 Socket::GetError(socket->fd(), &os_error); 576 SocketBase::GetError(socket->fd(), &os_error);
610 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 577 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
611 } 578 }
612 579
613 580
614 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) { 581 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) {
615 Socket* socket = 582 Socket* socket =
616 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 583 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
617 OSError os_error; 584 OSError os_error;
618 intptr_t type = Socket::GetType(socket->fd()); 585 intptr_t type = SocketBase::GetType(socket->fd());
619 if (type >= 0) { 586 if (type >= 0) {
620 Dart_SetReturnValue(args, Dart_NewInteger(type)); 587 Dart_SetReturnValue(args, Dart_NewInteger(type));
621 } else { 588 } else {
622 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 589 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
623 } 590 }
624 } 591 }
625 592
626 593
627 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { 594 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
628 int64_t num = 595 int64_t num =
629 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2); 596 DartUtils::GetInt64ValueCheckRange(Dart_GetNativeArgument(args, 1), 0, 2);
630 intptr_t socket = Socket::GetStdioHandle(num); 597 intptr_t socket = SocketBase::GetStdioHandle(num);
631 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket, 598 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
632 Socket::kFinalizerStdio); 599 Socket::kFinalizerStdio);
633 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 600 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
634 } 601 }
635 602
636 603
637 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) { 604 void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) {
638 Socket* socket = 605 Socket* socket =
639 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 606 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
640 intptr_t id = reinterpret_cast<intptr_t>(socket); 607 intptr_t id = reinterpret_cast<intptr_t>(socket);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 651
685 652
686 CObject* Socket::LookupRequest(const CObjectArray& request) { 653 CObject* Socket::LookupRequest(const CObjectArray& request) {
687 if ((request.Length() == 2) && request[0]->IsString() && 654 if ((request.Length() == 2) && request[0]->IsString() &&
688 request[1]->IsInt32()) { 655 request[1]->IsInt32()) {
689 CObjectString host(request[0]); 656 CObjectString host(request[0]);
690 CObjectInt32 type(request[1]); 657 CObjectInt32 type(request[1]);
691 CObject* result = NULL; 658 CObject* result = NULL;
692 OSError* os_error = NULL; 659 OSError* os_error = NULL;
693 AddressList<SocketAddress>* addresses = 660 AddressList<SocketAddress>* addresses =
694 Socket::LookupAddress(host.CString(), type.Value(), &os_error); 661 SocketBase::LookupAddress(host.CString(), type.Value(), &os_error);
695 if (addresses != NULL) { 662 if (addresses != NULL) {
696 CObjectArray* array = 663 CObjectArray* array =
697 new CObjectArray(CObject::NewArray(addresses->count() + 1)); 664 new CObjectArray(CObject::NewArray(addresses->count() + 1));
698 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); 665 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
699 for (intptr_t i = 0; i < addresses->count(); i++) { 666 for (intptr_t i = 0; i < addresses->count(); i++) {
700 SocketAddress* addr = addresses->GetAt(i); 667 SocketAddress* addr = addresses->GetAt(i);
701 CObjectArray* entry = new CObjectArray(CObject::NewArray(3)); 668 CObjectArray* entry = new CObjectArray(CObject::NewArray(3));
702 669
703 CObjectInt32* type = 670 CObjectInt32* type =
704 new CObjectInt32(CObject::NewInt32(addr->GetType())); 671 new CObjectInt32(CObject::NewInt32(addr->GetType()));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 } else { 706 } else {
740 ASSERT(len == sizeof(in6_addr)); 707 ASSERT(len == sizeof(in6_addr));
741 addr.in6.sin6_family = AF_INET6; 708 addr.in6.sin6_family = AF_INET6;
742 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr), 709 memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr),
743 addr_object.Buffer(), len); 710 addr_object.Buffer(), len);
744 } 711 }
745 712
746 OSError* os_error = NULL; 713 OSError* os_error = NULL;
747 const intptr_t kMaxHostLength = 1025; 714 const intptr_t kMaxHostLength = 1025;
748 char host[kMaxHostLength]; 715 char host[kMaxHostLength];
749 if (Socket::ReverseLookup(addr, host, kMaxHostLength, &os_error)) { 716 if (SocketBase::ReverseLookup(addr, host, kMaxHostLength, &os_error)) {
750 return new CObjectString(CObject::NewString(host)); 717 return new CObjectString(CObject::NewString(host));
751 } else { 718 } else {
752 CObject* result = CObject::NewOSError(os_error); 719 CObject* result = CObject::NewOSError(os_error);
753 delete os_error; 720 delete os_error;
754 return result; 721 return result;
755 } 722 }
756 } 723 }
757 return CObject::IllegalArgumentError(); 724 return CObject::IllegalArgumentError();
758 } 725 }
759 726
760 727
761 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) { 728 CObject* Socket::ListInterfacesRequest(const CObjectArray& request) {
762 if ((request.Length() == 1) && request[0]->IsInt32()) { 729 if ((request.Length() == 1) && request[0]->IsInt32()) {
763 CObjectInt32 type(request[0]); 730 CObjectInt32 type(request[0]);
764 CObject* result = NULL; 731 CObject* result = NULL;
765 OSError* os_error = NULL; 732 OSError* os_error = NULL;
766 AddressList<InterfaceSocketAddress>* addresses = 733 AddressList<InterfaceSocketAddress>* addresses =
767 Socket::ListInterfaces(type.Value(), &os_error); 734 SocketBase::ListInterfaces(type.Value(), &os_error);
768 if (addresses != NULL) { 735 if (addresses != NULL) {
769 CObjectArray* array = 736 CObjectArray* array =
770 new CObjectArray(CObject::NewArray(addresses->count() + 1)); 737 new CObjectArray(CObject::NewArray(addresses->count() + 1));
771 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); 738 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
772 for (intptr_t i = 0; i < addresses->count(); i++) { 739 for (intptr_t i = 0; i < addresses->count(); i++) {
773 InterfaceSocketAddress* interface = addresses->GetAt(i); 740 InterfaceSocketAddress* interface = addresses->GetAt(i);
774 SocketAddress* addr = interface->socket_address(); 741 SocketAddress* addr = interface->socket_address();
775 CObjectArray* entry = new CObjectArray(CObject::NewArray(5)); 742 CObjectArray* entry = new CObjectArray(CObject::NewArray(5));
776 743
777 CObjectInt32* type = 744 CObjectInt32* type =
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { 778 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) {
812 Socket* socket = 779 Socket* socket =
813 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 780 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
814 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 781 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
815 intptr_t protocol = static_cast<intptr_t>( 782 intptr_t protocol = static_cast<intptr_t>(
816 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); 783 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)));
817 bool ok = false; 784 bool ok = false;
818 switch (option) { 785 switch (option) {
819 case 0: { // TCP_NODELAY. 786 case 0: { // TCP_NODELAY.
820 bool enabled; 787 bool enabled;
821 ok = Socket::GetNoDelay(socket->fd(), &enabled); 788 ok = SocketBase::GetNoDelay(socket->fd(), &enabled);
822 if (ok) { 789 if (ok) {
823 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); 790 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False());
824 } 791 }
825 break; 792 break;
826 } 793 }
827 case 1: { // IP_MULTICAST_LOOP. 794 case 1: { // IP_MULTICAST_LOOP.
828 bool enabled; 795 bool enabled;
829 ok = Socket::GetMulticastLoop(socket->fd(), protocol, &enabled); 796 ok = SocketBase::GetMulticastLoop(socket->fd(), protocol, &enabled);
830 if (ok) { 797 if (ok) {
831 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); 798 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False());
832 } 799 }
833 break; 800 break;
834 } 801 }
835 case 2: { // IP_MULTICAST_TTL. 802 case 2: { // IP_MULTICAST_TTL.
836 int value; 803 int value;
837 ok = Socket::GetMulticastHops(socket->fd(), protocol, &value); 804 ok = SocketBase::GetMulticastHops(socket->fd(), protocol, &value);
838 if (ok) { 805 if (ok) {
839 Dart_SetReturnValue(args, Dart_NewInteger(value)); 806 Dart_SetReturnValue(args, Dart_NewInteger(value));
840 } 807 }
841 break; 808 break;
842 } 809 }
843 case 3: { // IP_MULTICAST_IF. 810 case 3: { // IP_MULTICAST_IF.
844 UNIMPLEMENTED(); 811 UNIMPLEMENTED();
845 break; 812 break;
846 } 813 }
847 case 4: { // IP_BROADCAST. 814 case 4: { // IP_BROADCAST.
848 bool enabled; 815 bool enabled;
849 ok = Socket::GetBroadcast(socket->fd(), &enabled); 816 ok = SocketBase::GetBroadcast(socket->fd(), &enabled);
850 if (ok) { 817 if (ok) {
851 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); 818 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False());
852 } 819 }
853 break; 820 break;
854 } 821 }
855 default: 822 default:
856 UNREACHABLE(); 823 UNREACHABLE();
857 break; 824 break;
858 } 825 }
859 // In case of failure the return value is not set above. 826 // In case of failure the return value is not set above.
860 if (!ok) { 827 if (!ok) {
861 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 828 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
862 } 829 }
863 } 830 }
864 831
865 832
866 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { 833 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
867 bool result = false; 834 bool result = false;
868 Socket* socket = 835 Socket* socket =
869 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 836 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
870 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 837 int64_t option = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
871 int64_t protocol = DartUtils::GetInt64ValueCheckRange( 838 int64_t protocol = DartUtils::GetInt64ValueCheckRange(
872 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4, 839 Dart_GetNativeArgument(args, 2), SocketAddress::TYPE_IPV4,
873 SocketAddress::TYPE_IPV6); 840 SocketAddress::TYPE_IPV6);
874 switch (option) { 841 switch (option) {
875 case 0: // TCP_NODELAY. 842 case 0: // TCP_NODELAY.
876 result = Socket::SetNoDelay( 843 result = SocketBase::SetNoDelay(
877 socket->fd(), 844 socket->fd(),
878 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); 845 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)));
879 break; 846 break;
880 case 1: // IP_MULTICAST_LOOP. 847 case 1: // IP_MULTICAST_LOOP.
881 result = Socket::SetMulticastLoop( 848 result = SocketBase::SetMulticastLoop(
882 socket->fd(), protocol, 849 socket->fd(), protocol,
883 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); 850 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)));
884 break; 851 break;
885 case 2: // IP_MULTICAST_TTL. 852 case 2: // IP_MULTICAST_TTL.
886 result = Socket::SetMulticastHops( 853 result = SocketBase::SetMulticastHops(
887 socket->fd(), protocol, 854 socket->fd(), protocol,
888 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3))); 855 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)));
889 break; 856 break;
890 case 3: { // IP_MULTICAST_IF. 857 case 3: { // IP_MULTICAST_IF.
891 UNIMPLEMENTED(); 858 UNIMPLEMENTED();
892 break; 859 break;
893 } 860 }
894 case 4: // IP_BROADCAST. 861 case 4: // IP_BROADCAST.
895 result = Socket::SetBroadcast( 862 result = SocketBase::SetBroadcast(
896 socket->fd(), 863 socket->fd(),
897 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3))); 864 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)));
898 break; 865 break;
899 default: 866 default:
900 Dart_PropagateError(Dart_NewApiError("Value outside expected range")); 867 Dart_PropagateError(Dart_NewApiError("Value outside expected range"));
901 break; 868 break;
902 } 869 }
903 if (result) { 870 if (result) {
904 Dart_SetReturnValue(args, Dart_Null()); 871 Dart_SetReturnValue(args, Dart_Null());
905 } else { 872 } else {
906 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 873 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
907 } 874 }
908 } 875 }
909 876
910 877
911 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { 878 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) {
912 Socket* socket = 879 Socket* socket =
913 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 880 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
914 RawAddr addr; 881 RawAddr addr;
915 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 882 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
916 RawAddr interface; 883 RawAddr interface;
917 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 884 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
918 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 885 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
919 } 886 }
920 int interfaceIndex = 887 int interfaceIndex =
921 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 888 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
922 if (Socket::JoinMulticast(socket->fd(), addr, interface, interfaceIndex)) { 889 if (SocketBase::JoinMulticast(socket->fd(), addr, interface,
890 interfaceIndex)) {
923 Dart_SetReturnValue(args, Dart_Null()); 891 Dart_SetReturnValue(args, Dart_Null());
924 } else { 892 } else {
925 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 893 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
926 } 894 }
927 } 895 }
928 896
929 897
930 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { 898 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
931 Socket* socket = 899 Socket* socket =
932 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); 900 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
933 RawAddr addr; 901 RawAddr addr;
934 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); 902 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
935 RawAddr interface; 903 RawAddr interface;
936 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) { 904 if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
937 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface); 905 SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
938 } 906 }
939 int interfaceIndex = 907 int interfaceIndex =
940 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); 908 DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
941 if (Socket::LeaveMulticast(socket->fd(), addr, interface, interfaceIndex)) { 909 if (SocketBase::LeaveMulticast(socket->fd(), addr, interface,
910 interfaceIndex)) {
942 Dart_SetReturnValue(args, Dart_Null()); 911 Dart_SetReturnValue(args, Dart_Null());
943 } else { 912 } else {
944 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 913 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
945 } 914 }
946 } 915 }
947 916
948 917
949 static void NormalSocketFinalizer(void* isolate_data, 918 static void NormalSocketFinalizer(void* isolate_data,
950 Dart_WeakPersistentHandle handle, 919 Dart_WeakPersistentHandle handle,
951 void* data) { 920 void* data) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 Dart_PropagateError(err); 1001 Dart_PropagateError(err);
1033 } 1002 }
1034 Socket* socket = reinterpret_cast<Socket*>(id); 1003 Socket* socket = reinterpret_cast<Socket*>(id);
1035 return socket; 1004 return socket;
1036 } 1005 }
1037 1006
1038 } // namespace bin 1007 } // namespace bin
1039 } // namespace dart 1008 } // namespace dart
1040 1009
1041 #endif // !defined(DART_IO_DISABLED) 1010 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/socket.h ('k') | runtime/bin/socket_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698