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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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_base_unsupported.cc ('k') | runtime/bin/socket_fuchsia.cc » ('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 "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(HOST_OS_WINDOWS) 8 #if defined(HOST_OS_WINDOWS)
9 9
10 #include "bin/socket_base.h" 10 #include "bin/socket_base.h"
(...skipping 20 matching lines...) Expand all
31 int err = 31 int err =
32 SocketBase::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN); 32 SocketBase::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN);
33 33
34 if (err != 0) { 34 if (err != 0) {
35 as_string_[0] = 0; 35 as_string_[0] = 0;
36 } 36 }
37 memmove(reinterpret_cast<void*>(&addr_), sockaddr, 37 memmove(reinterpret_cast<void*>(&addr_), sockaddr,
38 SocketAddress::GetAddrLength(*raw)); 38 SocketAddress::GetAddrLength(*raw));
39 } 39 }
40 40
41
42 static Mutex* init_mutex = new Mutex(); 41 static Mutex* init_mutex = new Mutex();
43 static bool socket_initialized = false; 42 static bool socket_initialized = false;
44 43
45 bool SocketBase::Initialize() { 44 bool SocketBase::Initialize() {
46 MutexLocker lock(init_mutex); 45 MutexLocker lock(init_mutex);
47 if (socket_initialized) { 46 if (socket_initialized) {
48 return true; 47 return true;
49 } 48 }
50 int err; 49 int err;
51 WSADATA winsock_data; 50 WSADATA winsock_data;
52 WORD version_requested = MAKEWORD(2, 2); 51 WORD version_requested = MAKEWORD(2, 2);
53 err = WSAStartup(version_requested, &winsock_data); 52 err = WSAStartup(version_requested, &winsock_data);
54 if (err == 0) { 53 if (err == 0) {
55 socket_initialized = true; 54 socket_initialized = true;
56 } else { 55 } else {
57 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError()); 56 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError());
58 } 57 }
59 return (err == 0); 58 return (err == 0);
60 } 59 }
61 60
62
63 bool SocketBase::FormatNumericAddress(const RawAddr& addr, 61 bool SocketBase::FormatNumericAddress(const RawAddr& addr,
64 char* address, 62 char* address,
65 int len) { 63 int len) {
66 socklen_t salen = SocketAddress::GetAddrLength(addr); 64 socklen_t salen = SocketAddress::GetAddrLength(addr);
67 DWORD l = len; 65 DWORD l = len;
68 RawAddr& raw = const_cast<RawAddr&>(addr); 66 RawAddr& raw = const_cast<RawAddr&>(addr);
69 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0; 67 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0;
70 } 68 }
71 69
72
73 intptr_t SocketBase::Available(intptr_t fd) { 70 intptr_t SocketBase::Available(intptr_t fd) {
74 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 71 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
75 return client_socket->Available(); 72 return client_socket->Available();
76 } 73 }
77 74
78
79 intptr_t SocketBase::Read(intptr_t fd, 75 intptr_t SocketBase::Read(intptr_t fd,
80 void* buffer, 76 void* buffer,
81 intptr_t num_bytes, 77 intptr_t num_bytes,
82 SocketOpKind sync) { 78 SocketOpKind sync) {
83 Handle* handle = reinterpret_cast<Handle*>(fd); 79 Handle* handle = reinterpret_cast<Handle*>(fd);
84 return handle->Read(buffer, num_bytes); 80 return handle->Read(buffer, num_bytes);
85 } 81 }
86 82
87
88 intptr_t SocketBase::RecvFrom(intptr_t fd, 83 intptr_t SocketBase::RecvFrom(intptr_t fd,
89 void* buffer, 84 void* buffer,
90 intptr_t num_bytes, 85 intptr_t num_bytes,
91 RawAddr* addr, 86 RawAddr* addr,
92 SocketOpKind sync) { 87 SocketOpKind sync) {
93 Handle* handle = reinterpret_cast<Handle*>(fd); 88 Handle* handle = reinterpret_cast<Handle*>(fd);
94 socklen_t addr_len = sizeof(addr->ss); 89 socklen_t addr_len = sizeof(addr->ss);
95 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len); 90 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len);
96 } 91 }
97 92
98
99 intptr_t SocketBase::Write(intptr_t fd, 93 intptr_t SocketBase::Write(intptr_t fd,
100 const void* buffer, 94 const void* buffer,
101 intptr_t num_bytes, 95 intptr_t num_bytes,
102 SocketOpKind sync) { 96 SocketOpKind sync) {
103 Handle* handle = reinterpret_cast<Handle*>(fd); 97 Handle* handle = reinterpret_cast<Handle*>(fd);
104 return handle->Write(buffer, num_bytes); 98 return handle->Write(buffer, num_bytes);
105 } 99 }
106 100
107
108 intptr_t SocketBase::SendTo(intptr_t fd, 101 intptr_t SocketBase::SendTo(intptr_t fd,
109 const void* buffer, 102 const void* buffer,
110 intptr_t num_bytes, 103 intptr_t num_bytes,
111 const RawAddr& addr, 104 const RawAddr& addr,
112 SocketOpKind sync) { 105 SocketOpKind sync) {
113 Handle* handle = reinterpret_cast<Handle*>(fd); 106 Handle* handle = reinterpret_cast<Handle*>(fd);
114 RawAddr& raw = const_cast<RawAddr&>(addr); 107 RawAddr& raw = const_cast<RawAddr&>(addr);
115 return handle->SendTo(buffer, num_bytes, &raw.addr, 108 return handle->SendTo(buffer, num_bytes, &raw.addr,
116 SocketAddress::GetAddrLength(addr)); 109 SocketAddress::GetAddrLength(addr));
117 } 110 }
118 111
119
120 intptr_t SocketBase::GetPort(intptr_t fd) { 112 intptr_t SocketBase::GetPort(intptr_t fd) {
121 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 113 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
122 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 114 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
123 RawAddr raw; 115 RawAddr raw;
124 socklen_t size = sizeof(raw); 116 socklen_t size = sizeof(raw);
125 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) { 117 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) {
126 return 0; 118 return 0;
127 } 119 }
128 return SocketAddress::GetAddrPort(raw); 120 return SocketAddress::GetAddrPort(raw);
129 } 121 }
130 122
131
132 SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) { 123 SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) {
133 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 124 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
134 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 125 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
135 RawAddr raw; 126 RawAddr raw;
136 socklen_t size = sizeof(raw); 127 socklen_t size = sizeof(raw);
137 if (getpeername(socket_handle->socket(), &raw.addr, &size)) { 128 if (getpeername(socket_handle->socket(), &raw.addr, &size)) {
138 return NULL; 129 return NULL;
139 } 130 }
140 *port = SocketAddress::GetAddrPort(raw); 131 *port = SocketAddress::GetAddrPort(raw);
141 // Clear the port before calling WSAAddressToString as WSAAddressToString 132 // Clear the port before calling WSAAddressToString as WSAAddressToString
142 // includes the port in the formatted string. 133 // includes the port in the formatted string.
143 SocketAddress::SetAddrPort(&raw, 0); 134 SocketAddress::SetAddrPort(&raw, 0);
144 return new SocketAddress(&raw.addr); 135 return new SocketAddress(&raw.addr);
145 } 136 }
146 137
147
148 bool SocketBase::IsBindError(intptr_t error_number) { 138 bool SocketBase::IsBindError(intptr_t error_number) {
149 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL || 139 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL ||
150 error_number == WSAEINVAL; 140 error_number == WSAEINVAL;
151 } 141 }
152 142
153
154 void SocketBase::GetError(intptr_t fd, OSError* os_error) { 143 void SocketBase::GetError(intptr_t fd, OSError* os_error) {
155 Handle* handle = reinterpret_cast<Handle*>(fd); 144 Handle* handle = reinterpret_cast<Handle*>(fd);
156 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error()); 145 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error());
157 } 146 }
158 147
159
160 int SocketBase::GetType(intptr_t fd) { 148 int SocketBase::GetType(intptr_t fd) {
161 Handle* handle = reinterpret_cast<Handle*>(fd); 149 Handle* handle = reinterpret_cast<Handle*>(fd);
162 switch (GetFileType(handle->handle())) { 150 switch (GetFileType(handle->handle())) {
163 case FILE_TYPE_CHAR: 151 case FILE_TYPE_CHAR:
164 return File::kTerminal; 152 return File::kTerminal;
165 case FILE_TYPE_PIPE: 153 case FILE_TYPE_PIPE:
166 return File::kPipe; 154 return File::kPipe;
167 case FILE_TYPE_DISK: 155 case FILE_TYPE_DISK:
168 return File::kFile; 156 return File::kFile;
169 default: 157 default:
170 return GetLastError == NO_ERROR ? File::kOther : -1; 158 return GetLastError == NO_ERROR ? File::kOther : -1;
171 } 159 }
172 } 160 }
173 161
174
175 intptr_t SocketBase::GetStdioHandle(intptr_t num) { 162 intptr_t SocketBase::GetStdioHandle(intptr_t num) {
176 if (num != 0) { 163 if (num != 0) {
177 return -1; 164 return -1;
178 } 165 }
179 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); 166 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
180 if (handle == INVALID_HANDLE_VALUE) { 167 if (handle == INVALID_HANDLE_VALUE) {
181 return -1; 168 return -1;
182 } 169 }
183 StdHandle* std_handle = StdHandle::Stdin(handle); 170 StdHandle* std_handle = StdHandle::Stdin(handle);
184 std_handle->Retain(); 171 std_handle->Retain();
185 std_handle->MarkDoesNotSupportOverlappedIO(); 172 std_handle->MarkDoesNotSupportOverlappedIO();
186 std_handle->EnsureInitialized(EventHandler::delegate()); 173 std_handle->EnsureInitialized(EventHandler::delegate());
187 return reinterpret_cast<intptr_t>(std_handle); 174 return reinterpret_cast<intptr_t>(std_handle);
188 } 175 }
189 176
190
191 AddressList<SocketAddress>* SocketBase::LookupAddress(const char* host, 177 AddressList<SocketAddress>* SocketBase::LookupAddress(const char* host,
192 int type, 178 int type,
193 OSError** os_error) { 179 OSError** os_error) {
194 Initialize(); 180 Initialize();
195 181
196 // Perform a name lookup for a host name. 182 // Perform a name lookup for a host name.
197 struct addrinfo hints; 183 struct addrinfo hints;
198 memset(&hints, 0, sizeof(hints)); 184 memset(&hints, 0, sizeof(hints));
199 hints.ai_family = SocketAddress::FromType(type); 185 hints.ai_family = SocketAddress::FromType(type);
200 hints.ai_socktype = SOCK_STREAM; 186 hints.ai_socktype = SOCK_STREAM;
(...skipping 25 matching lines...) Expand all
226 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { 212 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) {
227 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) { 213 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) {
228 addresses->SetAt(i, new SocketAddress(c->ai_addr)); 214 addresses->SetAt(i, new SocketAddress(c->ai_addr));
229 i++; 215 i++;
230 } 216 }
231 } 217 }
232 freeaddrinfo(info); 218 freeaddrinfo(info);
233 return addresses; 219 return addresses;
234 } 220 }
235 221
236
237 bool SocketBase::ReverseLookup(const RawAddr& addr, 222 bool SocketBase::ReverseLookup(const RawAddr& addr,
238 char* host, 223 char* host,
239 intptr_t host_len, 224 intptr_t host_len,
240 OSError** os_error) { 225 OSError** os_error) {
241 ASSERT(host_len >= NI_MAXHOST); 226 ASSERT(host_len >= NI_MAXHOST);
242 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host, 227 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host,
243 host_len, NULL, 0, NI_NAMEREQD); 228 host_len, NULL, 0, NI_NAMEREQD);
244 if (status != 0) { 229 if (status != 0) {
245 ASSERT(*os_error == NULL); 230 ASSERT(*os_error == NULL);
246 DWORD error_code = WSAGetLastError(); 231 DWORD error_code = WSAGetLastError();
247 SetLastError(error_code); 232 SetLastError(error_code);
248 *os_error = new OSError(); 233 *os_error = new OSError();
249 return false; 234 return false;
250 } 235 }
251 return true; 236 return true;
252 } 237 }
253 238
254
255 bool SocketBase::ParseAddress(int type, const char* address, RawAddr* addr) { 239 bool SocketBase::ParseAddress(int type, const char* address, RawAddr* addr) {
256 int result; 240 int result;
257 Utf8ToWideScope system_address(address); 241 Utf8ToWideScope system_address(address);
258 if (type == SocketAddress::TYPE_IPV4) { 242 if (type == SocketAddress::TYPE_IPV4) {
259 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr); 243 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr);
260 } else { 244 } else {
261 ASSERT(type == SocketAddress::TYPE_IPV6); 245 ASSERT(type == SocketAddress::TYPE_IPV6);
262 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr); 246 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr);
263 } 247 }
264 return result == 1; 248 return result == 1;
265 } 249 }
266 250
267
268 bool SocketBase::ListInterfacesSupported() { 251 bool SocketBase::ListInterfacesSupported() {
269 return true; 252 return true;
270 } 253 }
271 254
272
273 AddressList<InterfaceSocketAddress>* SocketBase::ListInterfaces( 255 AddressList<InterfaceSocketAddress>* SocketBase::ListInterfaces(
274 int type, 256 int type,
275 OSError** os_error) { 257 OSError** os_error) {
276 Initialize(); 258 Initialize();
277 259
278 ULONG size = 0; 260 ULONG size = 0;
279 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | 261 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
280 GAA_FLAG_SKIP_DNS_SERVER; 262 GAA_FLAG_SKIP_DNS_SERVER;
281 // Query the size needed. 263 // Query the size needed.
282 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL, 264 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL,
(...skipping 29 matching lines...) Expand all
312 i, new InterfaceSocketAddress( 294 i, new InterfaceSocketAddress(
313 u->Address.lpSockaddr, 295 u->Address.lpSockaddr,
314 StringUtilsWin::WideToUtf8(a->FriendlyName), a->Ipv6IfIndex)); 296 StringUtilsWin::WideToUtf8(a->FriendlyName), a->Ipv6IfIndex));
315 i++; 297 i++;
316 } 298 }
317 } 299 }
318 free(addrs); 300 free(addrs);
319 return addresses; 301 return addresses;
320 } 302 }
321 303
322
323 void SocketBase::Close(intptr_t fd) { 304 void SocketBase::Close(intptr_t fd) {
324 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 305 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
325 client_socket->Close(); 306 client_socket->Close();
326 } 307 }
327 308
328
329 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) { 309 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
330 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 310 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
331 int on; 311 int on;
332 socklen_t len = sizeof(on); 312 socklen_t len = sizeof(on);
333 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 313 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
334 reinterpret_cast<char*>(&on), &len); 314 reinterpret_cast<char*>(&on), &len);
335 if (err == 0) { 315 if (err == 0) {
336 *enabled = (on == 1); 316 *enabled = (on == 1);
337 } 317 }
338 return (err == 0); 318 return (err == 0);
339 } 319 }
340 320
341
342 bool SocketBase::SetNoDelay(intptr_t fd, bool enabled) { 321 bool SocketBase::SetNoDelay(intptr_t fd, bool enabled) {
343 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 322 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
344 int on = enabled ? 1 : 0; 323 int on = enabled ? 1 : 0;
345 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 324 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
346 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 325 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
347 } 326 }
348 327
349
350 bool SocketBase::GetMulticastLoop(intptr_t fd, 328 bool SocketBase::GetMulticastLoop(intptr_t fd,
351 intptr_t protocol, 329 intptr_t protocol,
352 bool* enabled) { 330 bool* enabled) {
353 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 331 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
354 uint8_t on; 332 uint8_t on;
355 socklen_t len = sizeof(on); 333 socklen_t len = sizeof(on);
356 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 334 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
357 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 335 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
358 : IPV6_MULTICAST_LOOP; 336 : IPV6_MULTICAST_LOOP;
359 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on), 337 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on),
360 &len) == 0) { 338 &len) == 0) {
361 *enabled = (on == 1); 339 *enabled = (on == 1);
362 return true; 340 return true;
363 } 341 }
364 return false; 342 return false;
365 } 343 }
366 344
367
368 bool SocketBase::SetMulticastLoop(intptr_t fd, 345 bool SocketBase::SetMulticastLoop(intptr_t fd,
369 intptr_t protocol, 346 intptr_t protocol,
370 bool enabled) { 347 bool enabled) {
371 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 348 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
372 int on = enabled ? 1 : 0; 349 int on = enabled ? 1 : 0;
373 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 350 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
374 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 351 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
375 : IPV6_MULTICAST_LOOP; 352 : IPV6_MULTICAST_LOOP;
376 return setsockopt(handle->socket(), level, optname, 353 return setsockopt(handle->socket(), level, optname,
377 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 354 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
378 } 355 }
379 356
380
381 bool SocketBase::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) { 357 bool SocketBase::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
382 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 358 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
383 uint8_t v; 359 uint8_t v;
384 socklen_t len = sizeof(v); 360 socklen_t len = sizeof(v);
385 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 361 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
386 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 362 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
387 : IPV6_MULTICAST_HOPS; 363 : IPV6_MULTICAST_HOPS;
388 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v), 364 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v),
389 &len) == 0) { 365 &len) == 0) {
390 *value = v; 366 *value = v;
391 return true; 367 return true;
392 } 368 }
393 return false; 369 return false;
394 } 370 }
395 371
396
397 bool SocketBase::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) { 372 bool SocketBase::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) {
398 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 373 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
399 int v = value; 374 int v = value;
400 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 375 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
401 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 376 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
402 : IPV6_MULTICAST_HOPS; 377 : IPV6_MULTICAST_HOPS;
403 return setsockopt(handle->socket(), level, optname, 378 return setsockopt(handle->socket(), level, optname,
404 reinterpret_cast<char*>(&v), sizeof(v)) == 0; 379 reinterpret_cast<char*>(&v), sizeof(v)) == 0;
405 } 380 }
406 381
407
408 bool SocketBase::GetBroadcast(intptr_t fd, bool* enabled) { 382 bool SocketBase::GetBroadcast(intptr_t fd, bool* enabled) {
409 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 383 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
410 int on; 384 int on;
411 socklen_t len = sizeof(on); 385 socklen_t len = sizeof(on);
412 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 386 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
413 reinterpret_cast<char*>(&on), &len); 387 reinterpret_cast<char*>(&on), &len);
414 if (err == 0) { 388 if (err == 0) {
415 *enabled = (on == 1); 389 *enabled = (on == 1);
416 } 390 }
417 return (err == 0); 391 return (err == 0);
418 } 392 }
419 393
420
421 bool SocketBase::SetBroadcast(intptr_t fd, bool enabled) { 394 bool SocketBase::SetBroadcast(intptr_t fd, bool enabled) {
422 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 395 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
423 int on = enabled ? 1 : 0; 396 int on = enabled ? 1 : 0;
424 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 397 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
425 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 398 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
426 } 399 }
427 400
428
429 bool SocketBase::JoinMulticast(intptr_t fd, 401 bool SocketBase::JoinMulticast(intptr_t fd,
430 const RawAddr& addr, 402 const RawAddr& addr,
431 const RawAddr&, 403 const RawAddr&,
432 int interfaceIndex) { 404 int interfaceIndex) {
433 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 405 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
434 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 406 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
435 struct group_req mreq; 407 struct group_req mreq;
436 mreq.gr_interface = interfaceIndex; 408 mreq.gr_interface = interfaceIndex;
437 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 409 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
438 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP, 410 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP,
439 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 411 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
440 } 412 }
441 413
442
443 bool SocketBase::LeaveMulticast(intptr_t fd, 414 bool SocketBase::LeaveMulticast(intptr_t fd,
444 const RawAddr& addr, 415 const RawAddr& addr,
445 const RawAddr&, 416 const RawAddr&,
446 int interfaceIndex) { 417 int interfaceIndex) {
447 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 418 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
448 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 419 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
449 struct group_req mreq; 420 struct group_req mreq;
450 mreq.gr_interface = interfaceIndex; 421 mreq.gr_interface = interfaceIndex;
451 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 422 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
452 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP, 423 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP,
453 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 424 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
454 } 425 }
455 426
456 } // namespace bin 427 } // namespace bin
457 } // namespace dart 428 } // namespace dart
458 429
459 #endif // defined(HOST_OS_WINDOWS) 430 #endif // defined(HOST_OS_WINDOWS)
460 431
461 #endif // !defined(DART_IO_DISABLED) 432 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/socket_base_unsupported.cc ('k') | runtime/bin/socket_fuchsia.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698