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

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

Issue 1800863002: Cleanup in //runtime/bin (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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
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 "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
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
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
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
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
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
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
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
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
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
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)
OLDNEW
« no previous file with comments | « runtime/bin/socket_win.h ('k') | runtime/bin/stdio.h » ('j') | runtime/bin/stdio_android.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698