| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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" |
| 11 #include "bin/sync_socket.h" | 11 #include "bin/sync_socket.h" |
| 12 | 12 |
| 13 namespace dart { | 13 namespace dart { |
| 14 namespace bin { | 14 namespace bin { |
| 15 | 15 |
| 16 bool SynchronousSocket::Initialize() { | 16 bool SynchronousSocket::Initialize() { |
| 17 return SocketBase::Initialize(); | 17 return SocketBase::Initialize(); |
| 18 } | 18 } |
| 19 | 19 |
| 20 | |
| 21 static intptr_t Create(const RawAddr& addr) { | 20 static intptr_t Create(const RawAddr& addr) { |
| 22 const intptr_t type = SOCK_STREAM; | 21 const intptr_t type = SOCK_STREAM; |
| 23 SOCKET s = WSASocket(addr.ss.ss_family, type, 0, NULL, 0, 0); | 22 SOCKET s = WSASocket(addr.ss.ss_family, type, 0, NULL, 0, 0); |
| 24 return (s == INVALID_SOCKET) ? -1 : s; | 23 return (s == INVALID_SOCKET) ? -1 : s; |
| 25 } | 24 } |
| 26 | 25 |
| 27 | |
| 28 static intptr_t Connect(intptr_t fd, const RawAddr& addr) { | 26 static intptr_t Connect(intptr_t fd, const RawAddr& addr) { |
| 29 SOCKET socket = static_cast<SOCKET>(fd); | 27 SOCKET socket = static_cast<SOCKET>(fd); |
| 30 intptr_t result = | 28 intptr_t result = |
| 31 connect(socket, &addr.addr, SocketAddress::GetAddrLength(addr)); | 29 connect(socket, &addr.addr, SocketAddress::GetAddrLength(addr)); |
| 32 return (result == SOCKET_ERROR) ? -1 : socket; | 30 return (result == SOCKET_ERROR) ? -1 : socket; |
| 33 } | 31 } |
| 34 | 32 |
| 35 | |
| 36 intptr_t SynchronousSocket::CreateConnect(const RawAddr& addr) { | 33 intptr_t SynchronousSocket::CreateConnect(const RawAddr& addr) { |
| 37 intptr_t fd = Create(addr); | 34 intptr_t fd = Create(addr); |
| 38 return (fd < 0) ? fd : Connect(fd, addr); | 35 return (fd < 0) ? fd : Connect(fd, addr); |
| 39 } | 36 } |
| 40 | 37 |
| 41 | |
| 42 intptr_t SynchronousSocket::Available(intptr_t fd) { | 38 intptr_t SynchronousSocket::Available(intptr_t fd) { |
| 43 SOCKET socket = static_cast<SOCKET>(fd); | 39 SOCKET socket = static_cast<SOCKET>(fd); |
| 44 DWORD available; | 40 DWORD available; |
| 45 intptr_t result = ioctlsocket(socket, FIONREAD, &available); | 41 intptr_t result = ioctlsocket(socket, FIONREAD, &available); |
| 46 return (result == SOCKET_ERROR) ? -1 : static_cast<intptr_t>(available); | 42 return (result == SOCKET_ERROR) ? -1 : static_cast<intptr_t>(available); |
| 47 } | 43 } |
| 48 | 44 |
| 49 | |
| 50 intptr_t SynchronousSocket::GetPort(intptr_t fd) { | 45 intptr_t SynchronousSocket::GetPort(intptr_t fd) { |
| 51 SOCKET socket = static_cast<SOCKET>(fd); | 46 SOCKET socket = static_cast<SOCKET>(fd); |
| 52 RawAddr raw; | 47 RawAddr raw; |
| 53 socklen_t size = sizeof(raw); | 48 socklen_t size = sizeof(raw); |
| 54 if (getsockname(socket, &raw.addr, &size) == SOCKET_ERROR) { | 49 if (getsockname(socket, &raw.addr, &size) == SOCKET_ERROR) { |
| 55 return 0; | 50 return 0; |
| 56 } | 51 } |
| 57 return SocketAddress::GetAddrPort(raw); | 52 return SocketAddress::GetAddrPort(raw); |
| 58 } | 53 } |
| 59 | 54 |
| 60 | |
| 61 SocketAddress* SynchronousSocket::GetRemotePeer(intptr_t fd, intptr_t* port) { | 55 SocketAddress* SynchronousSocket::GetRemotePeer(intptr_t fd, intptr_t* port) { |
| 62 SOCKET socket = static_cast<SOCKET>(fd); | 56 SOCKET socket = static_cast<SOCKET>(fd); |
| 63 RawAddr raw; | 57 RawAddr raw; |
| 64 socklen_t size = sizeof(raw); | 58 socklen_t size = sizeof(raw); |
| 65 if (getpeername(socket, &raw.addr, &size)) { | 59 if (getpeername(socket, &raw.addr, &size)) { |
| 66 return NULL; | 60 return NULL; |
| 67 } | 61 } |
| 68 *port = SocketAddress::GetAddrPort(raw); | 62 *port = SocketAddress::GetAddrPort(raw); |
| 69 // Clear the port before calling WSAAddressToString as WSAAddressToString | 63 // Clear the port before calling WSAAddressToString as WSAAddressToString |
| 70 // includes the port in the formatted string. | 64 // includes the port in the formatted string. |
| 71 SocketAddress::SetAddrPort(&raw, 0); | 65 SocketAddress::SetAddrPort(&raw, 0); |
| 72 return new SocketAddress(&raw.addr); | 66 return new SocketAddress(&raw.addr); |
| 73 } | 67 } |
| 74 | 68 |
| 75 | |
| 76 intptr_t SynchronousSocket::Read(intptr_t fd, | 69 intptr_t SynchronousSocket::Read(intptr_t fd, |
| 77 void* buffer, | 70 void* buffer, |
| 78 intptr_t num_bytes) { | 71 intptr_t num_bytes) { |
| 79 SOCKET socket = static_cast<SOCKET>(fd); | 72 SOCKET socket = static_cast<SOCKET>(fd); |
| 80 return recv(socket, reinterpret_cast<char*>(buffer), num_bytes, 0); | 73 return recv(socket, reinterpret_cast<char*>(buffer), num_bytes, 0); |
| 81 } | 74 } |
| 82 | 75 |
| 83 | |
| 84 intptr_t SynchronousSocket::Write(intptr_t fd, | 76 intptr_t SynchronousSocket::Write(intptr_t fd, |
| 85 const void* buffer, | 77 const void* buffer, |
| 86 intptr_t num_bytes) { | 78 intptr_t num_bytes) { |
| 87 SOCKET socket = static_cast<SOCKET>(fd); | 79 SOCKET socket = static_cast<SOCKET>(fd); |
| 88 return send(socket, reinterpret_cast<const char*>(buffer), num_bytes, 0); | 80 return send(socket, reinterpret_cast<const char*>(buffer), num_bytes, 0); |
| 89 } | 81 } |
| 90 | 82 |
| 91 | |
| 92 void SynchronousSocket::ShutdownRead(intptr_t fd) { | 83 void SynchronousSocket::ShutdownRead(intptr_t fd) { |
| 93 SOCKET socket = static_cast<SOCKET>(fd); | 84 SOCKET socket = static_cast<SOCKET>(fd); |
| 94 shutdown(socket, SD_RECEIVE); | 85 shutdown(socket, SD_RECEIVE); |
| 95 } | 86 } |
| 96 | 87 |
| 97 | |
| 98 void SynchronousSocket::ShutdownWrite(intptr_t fd) { | 88 void SynchronousSocket::ShutdownWrite(intptr_t fd) { |
| 99 SOCKET socket = static_cast<SOCKET>(fd); | 89 SOCKET socket = static_cast<SOCKET>(fd); |
| 100 shutdown(socket, SD_SEND); | 90 shutdown(socket, SD_SEND); |
| 101 } | 91 } |
| 102 | 92 |
| 103 | |
| 104 void SynchronousSocket::Close(intptr_t fd) { | 93 void SynchronousSocket::Close(intptr_t fd) { |
| 105 SOCKET socket = static_cast<SOCKET>(fd); | 94 SOCKET socket = static_cast<SOCKET>(fd); |
| 106 closesocket(socket); | 95 closesocket(socket); |
| 107 } | 96 } |
| 108 | 97 |
| 109 } // namespace bin | 98 } // namespace bin |
| 110 } // namespace dart | 99 } // namespace dart |
| 111 | 100 |
| 112 #endif // defined(HOST_OS_WINDOWS) | 101 #endif // defined(HOST_OS_WINDOWS) |
| 113 | 102 |
| 114 #endif // !defined(DART_IO_DISABLED) | 103 #endif // !defined(DART_IO_DISABLED) |
| OLD | NEW |