Chromium Code Reviews| Index: runtime/bin/socket_win.cc |
| diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc |
| index 3a3fd9da622cb1eff8f09165ceb9a1a8381b3a56..fd54cc5a19a61eae0f8373e78cf57e6cd37a80db 100644 |
| --- a/runtime/bin/socket_win.cc |
| +++ b/runtime/bin/socket_win.cc |
| @@ -16,9 +16,9 @@ |
| namespace dart { |
| namespace bin { |
| -SocketAddress::SocketAddress(struct addrinfo* addrinfo) { |
| +SocketAddress::SocketAddress(struct sockaddr* sockaddr) { |
| ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); |
| - RawAddr* raw = reinterpret_cast<RawAddr*>(addrinfo->ai_addr); |
| + RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr); |
| // Clear the port before calling WSAAddressToString as WSAAddressToString |
| // includes the port in the formatted string. |
| @@ -33,8 +33,8 @@ SocketAddress::SocketAddress(struct addrinfo* addrinfo) { |
| as_string_[0] = 0; |
| } |
| memmove(reinterpret_cast<void *>(&addr_), |
| - addrinfo->ai_addr, |
| - addrinfo->ai_addrlen); |
| + sockaddr, |
| + SocketAddress::GetAddrLength(raw)); |
| } |
| bool Socket::Initialize() { |
| @@ -142,7 +142,7 @@ intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) { |
| SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); |
| SOCKET s = handle->socket(); |
| SocketAddress::SetAddrPort(&addr, port); |
| - int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(addr)); |
| + int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(&addr)); |
| if (status == SOCKET_ERROR) { |
| DWORD rc = WSAGetLastError(); |
| ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); |
| @@ -216,9 +216,9 @@ intptr_t ServerSocket::Accept(intptr_t fd) { |
| } |
| -SocketAddresses* Socket::LookupAddress(const char* host, |
| - int type, |
| - OSError** os_error) { |
| +AddressList<SocketAddress>* Socket::LookupAddress(const char* host, |
| + int type, |
| + OSError** os_error) { |
| Initialize(); |
| // Perform a name lookup for a host name. |
| @@ -241,11 +241,11 @@ SocketAddresses* Socket::LookupAddress(const char* host, |
| for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { |
| if (c->ai_family == AF_INET || c->ai_family == AF_INET6) count++; |
| } |
| - SocketAddresses* addresses = new SocketAddresses(count); |
| + AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count); |
| intptr_t i = 0; |
| for (struct addrinfo* c = info; c != NULL; c = c->ai_next) { |
| if (c->ai_family == AF_INET || c->ai_family == AF_INET6) { |
| - addresses->SetAt(i, new SocketAddress(c)); |
| + addresses->SetAt(i, new SocketAddress(c->ai_addr)); |
| i++; |
| } |
| } |
| @@ -254,6 +254,57 @@ SocketAddresses* Socket::LookupAddress(const char* host, |
| } |
| +AddressList<InterfaceSocketAddress>* Socket::ListInterfaces( |
| + int type, |
| + OSError** os_error) { |
| + Initialize(); |
| + |
| + ULONG size = 0; |
| + // Query the size needed. |
| + GetAdaptersAddresses(SocketAddress::FromType(type), |
|
Søren Gjesse
2013/06/20 18:22:05
You could consider adding the flags:
GAA_FLAG_SKI
Anders Johnsen
2013/06/21 07:58:35
Done.
|
| + 0, |
| + NULL, |
| + NULL, |
| + &size); |
| + PIP_ADAPTER_ADDRESSES addrs = |
|
Søren Gjesse
2013/06/20 18:22:05
We normally use the *. That is IP_ADAPTER_ADDRESSE
Anders Johnsen
2013/06/21 07:58:35
Done.
|
| + reinterpret_cast<PIP_ADAPTER_ADDRESSES>(malloc(size)); |
|
Søren Gjesse
2013/06/20 18:22:05
Ditto and more below.
Anders Johnsen
2013/06/21 07:58:35
Done.
|
| + // Get the addresses now we have the right buffer. |
|
Søren Gjesse
2013/06/20 18:22:05
Add an if (status == ERROR_BUFFER_OVERFLOW) around
Anders Johnsen
2013/06/21 07:58:35
Done.
|
| + int status = GetAdaptersAddresses(SocketAddress::FromType(type), |
| + 0, |
| + NULL, |
| + addrs, |
| + &size); |
| + if (status != NO_ERROR) { |
| + ASSERT(*os_error == NULL); |
| + DWORD error_code = WSAGetLastError(); |
| + SetLastError(error_code); |
| + *os_error = new OSError(); |
| + return NULL; |
| + } |
| + intptr_t count = 0; |
| + for (PIP_ADAPTER_ADDRESSES a = addrs; a != NULL; a = a->Next) { |
| + for (PIP_ADAPTER_UNICAST_ADDRESS u = a->FirstUnicastAddress; |
| + u != NULL; u = u->Next) { |
| + count++; |
| + } |
| + } |
| + AddressList<InterfaceSocketAddress>* addresses = |
| + new AddressList<InterfaceSocketAddress>(count); |
| + intptr_t i = 0; |
| + for (PIP_ADAPTER_ADDRESSES a = addrs; a != NULL; a = a->Next) { |
| + for (PIP_ADAPTER_UNICAST_ADDRESS u = a->FirstUnicastAddress; |
| + u != NULL; u = u->Next) { |
| + addresses->SetAt(i, new InterfaceSocketAddress( |
| + u->Address.lpSockaddr, |
| + StringUtils::WideToUtf8(a->FriendlyName))); |
| + i++; |
| + } |
| + } |
| + free(addrs); |
| + return addresses; |
| +} |
| + |
| + |
| intptr_t ServerSocket::CreateBindListen(RawAddr addr, |
| intptr_t port, |
| intptr_t backlog, |
| @@ -288,7 +339,7 @@ intptr_t ServerSocket::CreateBindListen(RawAddr addr, |
| SocketAddress::SetAddrPort(&addr, port); |
| status = bind(s, |
| &addr.addr, |
| - SocketAddress::GetAddrLength(addr)); |
| + SocketAddress::GetAddrLength(&addr)); |
| if (status == SOCKET_ERROR) { |
| DWORD rc = WSAGetLastError(); |
| closesocket(s); |