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

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

Issue 2780063002: Pulled a significant portion of Socket implementation into BaseSocket in order to prepare for the s… (Closed)
Patch Set: 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
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 "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(TARGET_OS_WINDOWS) 8 #if defined(TARGET_OS_WINDOWS)
9 9
10 #include "bin/socket.h" 10 #include "bin/socket.h"
11 #include "bin/socket_win.h" 11 #include "bin/socket_common_win.h"
12 12
13 #include "bin/builtin.h" 13 #include "bin/builtin.h"
14 #include "bin/eventhandler.h" 14 #include "bin/eventhandler.h"
15 #include "bin/file.h" 15 #include "bin/file.h"
16 #include "bin/lockers.h" 16 #include "bin/lockers.h"
17 #include "bin/log.h" 17 #include "bin/log.h"
18 #include "bin/thread.h" 18 #include "bin/thread.h"
19 #include "bin/utils.h" 19 #include "bin/utils.h"
20 #include "bin/utils_win.h" 20 #include "bin/utils_win.h"
21 21
22 namespace dart { 22 namespace dart {
23 namespace bin { 23 namespace bin {
24 24
25 SocketAddress::SocketAddress(struct sockaddr* sockaddr) { 25 SocketAddress::SocketAddress(struct sockaddr* sockaddr) {
26 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); 26 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
27 RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr); 27 RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr);
28 28
29 // Clear the port before calling WSAAddressToString as WSAAddressToString 29 // Clear the port before calling WSAAddressToString as WSAAddressToString
30 // includes the port in the formatted string. 30 // includes the port in the formatted string.
31 int err = Socket::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN); 31 int err =
32 BaseSocket::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN);
32 33
33 if (err != 0) { 34 if (err != 0) {
34 as_string_[0] = 0; 35 as_string_[0] = 0;
35 } 36 }
36 memmove(reinterpret_cast<void*>(&addr_), sockaddr, 37 memmove(reinterpret_cast<void*>(&addr_), sockaddr,
37 SocketAddress::GetAddrLength(*raw)); 38 SocketAddress::GetAddrLength(*raw));
38 } 39 }
39 40
40 41
41 bool Socket::FormatNumericAddress(const RawAddr& addr, char* address, int len) { 42 bool BaseSocket::FormatNumericAddress(const RawAddr& addr,
43 char* address,
44 int len) {
42 socklen_t salen = SocketAddress::GetAddrLength(addr); 45 socklen_t salen = SocketAddress::GetAddrLength(addr);
43 DWORD l = len; 46 DWORD l = len;
44 RawAddr& raw = const_cast<RawAddr&>(addr); 47 RawAddr& raw = const_cast<RawAddr&>(addr);
45 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0; 48 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0;
46 } 49 }
47 50
48 51
49 static Mutex* init_mutex = new Mutex(); 52 static Mutex* init_mutex = new Mutex();
50 static bool socket_initialized = false; 53 static bool socket_initialized = false;
51 54
52 bool Socket::Initialize() { 55 bool BaseSocket::Initialize() {
53 MutexLocker lock(init_mutex); 56 MutexLocker lock(init_mutex);
54 if (socket_initialized) { 57 if (socket_initialized) {
55 return true; 58 return true;
56 } 59 }
57 int err; 60 int err;
58 WSADATA winsock_data; 61 WSADATA winsock_data;
59 WORD version_requested = MAKEWORD(2, 2); 62 WORD version_requested = MAKEWORD(2, 2);
60 err = WSAStartup(version_requested, &winsock_data); 63 err = WSAStartup(version_requested, &winsock_data);
61 if (err == 0) { 64 if (err == 0) {
62 socket_initialized = true; 65 socket_initialized = true;
63 } else { 66 } else {
64 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError()); 67 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError());
65 } 68 }
66 return (err == 0); 69 return (err == 0);
67 } 70 }
68 71
69 intptr_t Socket::Available(intptr_t fd) { 72 intptr_t BaseSocket::Available(intptr_t fd) {
70 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 73 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
71 return client_socket->Available(); 74 return client_socket->Available();
72 } 75 }
73 76
74 77
75 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) { 78 intptr_t BaseSocket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
76 Handle* handle = reinterpret_cast<Handle*>(fd); 79 Handle* handle = reinterpret_cast<Handle*>(fd);
77 return handle->Read(buffer, num_bytes); 80 return handle->Read(buffer, num_bytes);
78 } 81 }
79 82
80 83
81 intptr_t Socket::RecvFrom(intptr_t fd, 84 intptr_t BaseSocket::RecvFrom(intptr_t fd,
82 void* buffer, 85 void* buffer,
83 intptr_t num_bytes, 86 intptr_t num_bytes,
84 RawAddr* addr) { 87 RawAddr* addr) {
85 Handle* handle = reinterpret_cast<Handle*>(fd); 88 Handle* handle = reinterpret_cast<Handle*>(fd);
86 socklen_t addr_len = sizeof(addr->ss); 89 socklen_t addr_len = sizeof(addr->ss);
87 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len); 90 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len);
88 } 91 }
89 92
90 93
91 intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) { 94 intptr_t BaseSocket::Write(intptr_t fd,
95 const void* buffer,
96 intptr_t num_bytes) {
92 Handle* handle = reinterpret_cast<Handle*>(fd); 97 Handle* handle = reinterpret_cast<Handle*>(fd);
93 return handle->Write(buffer, num_bytes); 98 return handle->Write(buffer, num_bytes);
94 } 99 }
95 100
96 101
97 intptr_t Socket::SendTo(intptr_t fd, 102 intptr_t BaseSocket::SendTo(intptr_t fd,
98 const void* buffer, 103 const void* buffer,
99 intptr_t num_bytes, 104 intptr_t num_bytes,
100 const RawAddr& addr) { 105 const RawAddr& addr) {
101 Handle* handle = reinterpret_cast<Handle*>(fd); 106 Handle* handle = reinterpret_cast<Handle*>(fd);
102 RawAddr& raw = const_cast<RawAddr&>(addr); 107 RawAddr& raw = const_cast<RawAddr&>(addr);
103 return handle->SendTo(buffer, num_bytes, &raw.addr, 108 return handle->SendTo(buffer, num_bytes, &raw.addr,
104 SocketAddress::GetAddrLength(addr)); 109 SocketAddress::GetAddrLength(addr));
105 } 110 }
106 111
107 112
108 intptr_t Socket::GetPort(intptr_t fd) { 113 intptr_t BaseSocket::GetPort(intptr_t fd) {
109 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 114 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
110 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 115 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
111 RawAddr raw; 116 RawAddr raw;
112 socklen_t size = sizeof(raw); 117 socklen_t size = sizeof(raw);
113 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) { 118 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) {
114 return 0; 119 return 0;
115 } 120 }
116 return SocketAddress::GetAddrPort(raw); 121 return SocketAddress::GetAddrPort(raw);
117 } 122 }
118 123
119 124
120 SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) { 125 SocketAddress* BaseSocket::GetRemotePeer(intptr_t fd, intptr_t* port) {
121 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 126 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
122 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 127 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
123 RawAddr raw; 128 RawAddr raw;
124 socklen_t size = sizeof(raw); 129 socklen_t size = sizeof(raw);
125 if (getpeername(socket_handle->socket(), &raw.addr, &size)) { 130 if (getpeername(socket_handle->socket(), &raw.addr, &size)) {
126 return NULL; 131 return NULL;
127 } 132 }
128 *port = SocketAddress::GetAddrPort(raw); 133 *port = SocketAddress::GetAddrPort(raw);
129 // Clear the port before calling WSAAddressToString as WSAAddressToString 134 // Clear the port before calling WSAAddressToString as WSAAddressToString
130 // includes the port in the formatted string. 135 // includes the port in the formatted string.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 const RawAddr& source_addr) { 234 const RawAddr& source_addr) {
230 intptr_t fd = Create(addr); 235 intptr_t fd = Create(addr);
231 if (fd < 0) { 236 if (fd < 0) {
232 return fd; 237 return fd;
233 } 238 }
234 239
235 return Connect(fd, addr, source_addr); 240 return Connect(fd, addr, source_addr);
236 } 241 }
237 242
238 243
239 bool Socket::IsBindError(intptr_t error_number) { 244 bool BaseSocket::IsBindError(intptr_t error_number) {
240 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL || 245 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL ||
241 error_number == WSAEINVAL; 246 error_number == WSAEINVAL;
242 } 247 }
243 248
244 249
245 void Socket::GetError(intptr_t fd, OSError* os_error) { 250 void BaseSocket::GetError(intptr_t fd, OSError* os_error) {
246 Handle* handle = reinterpret_cast<Handle*>(fd); 251 Handle* handle = reinterpret_cast<Handle*>(fd);
247 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error()); 252 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error());
248 } 253 }
249 254
250 255
251 int Socket::GetType(intptr_t fd) { 256 int BaseSocket::GetType(intptr_t fd) {
252 Handle* handle = reinterpret_cast<Handle*>(fd); 257 Handle* handle = reinterpret_cast<Handle*>(fd);
253 switch (GetFileType(handle->handle())) { 258 switch (GetFileType(handle->handle())) {
254 case FILE_TYPE_CHAR: 259 case FILE_TYPE_CHAR:
255 return File::kTerminal; 260 return File::kTerminal;
256 case FILE_TYPE_PIPE: 261 case FILE_TYPE_PIPE:
257 return File::kPipe; 262 return File::kPipe;
258 case FILE_TYPE_DISK: 263 case FILE_TYPE_DISK:
259 return File::kFile; 264 return File::kFile;
260 default: 265 default:
261 return GetLastError == NO_ERROR ? File::kOther : -1; 266 return GetLastError == NO_ERROR ? File::kOther : -1;
262 } 267 }
263 } 268 }
264 269
265 270
266 intptr_t Socket::GetStdioHandle(intptr_t num) { 271 intptr_t BaseSocket::GetStdioHandle(intptr_t num) {
267 if (num != 0) { 272 if (num != 0) {
268 return -1; 273 return -1;
269 } 274 }
270 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); 275 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
271 if (handle == INVALID_HANDLE_VALUE) { 276 if (handle == INVALID_HANDLE_VALUE) {
272 return -1; 277 return -1;
273 } 278 }
274 StdHandle* std_handle = new StdHandle(handle); 279 StdHandle* std_handle = new StdHandle(handle);
275 std_handle->MarkDoesNotSupportOverlappedIO(); 280 std_handle->MarkDoesNotSupportOverlappedIO();
276 std_handle->EnsureInitialized(EventHandler::delegate()); 281 std_handle->EnsureInitialized(EventHandler::delegate());
277 return reinterpret_cast<intptr_t>(std_handle); 282 return reinterpret_cast<intptr_t>(std_handle);
278 } 283 }
279 284
280 285
281 intptr_t ServerSocket::Accept(intptr_t fd) { 286 intptr_t ServerSocket::Accept(intptr_t fd) {
282 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd); 287 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
283 ClientSocket* client_socket = listen_socket->Accept(); 288 ClientSocket* client_socket = listen_socket->Accept();
284 if (client_socket != NULL) { 289 if (client_socket != NULL) {
285 return reinterpret_cast<intptr_t>(client_socket); 290 return reinterpret_cast<intptr_t>(client_socket);
286 } else { 291 } else {
287 return -1; 292 return -1;
288 } 293 }
289 } 294 }
290 295
291 296
292 AddressList<SocketAddress>* Socket::LookupAddress(const char* host, 297 AddressList<SocketAddress>* BaseSocket::LookupAddress(const char* host,
293 int type, 298 int type,
294 OSError** os_error) { 299 OSError** os_error) {
295 Initialize(); 300 Initialize();
296 301
297 // Perform a name lookup for a host name. 302 // Perform a name lookup for a host name.
298 struct addrinfo hints; 303 struct addrinfo hints;
299 memset(&hints, 0, sizeof(hints)); 304 memset(&hints, 0, sizeof(hints));
300 hints.ai_family = SocketAddress::FromType(type); 305 hints.ai_family = SocketAddress::FromType(type);
301 hints.ai_socktype = SOCK_STREAM; 306 hints.ai_socktype = SOCK_STREAM;
302 hints.ai_flags = AI_ADDRCONFIG; 307 hints.ai_flags = AI_ADDRCONFIG;
303 hints.ai_protocol = IPPROTO_TCP; 308 hints.ai_protocol = IPPROTO_TCP;
304 struct addrinfo* info = NULL; 309 struct addrinfo* info = NULL;
(...skipping 23 matching lines...) Expand all
328 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) { 333 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) {
329 addresses->SetAt(i, new SocketAddress(c->ai_addr)); 334 addresses->SetAt(i, new SocketAddress(c->ai_addr));
330 i++; 335 i++;
331 } 336 }
332 } 337 }
333 freeaddrinfo(info); 338 freeaddrinfo(info);
334 return addresses; 339 return addresses;
335 } 340 }
336 341
337 342
338 bool Socket::ReverseLookup(const RawAddr& addr, 343 bool BaseSocket::ReverseLookup(const RawAddr& addr,
339 char* host, 344 char* host,
340 intptr_t host_len, 345 intptr_t host_len,
341 OSError** os_error) { 346 OSError** os_error) {
342 ASSERT(host_len >= NI_MAXHOST); 347 ASSERT(host_len >= NI_MAXHOST);
343 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host, 348 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host,
344 host_len, NULL, 0, NI_NAMEREQD); 349 host_len, NULL, 0, NI_NAMEREQD);
345 if (status != 0) { 350 if (status != 0) {
346 ASSERT(*os_error == NULL); 351 ASSERT(*os_error == NULL);
347 DWORD error_code = WSAGetLastError(); 352 DWORD error_code = WSAGetLastError();
348 SetLastError(error_code); 353 SetLastError(error_code);
349 *os_error = new OSError(); 354 *os_error = new OSError();
350 return false; 355 return false;
351 } 356 }
352 return true; 357 return true;
353 } 358 }
354 359
355 360
356 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) { 361 bool BaseSocket::ParseAddress(int type, const char* address, RawAddr* addr) {
357 int result; 362 int result;
358 Utf8ToWideScope system_address(address); 363 Utf8ToWideScope system_address(address);
359 if (type == SocketAddress::TYPE_IPV4) { 364 if (type == SocketAddress::TYPE_IPV4) {
360 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr); 365 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr);
361 } else { 366 } else {
362 ASSERT(type == SocketAddress::TYPE_IPV6); 367 ASSERT(type == SocketAddress::TYPE_IPV6);
363 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr); 368 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr);
364 } 369 }
365 return result == 1; 370 return result == 1;
366 } 371 }
(...skipping 25 matching lines...) Expand all
392 SetLastError(rc); 397 SetLastError(rc);
393 return -1; 398 return -1;
394 } 399 }
395 400
396 DatagramSocket* datagram_socket = new DatagramSocket(s); 401 DatagramSocket* datagram_socket = new DatagramSocket(s);
397 datagram_socket->EnsureInitialized(EventHandler::delegate()); 402 datagram_socket->EnsureInitialized(EventHandler::delegate());
398 return reinterpret_cast<intptr_t>(datagram_socket); 403 return reinterpret_cast<intptr_t>(datagram_socket);
399 } 404 }
400 405
401 406
402 bool Socket::ListInterfacesSupported() { 407 bool BaseSocket::ListInterfacesSupported() {
403 return true; 408 return true;
404 } 409 }
405 410
406 411
407 AddressList<InterfaceSocketAddress>* Socket::ListInterfaces( 412 AddressList<InterfaceSocketAddress>* BaseSocket::ListInterfaces(
408 int type, 413 int type,
409 OSError** os_error) { 414 OSError** os_error) {
410 Initialize(); 415 Initialize();
411 416
412 ULONG size = 0; 417 ULONG size = 0;
413 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | 418 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
414 GAA_FLAG_SKIP_DNS_SERVER; 419 GAA_FLAG_SKIP_DNS_SERVER;
415 // Query the size needed. 420 // Query the size needed.
416 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL, 421 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL,
417 NULL, &size); 422 NULL, &size);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 DWORD rc = WSAGetLastError(); 489 DWORD rc = WSAGetLastError();
485 closesocket(s); 490 closesocket(s);
486 SetLastError(rc); 491 SetLastError(rc);
487 return -1; 492 return -1;
488 } 493 }
489 494
490 ListenSocket* listen_socket = new ListenSocket(s); 495 ListenSocket* listen_socket = new ListenSocket(s);
491 496
492 // Test for invalid socket port 65535 (some browsers disallow it). 497 // Test for invalid socket port 65535 (some browsers disallow it).
493 if ((SocketAddress::GetAddrPort(addr) == 0) && 498 if ((SocketAddress::GetAddrPort(addr) == 0) &&
494 (Socket::GetPort(reinterpret_cast<intptr_t>(listen_socket)) == 65535)) { 499 (BaseSocket::GetPort(reinterpret_cast<intptr_t>(listen_socket)) ==
500 65535)) {
495 // Don't close fd until we have created new. By doing that we ensure another 501 // Don't close fd until we have created new. By doing that we ensure another
496 // port. 502 // port.
497 intptr_t new_s = CreateBindListen(addr, backlog, v6_only); 503 intptr_t new_s = CreateBindListen(addr, backlog, v6_only);
498 DWORD rc = WSAGetLastError(); 504 DWORD rc = WSAGetLastError();
499 closesocket(s); 505 closesocket(s);
500 delete listen_socket; 506 delete listen_socket;
501 SetLastError(rc); 507 SetLastError(rc);
502 return new_s; 508 return new_s;
503 } 509 }
504 510
(...skipping 24 matching lines...) Expand all
529 delete listen_socket; 535 delete listen_socket;
530 } 536 }
531 SetLastError(rc); 537 SetLastError(rc);
532 return false; 538 return false;
533 } 539 }
534 } 540 }
535 return true; 541 return true;
536 } 542 }
537 543
538 544
539 void Socket::Close(intptr_t fd) { 545 void BaseSocket::Close(intptr_t fd) {
540 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 546 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
541 client_socket->Close(); 547 client_socket->Close();
542 } 548 }
543 549
544 550
545 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) { 551 bool BaseSocket::GetNoDelay(intptr_t fd, bool* enabled) {
546 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 552 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
547 int on; 553 int on;
548 socklen_t len = sizeof(on); 554 socklen_t len = sizeof(on);
549 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 555 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
550 reinterpret_cast<char*>(&on), &len); 556 reinterpret_cast<char*>(&on), &len);
551 if (err == 0) { 557 if (err == 0) {
552 *enabled = (on == 1); 558 *enabled = (on == 1);
553 } 559 }
554 return (err == 0); 560 return (err == 0);
555 } 561 }
556 562
557 563
558 bool Socket::SetNoDelay(intptr_t fd, bool enabled) { 564 bool BaseSocket::SetNoDelay(intptr_t fd, bool enabled) {
559 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 565 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
560 int on = enabled ? 1 : 0; 566 int on = enabled ? 1 : 0;
561 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 567 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
562 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 568 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
563 } 569 }
564 570
565 571
566 bool Socket::GetMulticastLoop(intptr_t fd, intptr_t protocol, bool* enabled) { 572 bool BaseSocket::GetMulticastLoop(intptr_t fd,
573 intptr_t protocol,
574 bool* enabled) {
567 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 575 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
568 uint8_t on; 576 uint8_t on;
569 socklen_t len = sizeof(on); 577 socklen_t len = sizeof(on);
570 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 578 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
571 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 579 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
572 : IPV6_MULTICAST_LOOP; 580 : IPV6_MULTICAST_LOOP;
573 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on), 581 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on),
574 &len) == 0) { 582 &len) == 0) {
575 *enabled = (on == 1); 583 *enabled = (on == 1);
576 return true; 584 return true;
577 } 585 }
578 return false; 586 return false;
579 } 587 }
580 588
581 589
582 bool Socket::SetMulticastLoop(intptr_t fd, intptr_t protocol, bool enabled) { 590 bool BaseSocket::SetMulticastLoop(intptr_t fd,
591 intptr_t protocol,
592 bool enabled) {
583 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 593 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
584 int on = enabled ? 1 : 0; 594 int on = enabled ? 1 : 0;
585 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 595 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
586 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 596 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
587 : IPV6_MULTICAST_LOOP; 597 : IPV6_MULTICAST_LOOP;
588 return setsockopt(handle->socket(), level, optname, 598 return setsockopt(handle->socket(), level, optname,
589 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 599 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
590 } 600 }
591 601
592 602
593 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) { 603 bool BaseSocket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
594 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 604 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
595 uint8_t v; 605 uint8_t v;
596 socklen_t len = sizeof(v); 606 socklen_t len = sizeof(v);
597 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 607 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
598 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 608 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
599 : IPV6_MULTICAST_HOPS; 609 : IPV6_MULTICAST_HOPS;
600 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v), 610 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v),
601 &len) == 0) { 611 &len) == 0) {
602 *value = v; 612 *value = v;
603 return true; 613 return true;
604 } 614 }
605 return false; 615 return false;
606 } 616 }
607 617
608 618
609 bool Socket::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) { 619 bool BaseSocket::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) {
610 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 620 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
611 int v = value; 621 int v = value;
612 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 622 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
613 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 623 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
614 : IPV6_MULTICAST_HOPS; 624 : IPV6_MULTICAST_HOPS;
615 return setsockopt(handle->socket(), level, optname, 625 return setsockopt(handle->socket(), level, optname,
616 reinterpret_cast<char*>(&v), sizeof(v)) == 0; 626 reinterpret_cast<char*>(&v), sizeof(v)) == 0;
617 } 627 }
618 628
619 629
620 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) { 630 bool BaseSocket::GetBroadcast(intptr_t fd, bool* enabled) {
621 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 631 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
622 int on; 632 int on;
623 socklen_t len = sizeof(on); 633 socklen_t len = sizeof(on);
624 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 634 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
625 reinterpret_cast<char*>(&on), &len); 635 reinterpret_cast<char*>(&on), &len);
626 if (err == 0) { 636 if (err == 0) {
627 *enabled = (on == 1); 637 *enabled = (on == 1);
628 } 638 }
629 return (err == 0); 639 return (err == 0);
630 } 640 }
631 641
632 642
633 bool Socket::SetBroadcast(intptr_t fd, bool enabled) { 643 bool BaseSocket::SetBroadcast(intptr_t fd, bool enabled) {
634 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 644 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
635 int on = enabled ? 1 : 0; 645 int on = enabled ? 1 : 0;
636 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 646 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
637 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 647 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
638 } 648 }
639 649
640 650
641 bool Socket::JoinMulticast(intptr_t fd, 651 bool BaseSocket::JoinMulticast(intptr_t fd,
642 const RawAddr& addr, 652 const RawAddr& addr,
643 const RawAddr&, 653 const RawAddr&,
644 int interfaceIndex) { 654 int interfaceIndex) {
645 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 655 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
646 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 656 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
647 struct group_req mreq; 657 struct group_req mreq;
648 mreq.gr_interface = interfaceIndex; 658 mreq.gr_interface = interfaceIndex;
649 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 659 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
650 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP, 660 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP,
651 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 661 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
652 } 662 }
653 663
654 664
655 bool Socket::LeaveMulticast(intptr_t fd, 665 bool BaseSocket::LeaveMulticast(intptr_t fd,
656 const RawAddr& addr, 666 const RawAddr& addr,
657 const RawAddr&, 667 const RawAddr&,
658 int interfaceIndex) { 668 int interfaceIndex) {
659 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 669 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
660 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 670 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
661 struct group_req mreq; 671 struct group_req mreq;
662 mreq.gr_interface = interfaceIndex; 672 mreq.gr_interface = interfaceIndex;
663 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 673 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
664 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP, 674 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP,
665 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 675 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
666 } 676 }
667 677
668 } // namespace bin 678 } // namespace bin
669 } // namespace dart 679 } // namespace dart
670 680
671 #endif // defined(TARGET_OS_WINDOWS) 681 #endif // defined(TARGET_OS_WINDOWS)
672 682
673 #endif // !defined(DART_IO_DISABLED) 683 #endif // !defined(DART_IO_DISABLED)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698