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

Side by Side Diff: runtime/bin/socket_android.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
« no previous file with comments | « runtime/bin/socket.cc ('k') | runtime/bin/socket_linux.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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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_ANDROID) 6 #if defined(TARGET_OS_ANDROID)
7 7
8 #include "bin/socket.h" 8 #include "bin/socket.h"
9 #include "bin/socket_android.h" 9 #include "bin/socket_android.h"
10 10
11 #include <errno.h> // NOLINT 11 #include <errno.h> // NOLINT
12 #include <netinet/tcp.h> // NOLINT
12 #include <stdio.h> // NOLINT 13 #include <stdio.h> // NOLINT
13 #include <stdlib.h> // NOLINT 14 #include <stdlib.h> // NOLINT
14 #include <string.h> // NOLINT 15 #include <string.h> // NOLINT
15 #include <sys/stat.h> // NOLINT 16 #include <sys/stat.h> // NOLINT
16 #include <unistd.h> // NOLINT 17 #include <unistd.h> // NOLINT
17 #include <netinet/tcp.h> // NOLINT
18 18
19 #include "bin/fdutils.h" 19 #include "bin/fdutils.h"
20 #include "bin/file.h" 20 #include "bin/file.h"
21 #include "platform/signal_blocker.h" 21 #include "platform/signal_blocker.h"
22 22
23 namespace dart { 23 namespace dart {
24 namespace bin { 24 namespace bin {
25 25
26 SocketAddress::SocketAddress(struct sockaddr* sa) { 26 SocketAddress::SocketAddress(struct sockaddr* sa) {
27 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); 27 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
28 if (!Socket::FormatNumericAddress( 28 if (!Socket::FormatNumericAddress(
29 *reinterpret_cast<RawAddr*>(sa), as_string_, INET6_ADDRSTRLEN)) { 29 *reinterpret_cast<RawAddr*>(sa), as_string_, INET6_ADDRSTRLEN)) {
30 as_string_[0] = 0; 30 as_string_[0] = 0;
31 } 31 }
32 socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa)); 32 socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
33 memmove(reinterpret_cast<void *>(&addr_), sa, salen); 33 memmove(reinterpret_cast<void *>(&addr_), sa, salen);
34 } 34 }
35 35
36 36
37 bool Socket::FormatNumericAddress(const RawAddr& addr, char* address, int len) { 37 bool Socket::FormatNumericAddress(const RawAddr& addr, char* address, int len) {
38 socklen_t salen = SocketAddress::GetAddrLength(addr); 38 socklen_t salen = SocketAddress::GetAddrLength(addr);
39 if (NO_RETRY_EXPECTED(getnameinfo(&addr.addr, 39 return (NO_RETRY_EXPECTED(getnameinfo(
40 salen, 40 &addr.addr, salen, address, len, NULL, 0, NI_NUMERICHOST)) == 0);
41 address,
42 len,
43 NULL,
44 0,
45 NI_NUMERICHOST)) != 0) {
46 return false;
47 }
48 return true;
49 } 41 }
50 42
51 43
52 bool Socket::Initialize() { 44 bool Socket::Initialize() {
53 // Nothing to do on Android. 45 // Nothing to do on Android.
54 return true; 46 return true;
55 } 47 }
56 48
57 49
58 static intptr_t Create(const RawAddr& addr) { 50 static intptr_t Create(const RawAddr& addr) {
59 intptr_t fd; 51 intptr_t fd;
60 fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0)); 52 fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
61 if (fd < 0) { 53 if (fd < 0) {
62 return -1; 54 return -1;
63 } 55 }
64 FDUtils::SetCloseOnExec(fd); 56 FDUtils::SetCloseOnExec(fd);
65 return fd; 57 return fd;
66 } 58 }
67 59
68 60
69 static intptr_t Connect(intptr_t fd, const RawAddr& addr) { 61 static intptr_t Connect(intptr_t fd, const RawAddr& addr) {
70 intptr_t result = TEMP_FAILURE_RETRY( 62 intptr_t result = TEMP_FAILURE_RETRY(
71 connect(fd, &addr.addr, SocketAddress::GetAddrLength(addr))); 63 connect(fd, &addr.addr, SocketAddress::GetAddrLength(addr)));
72 if (result == 0 || errno == EINPROGRESS) { 64 if ((result == 0) || (errno == EINPROGRESS)) {
73 return fd; 65 return fd;
74 } 66 }
75 VOID_TEMP_FAILURE_RETRY(close(fd)); 67 VOID_TEMP_FAILURE_RETRY(close(fd));
76 return -1; 68 return -1;
77 } 69 }
78 70
79 71
80 intptr_t Socket::CreateConnect(const RawAddr& addr) { 72 intptr_t Socket::CreateConnect(const RawAddr& addr) {
81 intptr_t fd = Create(addr); 73 intptr_t fd = Create(addr);
82 if (fd < 0) { 74 if (fd < 0) {
83 return fd; 75 return fd;
84 } 76 }
85 77
86 FDUtils::SetNonBlocking(fd); 78 FDUtils::SetNonBlocking(fd);
87 79
88 return Connect(fd, addr); 80 return Connect(fd, addr);
89 } 81 }
90 82
91 83
92 intptr_t Socket::CreateBindConnect(const RawAddr& addr, 84 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
93 const RawAddr& source_addr) { 85 const RawAddr& source_addr) {
94 intptr_t fd = Create(addr); 86 intptr_t fd = Create(addr);
95 if (fd < 0) { 87 if (fd < 0) {
96 return fd; 88 return fd;
97 } 89 }
98 90
99 intptr_t result = TEMP_FAILURE_RETRY( 91 intptr_t result = TEMP_FAILURE_RETRY(
100 bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr))); 92 bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
101 if (result != 0 && errno != EINPROGRESS) { 93 if ((result != 0) && (errno != EINPROGRESS)) {
102 VOID_TEMP_FAILURE_RETRY(close(fd)); 94 VOID_TEMP_FAILURE_RETRY(close(fd));
103 return -1; 95 return -1;
104 } 96 }
105 97
106 return Connect(fd, addr); 98 return Connect(fd, addr);
107 } 99 }
108 100
109 101
110 intptr_t Socket::Available(intptr_t fd) { 102 intptr_t Socket::Available(intptr_t fd) {
111 return FDUtils::AvailableBytes(fd); 103 return FDUtils::AvailableBytes(fd);
112 } 104 }
113 105
114 106
115 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) { 107 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
116 ASSERT(fd >= 0); 108 ASSERT(fd >= 0);
117 ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes)); 109 ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
118 ASSERT(EAGAIN == EWOULDBLOCK); 110 ASSERT(EAGAIN == EWOULDBLOCK);
119 if (read_bytes == -1 && errno == EWOULDBLOCK) { 111 if ((read_bytes == -1) && (errno == EWOULDBLOCK)) {
120 // If the read would block we need to retry and therefore return 0 112 // If the read would block we need to retry and therefore return 0
121 // as the number of bytes written. 113 // as the number of bytes written.
122 read_bytes = 0; 114 read_bytes = 0;
123 } 115 }
124 return read_bytes; 116 return read_bytes;
125 } 117 }
126 118
127 119
128 intptr_t Socket::RecvFrom( 120 intptr_t Socket::RecvFrom(
129 intptr_t fd, void* buffer, intptr_t num_bytes, RawAddr* addr) { 121 intptr_t fd, void* buffer, intptr_t num_bytes, RawAddr* addr) {
130 ASSERT(fd >= 0); 122 ASSERT(fd >= 0);
131 socklen_t addr_len = sizeof(addr->ss); 123 socklen_t addr_len = sizeof(addr->ss);
132 ssize_t read_bytes = TEMP_FAILURE_RETRY( 124 ssize_t read_bytes = TEMP_FAILURE_RETRY(
133 recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len)); 125 recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
134 if (read_bytes == -1 && errno == EWOULDBLOCK) { 126 if ((read_bytes == -1) && (errno == EWOULDBLOCK)) {
135 // If the read would block we need to retry and therefore return 0 127 // If the read would block we need to retry and therefore return 0
136 // as the number of bytes written. 128 // as the number of bytes written.
137 read_bytes = 0; 129 read_bytes = 0;
138 } 130 }
139 return read_bytes; 131 return read_bytes;
140 } 132 }
141 133
142 134
143 intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) { 135 intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
144 ASSERT(fd >= 0); 136 ASSERT(fd >= 0);
145 ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes)); 137 ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
146 ASSERT(EAGAIN == EWOULDBLOCK); 138 ASSERT(EAGAIN == EWOULDBLOCK);
147 if (written_bytes == -1 && errno == EWOULDBLOCK) { 139 if ((written_bytes == -1) && (errno == EWOULDBLOCK)) {
148 // If the would block we need to retry and therefore return 0 as 140 // If the would block we need to retry and therefore return 0 as
149 // the number of bytes written. 141 // the number of bytes written.
150 written_bytes = 0; 142 written_bytes = 0;
151 } 143 }
152 return written_bytes; 144 return written_bytes;
153 } 145 }
154 146
155 147
156 intptr_t Socket::SendTo( 148 intptr_t Socket::SendTo(
157 intptr_t fd, const void* buffer, intptr_t num_bytes, const RawAddr& addr) { 149 intptr_t fd, const void* buffer, intptr_t num_bytes, const RawAddr& addr) {
158 ASSERT(fd >= 0); 150 ASSERT(fd >= 0);
159 ssize_t written_bytes = TEMP_FAILURE_RETRY( 151 ssize_t written_bytes = TEMP_FAILURE_RETRY(
160 sendto(fd, buffer, num_bytes, 0, 152 sendto(fd, buffer, num_bytes, 0,
161 &addr.addr, SocketAddress::GetAddrLength(addr))); 153 &addr.addr, SocketAddress::GetAddrLength(addr)));
162 ASSERT(EAGAIN == EWOULDBLOCK); 154 ASSERT(EAGAIN == EWOULDBLOCK);
163 if (written_bytes == -1 && errno == EWOULDBLOCK) { 155 if ((written_bytes == -1) && (errno == EWOULDBLOCK)) {
164 // If the would block we need to retry and therefore return 0 as 156 // If the would block we need to retry and therefore return 0 as
165 // the number of bytes written. 157 // the number of bytes written.
166 written_bytes = 0; 158 written_bytes = 0;
167 } 159 }
168 return written_bytes; 160 return written_bytes;
169 } 161 }
170 162
171 163
172 intptr_t Socket::GetPort(intptr_t fd) { 164 intptr_t Socket::GetPort(intptr_t fd) {
173 ASSERT(fd >= 0); 165 ASSERT(fd >= 0);
(...skipping 26 matching lines...) Expand all
200 SO_ERROR, 192 SO_ERROR,
201 reinterpret_cast<void*>(&errorNumber), 193 reinterpret_cast<void*>(&errorNumber),
202 &len); 194 &len);
203 os_error->SetCodeAndMessage(OSError::kSystem, errorNumber); 195 os_error->SetCodeAndMessage(OSError::kSystem, errorNumber);
204 } 196 }
205 197
206 198
207 int Socket::GetType(intptr_t fd) { 199 int Socket::GetType(intptr_t fd) {
208 struct stat buf; 200 struct stat buf;
209 int result = fstat(fd, &buf); 201 int result = fstat(fd, &buf);
210 if (result == -1) return -1; 202 if (result == -1) {
211 if (S_ISCHR(buf.st_mode)) return File::kTerminal; 203 return -1;
212 if (S_ISFIFO(buf.st_mode)) return File::kPipe; 204 }
213 if (S_ISREG(buf.st_mode)) return File::kFile; 205 if (S_ISCHR(buf.st_mode)) {
206 return File::kTerminal;
207 }
208 if (S_ISFIFO(buf.st_mode)) {
209 return File::kPipe;
210 }
211 if (S_ISREG(buf.st_mode)) {
212 return File::kFile;
213 }
214 return File::kOther; 214 return File::kOther;
215 } 215 }
216 216
217 217
218 intptr_t Socket::GetStdioHandle(intptr_t num) { 218 intptr_t Socket::GetStdioHandle(intptr_t num) {
219 return num; 219 return num;
220 } 220 }
221 221
222 222
223 AddressList<SocketAddress>* Socket::LookupAddress(const char* host, 223 AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
(...skipping 16 matching lines...) Expand all
240 if (status != 0) { 240 if (status != 0) {
241 ASSERT(*os_error == NULL); 241 ASSERT(*os_error == NULL);
242 *os_error = new OSError(status, 242 *os_error = new OSError(status,
243 gai_strerror(status), 243 gai_strerror(status),
244 OSError::kGetAddressInfo); 244 OSError::kGetAddressInfo);
245 return NULL; 245 return NULL;
246 } 246 }
247 } 247 }
248 intptr_t count = 0; 248 intptr_t count = 0;
249 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { 249 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) {
250 if (c->ai_family == AF_INET || c->ai_family == AF_INET6) count++; 250 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) {
251 count++;
252 }
251 } 253 }
252 intptr_t i = 0; 254 intptr_t i = 0;
253 AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count); 255 AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count);
254 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { 256 for (struct addrinfo* c = info; c != NULL; c = c->ai_next) {
255 if (c->ai_family == AF_INET || c->ai_family == AF_INET6) { 257 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) {
256 addresses->SetAt(i, new SocketAddress(c->ai_addr)); 258 addresses->SetAt(i, new SocketAddress(c->ai_addr));
257 i++; 259 i++;
258 } 260 }
259 } 261 }
260 freeaddrinfo(info); 262 freeaddrinfo(info);
261 return addresses; 263 return addresses;
262 } 264 }
263 265
264 266
265 bool Socket::ReverseLookup(const RawAddr& addr, 267 bool Socket::ReverseLookup(const RawAddr& addr,
(...skipping 21 matching lines...) Expand all
287 289
288 290
289 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) { 291 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
290 int result; 292 int result;
291 if (type == SocketAddress::TYPE_IPV4) { 293 if (type == SocketAddress::TYPE_IPV4) {
292 result = inet_pton(AF_INET, address, &addr->in.sin_addr); 294 result = inet_pton(AF_INET, address, &addr->in.sin_addr);
293 } else { 295 } else {
294 ASSERT(type == SocketAddress::TYPE_IPV6); 296 ASSERT(type == SocketAddress::TYPE_IPV6);
295 result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr); 297 result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
296 } 298 }
297 return result == 1; 299 return (result == 1);
298 } 300 }
299 301
300 302
301 intptr_t Socket::CreateBindDatagram(const RawAddr& addr, bool reuseAddress) { 303 intptr_t Socket::CreateBindDatagram(const RawAddr& addr, bool reuseAddress) {
302 intptr_t fd; 304 intptr_t fd;
303 305
304 fd = NO_RETRY_EXPECTED(socket(addr.addr.sa_family, SOCK_DGRAM, IPPROTO_UDP)); 306 fd = NO_RETRY_EXPECTED(socket(addr.addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
305 if (fd < 0) return -1; 307 if (fd < 0) {
308 return -1;
309 }
306 310
307 FDUtils::SetCloseOnExec(fd); 311 FDUtils::SetCloseOnExec(fd);
308 312
309 if (reuseAddress) { 313 if (reuseAddress) {
310 int optval = 1; 314 int optval = 1;
311 VOID_NO_RETRY_EXPECTED( 315 VOID_NO_RETRY_EXPECTED(
312 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))); 316 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
313 } 317 }
314 318
315 if (NO_RETRY_EXPECTED( 319 if (NO_RETRY_EXPECTED(
(...skipping 17 matching lines...) Expand all
333 return NULL; 337 return NULL;
334 } 338 }
335 339
336 340
337 intptr_t ServerSocket::CreateBindListen(const RawAddr& addr, 341 intptr_t ServerSocket::CreateBindListen(const RawAddr& addr,
338 intptr_t backlog, 342 intptr_t backlog,
339 bool v6_only) { 343 bool v6_only) {
340 intptr_t fd; 344 intptr_t fd;
341 345
342 fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0)); 346 fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
343 if (fd < 0) return -1; 347 if (fd < 0) {
348 return -1;
349 }
344 350
345 FDUtils::SetCloseOnExec(fd); 351 FDUtils::SetCloseOnExec(fd);
346 352
347 int optval = 1; 353 int optval = 1;
348 VOID_NO_RETRY_EXPECTED( 354 VOID_NO_RETRY_EXPECTED(
349 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))); 355 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
350 356
351 if (addr.ss.ss_family == AF_INET6) { 357 if (addr.ss.ss_family == AF_INET6) {
352 optval = v6_only ? 1 : 0; 358 optval = v6_only ? 1 : 0;
353 VOID_NO_RETRY_EXPECTED( 359 VOID_NO_RETRY_EXPECTED(
354 setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval))); 360 setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
355 } 361 }
356 362
357 if (NO_RETRY_EXPECTED( 363 if (NO_RETRY_EXPECTED(
358 bind(fd, 364 bind(fd,
359 &addr.addr, 365 &addr.addr,
360 SocketAddress::GetAddrLength(addr))) < 0) { 366 SocketAddress::GetAddrLength(addr))) < 0) {
361 VOID_TEMP_FAILURE_RETRY(close(fd)); 367 VOID_TEMP_FAILURE_RETRY(close(fd));
362 return -1; 368 return -1;
363 } 369 }
364 370
365 // Test for invalid socket port 65535 (some browsers disallow it). 371 // Test for invalid socket port 65535 (some browsers disallow it).
366 if (SocketAddress::GetAddrPort(addr) == 0 && Socket::GetPort(fd) == 65535) { 372 if ((SocketAddress::GetAddrPort(addr)) == 0 &&
373 (Socket::GetPort(fd) == 65535)) {
367 // Don't close the socket until we have created a new socket, ensuring 374 // Don't close the socket until we have created a new socket, ensuring
368 // that we do not get the bad port number again. 375 // that we do not get the bad port number again.
369 intptr_t new_fd = CreateBindListen(addr, backlog, v6_only); 376 intptr_t new_fd = CreateBindListen(addr, backlog, v6_only);
370 int err = errno; 377 int err = errno;
371 VOID_TEMP_FAILURE_RETRY(close(fd)); 378 VOID_TEMP_FAILURE_RETRY(close(fd));
372 errno = err; 379 errno = err;
373 return new_fd; 380 return new_fd;
374 } 381 }
375 382
376 if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) { 383 if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 435
429 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) { 436 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
430 int on; 437 int on;
431 socklen_t len = sizeof(on); 438 socklen_t len = sizeof(on);
432 int err = NO_RETRY_EXPECTED(getsockopt(fd, 439 int err = NO_RETRY_EXPECTED(getsockopt(fd,
433 IPPROTO_TCP, 440 IPPROTO_TCP,
434 TCP_NODELAY, 441 TCP_NODELAY,
435 reinterpret_cast<void *>(&on), 442 reinterpret_cast<void *>(&on),
436 &len)); 443 &len));
437 if (err == 0) { 444 if (err == 0) {
438 *enabled = on == 1; 445 *enabled = (on == 1);
439 } 446 }
440 return err == 0; 447 return (err == 0);
441 } 448 }
442 449
443 450
444 bool Socket::SetNoDelay(intptr_t fd, bool enabled) { 451 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
445 int on = enabled ? 1 : 0; 452 int on = enabled ? 1 : 0;
446 return NO_RETRY_EXPECTED(setsockopt(fd, 453 return NO_RETRY_EXPECTED(setsockopt(fd,
447 IPPROTO_TCP, 454 IPPROTO_TCP,
448 TCP_NODELAY, 455 TCP_NODELAY,
449 reinterpret_cast<char *>(&on), 456 reinterpret_cast<char *>(&on),
450 sizeof(on))) == 0; 457 sizeof(on))) == 0;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 521
515 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) { 522 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
516 int on; 523 int on;
517 socklen_t len = sizeof(on); 524 socklen_t len = sizeof(on);
518 int err = NO_RETRY_EXPECTED(getsockopt(fd, 525 int err = NO_RETRY_EXPECTED(getsockopt(fd,
519 SOL_SOCKET, 526 SOL_SOCKET,
520 SO_BROADCAST, 527 SO_BROADCAST,
521 reinterpret_cast<char *>(&on), 528 reinterpret_cast<char *>(&on),
522 &len)); 529 &len));
523 if (err == 0) { 530 if (err == 0) {
524 *enabled = on == 1; 531 *enabled = (on == 1);
525 } 532 }
526 return err == 0; 533 return (err == 0);
527 } 534 }
528 535
529 536
530 bool Socket::SetBroadcast(intptr_t fd, bool enabled) { 537 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
531 int on = enabled ? 1 : 0; 538 int on = enabled ? 1 : 0;
532 return NO_RETRY_EXPECTED(setsockopt(fd, 539 return NO_RETRY_EXPECTED(setsockopt(fd,
533 SOL_SOCKET, 540 SOL_SOCKET,
534 SO_BROADCAST, 541 SO_BROADCAST,
535 reinterpret_cast<char *>(&on), 542 reinterpret_cast<char *>(&on),
536 sizeof(on))) == 0; 543 sizeof(on))) == 0;
537 } 544 }
538 545
539 546
540 bool Socket::JoinMulticast( 547 bool Socket::JoinMulticast(
541 intptr_t fd, const RawAddr& addr, const RawAddr&, int interfaceIndex) { 548 intptr_t fd, const RawAddr& addr, const RawAddr&, int interfaceIndex) {
542 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 549 int proto = (addr.addr.sa_family == AF_INET) ? IPPROTO_IP : IPPROTO_IPV6;
543 struct group_req mreq; 550 struct group_req mreq;
544 mreq.gr_interface = interfaceIndex; 551 mreq.gr_interface = interfaceIndex;
545 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 552 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
546 return NO_RETRY_EXPECTED(setsockopt( 553 return NO_RETRY_EXPECTED(setsockopt(
547 fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0; 554 fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
548 } 555 }
549 556
550 557
551 bool Socket::LeaveMulticast( 558 bool Socket::LeaveMulticast(
552 intptr_t fd, const RawAddr& addr, const RawAddr&, int interfaceIndex) { 559 intptr_t fd, const RawAddr& addr, const RawAddr&, int interfaceIndex) {
553 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 560 int proto = (addr.addr.sa_family == AF_INET) ? IPPROTO_IP : IPPROTO_IPV6;
554 struct group_req mreq; 561 struct group_req mreq;
555 mreq.gr_interface = interfaceIndex; 562 mreq.gr_interface = interfaceIndex;
556 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 563 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
557 return NO_RETRY_EXPECTED(setsockopt( 564 return NO_RETRY_EXPECTED(setsockopt(
558 fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0; 565 fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
559 } 566 }
560 567
561 } // namespace bin 568 } // namespace bin
562 } // namespace dart 569 } // namespace dart
563 570
564 #endif // defined(TARGET_OS_ANDROID) 571 #endif // defined(TARGET_OS_ANDROID)
OLDNEW
« no previous file with comments | « runtime/bin/socket.cc ('k') | runtime/bin/socket_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698