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 |