OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |