| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 #if defined(TARGET_OS_WINDOWS) | 6 #if defined(TARGET_OS_WINDOWS) |
| 7 | 7 |
| 8 #include "bin/socket.h" | 8 #include "bin/socket.h" |
| 9 #include "bin/socket_win.h" | 9 #include "bin/socket_win.h" |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 address, | 47 address, |
| 48 &l) != 0; | 48 &l) != 0; |
| 49 } | 49 } |
| 50 | 50 |
| 51 | 51 |
| 52 static Mutex* init_mutex = new Mutex(); | 52 static Mutex* init_mutex = new Mutex(); |
| 53 static bool socket_initialized = false; | 53 static bool socket_initialized = false; |
| 54 | 54 |
| 55 bool Socket::Initialize() { | 55 bool Socket::Initialize() { |
| 56 MutexLocker lock(init_mutex); | 56 MutexLocker lock(init_mutex); |
| 57 if (socket_initialized) return true; | 57 if (socket_initialized) { |
| 58 return true; |
| 59 } |
| 58 int err; | 60 int err; |
| 59 WSADATA winsock_data; | 61 WSADATA winsock_data; |
| 60 WORD version_requested = MAKEWORD(2, 2); | 62 WORD version_requested = MAKEWORD(2, 2); |
| 61 err = WSAStartup(version_requested, &winsock_data); | 63 err = WSAStartup(version_requested, &winsock_data); |
| 62 if (err == 0) { | 64 if (err == 0) { |
| 63 socket_initialized = true; | 65 socket_initialized = true; |
| 64 } else { | 66 } else { |
| 65 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError()); | 67 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError()); |
| 66 } | 68 } |
| 67 return err == 0; | 69 return (err == 0); |
| 68 } | 70 } |
| 69 | 71 |
| 70 intptr_t Socket::Available(intptr_t fd) { | 72 intptr_t Socket::Available(intptr_t fd) { |
| 71 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); | 73 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); |
| 72 return client_socket->Available(); | 74 return client_socket->Available(); |
| 73 } | 75 } |
| 74 | 76 |
| 75 | 77 |
| 76 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) { | 78 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) { |
| 77 Handle* handle = reinterpret_cast<Handle*>(fd); | 79 Handle* handle = reinterpret_cast<Handle*>(fd); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 100 return handle->SendTo( | 102 return handle->SendTo( |
| 101 buffer, num_bytes, &raw.addr, SocketAddress::GetAddrLength(addr)); | 103 buffer, num_bytes, &raw.addr, SocketAddress::GetAddrLength(addr)); |
| 102 } | 104 } |
| 103 | 105 |
| 104 | 106 |
| 105 intptr_t Socket::GetPort(intptr_t fd) { | 107 intptr_t Socket::GetPort(intptr_t fd) { |
| 106 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); | 108 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); |
| 107 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); | 109 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); |
| 108 RawAddr raw; | 110 RawAddr raw; |
| 109 socklen_t size = sizeof(raw); | 111 socklen_t size = sizeof(raw); |
| 110 if (getsockname(socket_handle->socket(), | 112 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) { |
| 111 &raw.addr, | |
| 112 &size) == SOCKET_ERROR) { | |
| 113 return 0; | 113 return 0; |
| 114 } | 114 } |
| 115 return SocketAddress::GetAddrPort(raw); | 115 return SocketAddress::GetAddrPort(raw); |
| 116 } | 116 } |
| 117 | 117 |
| 118 | 118 |
| 119 SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) { | 119 SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) { |
| 120 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); | 120 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); |
| 121 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); | 121 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); |
| 122 RawAddr raw; | 122 RawAddr raw; |
| 123 socklen_t size = sizeof(raw); | 123 socklen_t size = sizeof(raw); |
| 124 if (getpeername(socket_handle->socket(), | 124 if (getpeername(socket_handle->socket(), &raw.addr, &size)) { |
| 125 &raw.addr, | |
| 126 &size)) { | |
| 127 return NULL; | 125 return NULL; |
| 128 } | 126 } |
| 129 *port = SocketAddress::GetAddrPort(raw); | 127 *port = SocketAddress::GetAddrPort(raw); |
| 130 // Clear the port before calling WSAAddressToString as WSAAddressToString | 128 // Clear the port before calling WSAAddressToString as WSAAddressToString |
| 131 // includes the port in the formatted string. | 129 // includes the port in the formatted string. |
| 132 SocketAddress::SetAddrPort(&raw, 0); | 130 SocketAddress::SetAddrPort(&raw, 0); |
| 133 return new SocketAddress(&raw.addr); | 131 return new SocketAddress(&raw.addr); |
| 134 } | 132 } |
| 135 | 133 |
| 136 | 134 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 switch (GetFileType(handle->handle())) { | 259 switch (GetFileType(handle->handle())) { |
| 262 case FILE_TYPE_CHAR: return File::kTerminal; | 260 case FILE_TYPE_CHAR: return File::kTerminal; |
| 263 case FILE_TYPE_PIPE: return File::kPipe; | 261 case FILE_TYPE_PIPE: return File::kPipe; |
| 264 case FILE_TYPE_DISK: return File::kFile; | 262 case FILE_TYPE_DISK: return File::kFile; |
| 265 default: return GetLastError == NO_ERROR ? File::kOther : -1; | 263 default: return GetLastError == NO_ERROR ? File::kOther : -1; |
| 266 } | 264 } |
| 267 } | 265 } |
| 268 | 266 |
| 269 | 267 |
| 270 intptr_t Socket::GetStdioHandle(intptr_t num) { | 268 intptr_t Socket::GetStdioHandle(intptr_t num) { |
| 271 if (num != 0) return -1; | 269 if (num != 0) { |
| 270 return -1; |
| 271 } |
| 272 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); | 272 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); |
| 273 if (handle == INVALID_HANDLE_VALUE) { | 273 if (handle == INVALID_HANDLE_VALUE) { |
| 274 return -1; | 274 return -1; |
| 275 } | 275 } |
| 276 StdHandle* std_handle = new StdHandle(handle); | 276 StdHandle* std_handle = new StdHandle(handle); |
| 277 std_handle->MarkDoesNotSupportOverlappedIO(); | 277 std_handle->MarkDoesNotSupportOverlappedIO(); |
| 278 std_handle->EnsureInitialized(EventHandler::delegate()); | 278 std_handle->EnsureInitialized(EventHandler::delegate()); |
| 279 return reinterpret_cast<intptr_t>(std_handle); | 279 return reinterpret_cast<intptr_t>(std_handle); |
| 280 } | 280 } |
| 281 | 281 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 } | 313 } |
| 314 if (status != 0) { | 314 if (status != 0) { |
| 315 ASSERT(*os_error == NULL); | 315 ASSERT(*os_error == NULL); |
| 316 DWORD error_code = WSAGetLastError(); | 316 DWORD error_code = WSAGetLastError(); |
| 317 SetLastError(error_code); | 317 SetLastError(error_code); |
| 318 *os_error = new OSError(); | 318 *os_error = new OSError(); |
| 319 return NULL; | 319 return NULL; |
| 320 } | 320 } |
| 321 intptr_t count = 0; | 321 intptr_t count = 0; |
| 322 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { | 322 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { |
| 323 if (c->ai_family == AF_INET || c->ai_family == AF_INET6) count++; | 323 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) { |
| 324 count++; |
| 325 } |
| 324 } | 326 } |
| 325 AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count); | 327 AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count); |
| 326 intptr_t i = 0; | 328 intptr_t i = 0; |
| 327 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { | 329 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { |
| 328 if (c->ai_family == AF_INET || c->ai_family == AF_INET6) { | 330 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) { |
| 329 addresses->SetAt(i, new SocketAddress(c->ai_addr)); | 331 addresses->SetAt(i, new SocketAddress(c->ai_addr)); |
| 330 i++; | 332 i++; |
| 331 } | 333 } |
| 332 } | 334 } |
| 333 freeaddrinfo(info); | 335 freeaddrinfo(info); |
| 334 return addresses; | 336 return addresses; |
| 335 } | 337 } |
| 336 | 338 |
| 337 | 339 |
| 338 bool Socket::ReverseLookup(const RawAddr& addr, | 340 bool Socket::ReverseLookup(const RawAddr& addr, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 reinterpret_cast<const char*>(&optval), | 388 reinterpret_cast<const char*>(&optval), |
| 387 sizeof(optval)); | 389 sizeof(optval)); |
| 388 if (status == SOCKET_ERROR) { | 390 if (status == SOCKET_ERROR) { |
| 389 DWORD rc = WSAGetLastError(); | 391 DWORD rc = WSAGetLastError(); |
| 390 closesocket(s); | 392 closesocket(s); |
| 391 SetLastError(rc); | 393 SetLastError(rc); |
| 392 return -1; | 394 return -1; |
| 393 } | 395 } |
| 394 } | 396 } |
| 395 | 397 |
| 396 status = bind(s, | 398 status = bind(s, &addr.addr, SocketAddress::GetAddrLength(addr)); |
| 397 &addr.addr, | |
| 398 SocketAddress::GetAddrLength(addr)); | |
| 399 if (status == SOCKET_ERROR) { | 399 if (status == SOCKET_ERROR) { |
| 400 DWORD rc = WSAGetLastError(); | 400 DWORD rc = WSAGetLastError(); |
| 401 closesocket(s); | 401 closesocket(s); |
| 402 SetLastError(rc); | 402 SetLastError(rc); |
| 403 return -1; | 403 return -1; |
| 404 } | 404 } |
| 405 | 405 |
| 406 DatagramSocket* datagram_socket = new DatagramSocket(s); | 406 DatagramSocket* datagram_socket = new DatagramSocket(s); |
| 407 datagram_socket->EnsureInitialized(EventHandler::delegate()); | 407 datagram_socket->EnsureInitialized(EventHandler::delegate()); |
| 408 return reinterpret_cast<intptr_t>(datagram_socket); | 408 return reinterpret_cast<intptr_t>(datagram_socket); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 | 489 |
| 490 if (addr.ss.ss_family == AF_INET6) { | 490 if (addr.ss.ss_family == AF_INET6) { |
| 491 optval = v6_only; | 491 optval = v6_only; |
| 492 setsockopt(s, | 492 setsockopt(s, |
| 493 IPPROTO_IPV6, | 493 IPPROTO_IPV6, |
| 494 IPV6_V6ONLY, | 494 IPV6_V6ONLY, |
| 495 reinterpret_cast<const char*>(&optval), | 495 reinterpret_cast<const char*>(&optval), |
| 496 sizeof(optval)); | 496 sizeof(optval)); |
| 497 } | 497 } |
| 498 | 498 |
| 499 status = bind(s, | 499 status = bind(s, &addr.addr, SocketAddress::GetAddrLength(addr)); |
| 500 &addr.addr, | |
| 501 SocketAddress::GetAddrLength(addr)); | |
| 502 if (status == SOCKET_ERROR) { | 500 if (status == SOCKET_ERROR) { |
| 503 DWORD rc = WSAGetLastError(); | 501 DWORD rc = WSAGetLastError(); |
| 504 closesocket(s); | 502 closesocket(s); |
| 505 SetLastError(rc); | 503 SetLastError(rc); |
| 506 return -1; | 504 return -1; |
| 507 } | 505 } |
| 508 | 506 |
| 509 ListenSocket* listen_socket = new ListenSocket(s); | 507 ListenSocket* listen_socket = new ListenSocket(s); |
| 510 | 508 |
| 511 // Test for invalid socket port 65535 (some browsers disallow it). | 509 // Test for invalid socket port 65535 (some browsers disallow it). |
| 512 if (SocketAddress::GetAddrPort(addr) == 0 && | 510 if ((SocketAddress::GetAddrPort(addr) == 0) && |
| 513 Socket::GetPort(reinterpret_cast<intptr_t>(listen_socket)) == 65535) { | 511 (Socket::GetPort(reinterpret_cast<intptr_t>(listen_socket)) == 65535)) { |
| 514 // Don't close fd until we have created new. By doing that we ensure another | 512 // Don't close fd until we have created new. By doing that we ensure another |
| 515 // port. | 513 // port. |
| 516 intptr_t new_s = CreateBindListen(addr, backlog, v6_only); | 514 intptr_t new_s = CreateBindListen(addr, backlog, v6_only); |
| 517 DWORD rc = WSAGetLastError(); | 515 DWORD rc = WSAGetLastError(); |
| 518 closesocket(s); | 516 closesocket(s); |
| 519 delete listen_socket; | 517 delete listen_socket; |
| 520 SetLastError(rc); | 518 SetLastError(rc); |
| 521 return new_s; | 519 return new_s; |
| 522 } | 520 } |
| 523 | 521 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) { | 562 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) { |
| 565 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 563 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 566 int on; | 564 int on; |
| 567 socklen_t len = sizeof(on); | 565 socklen_t len = sizeof(on); |
| 568 int err = getsockopt(handle->socket(), | 566 int err = getsockopt(handle->socket(), |
| 569 IPPROTO_TCP, | 567 IPPROTO_TCP, |
| 570 TCP_NODELAY, | 568 TCP_NODELAY, |
| 571 reinterpret_cast<char *>(&on), | 569 reinterpret_cast<char *>(&on), |
| 572 &len); | 570 &len); |
| 573 if (err == 0) { | 571 if (err == 0) { |
| 574 *enabled = on == 1; | 572 *enabled = (on == 1); |
| 575 } | 573 } |
| 576 return err == 0; | 574 return (err == 0); |
| 577 } | 575 } |
| 578 | 576 |
| 579 | 577 |
| 580 bool Socket::SetNoDelay(intptr_t fd, bool enabled) { | 578 bool Socket::SetNoDelay(intptr_t fd, bool enabled) { |
| 581 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 579 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 582 int on = enabled ? 1 : 0; | 580 int on = enabled ? 1 : 0; |
| 583 return setsockopt(handle->socket(), | 581 return setsockopt(handle->socket(), |
| 584 IPPROTO_TCP, | 582 IPPROTO_TCP, |
| 585 TCP_NODELAY, | 583 TCP_NODELAY, |
| 586 reinterpret_cast<char *>(&on), | 584 reinterpret_cast<char *>(&on), |
| (...skipping 24 matching lines...) Expand all Loading... |
| 611 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 609 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 612 int on = enabled ? 1 : 0; | 610 int on = enabled ? 1 : 0; |
| 613 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; | 611 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; |
| 614 int optname = protocol == SocketAddress::TYPE_IPV4 | 612 int optname = protocol == SocketAddress::TYPE_IPV4 |
| 615 ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP; | 613 ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP; |
| 616 return setsockopt(handle->socket(), | 614 return setsockopt(handle->socket(), |
| 617 level, | 615 level, |
| 618 optname, | 616 optname, |
| 619 reinterpret_cast<char *>(&on), | 617 reinterpret_cast<char *>(&on), |
| 620 sizeof(on)) == 0; | 618 sizeof(on)) == 0; |
| 621 return false; | |
| 622 } | 619 } |
| 623 | 620 |
| 624 | 621 |
| 625 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) { | 622 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) { |
| 626 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 623 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 627 uint8_t v; | 624 uint8_t v; |
| 628 socklen_t len = sizeof(v); | 625 socklen_t len = sizeof(v); |
| 629 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; | 626 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; |
| 630 int optname = protocol == SocketAddress::TYPE_IPV4 | 627 int optname = protocol == SocketAddress::TYPE_IPV4 |
| 631 ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS; | 628 ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 658 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) { | 655 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) { |
| 659 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 656 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 660 int on; | 657 int on; |
| 661 socklen_t len = sizeof(on); | 658 socklen_t len = sizeof(on); |
| 662 int err = getsockopt(handle->socket(), | 659 int err = getsockopt(handle->socket(), |
| 663 SOL_SOCKET, | 660 SOL_SOCKET, |
| 664 SO_BROADCAST, | 661 SO_BROADCAST, |
| 665 reinterpret_cast<char *>(&on), | 662 reinterpret_cast<char *>(&on), |
| 666 &len); | 663 &len); |
| 667 if (err == 0) { | 664 if (err == 0) { |
| 668 *enabled = on == 1; | 665 *enabled = (on == 1); |
| 669 } | 666 } |
| 670 return err == 0; | 667 return (err == 0); |
| 671 } | 668 } |
| 672 | 669 |
| 673 | 670 |
| 674 bool Socket::SetBroadcast(intptr_t fd, bool enabled) { | 671 bool Socket::SetBroadcast(intptr_t fd, bool enabled) { |
| 675 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); | 672 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| 676 int on = enabled ? 1 : 0; | 673 int on = enabled ? 1 : 0; |
| 677 return setsockopt(handle->socket(), | 674 return setsockopt(handle->socket(), |
| 678 SOL_SOCKET, | 675 SOL_SOCKET, |
| 679 SO_BROADCAST, | 676 SO_BROADCAST, |
| 680 reinterpret_cast<char *>(&on), | 677 reinterpret_cast<char *>(&on), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 708 proto, | 705 proto, |
| 709 MCAST_LEAVE_GROUP, | 706 MCAST_LEAVE_GROUP, |
| 710 reinterpret_cast<char *>(&mreq), | 707 reinterpret_cast<char *>(&mreq), |
| 711 sizeof(mreq)) == 0; | 708 sizeof(mreq)) == 0; |
| 712 } | 709 } |
| 713 | 710 |
| 714 } // namespace bin | 711 } // namespace bin |
| 715 } // namespace dart | 712 } // namespace dart |
| 716 | 713 |
| 717 #endif // defined(TARGET_OS_WINDOWS) | 714 #endif // defined(TARGET_OS_WINDOWS) |
| OLD | NEW |