| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <arpa/inet.h> | |
| 6 #include <netdb.h> | |
| 7 #include <sys/socket.h> | |
| 8 | |
| 9 #include "mojo/dart/embedder/io/internet_address.h" | |
| 10 | |
| 11 namespace mojo { | |
| 12 namespace dart { | |
| 13 | |
| 14 static void SetupSockAddr(sockaddr_storage* dest, | |
| 15 socklen_t* salen, | |
| 16 const RawAddr& addr, intptr_t addr_length) { | |
| 17 CHECK((addr_length == 4) || (addr_length == 16)); | |
| 18 if (addr_length == 4) { | |
| 19 dest->ss_family = AF_INET; | |
| 20 sockaddr_in* dest4 = reinterpret_cast<sockaddr_in*>(dest); | |
| 21 *salen = sizeof(*dest4); | |
| 22 memmove(&(dest4->sin_addr), &addr.bytes[0], addr_length); | |
| 23 } else { | |
| 24 dest->ss_family = AF_INET6; | |
| 25 sockaddr_in6* dest6 = reinterpret_cast<sockaddr_in6*>(dest); | |
| 26 *salen = sizeof(*dest6); | |
| 27 memmove(&(dest6->sin6_addr), &addr.bytes[0], addr_length); | |
| 28 } | |
| 29 } | |
| 30 | |
| 31 bool InternetAddress::Parse(int type, const char* address, RawAddr* addr) { | |
| 32 memset(addr, 0, IPV6_RAW_ADDR_LENGTH); | |
| 33 int result; | |
| 34 if (type == InternetAddress::TYPE_IPV4) { | |
| 35 struct sockaddr_in in; | |
| 36 result = inet_pton(AF_INET, address, &in.sin_addr); | |
| 37 memmove(addr, &in.sin_addr, IPV4_RAW_ADDR_LENGTH); | |
| 38 } else { | |
| 39 CHECK(type == InternetAddress::TYPE_IPV6); | |
| 40 sockaddr_in6 in6; | |
| 41 result = inet_pton(AF_INET6, address, &in6.sin6_addr); | |
| 42 memmove(addr, &in6.sin6_addr, IPV6_RAW_ADDR_LENGTH); | |
| 43 } | |
| 44 return result == 1; | |
| 45 } | |
| 46 | |
| 47 bool InternetAddress::Reverse(const RawAddr& addr, intptr_t addr_length, | |
| 48 char* host, intptr_t host_len, | |
| 49 intptr_t* error_code, | |
| 50 const char** error_description) { | |
| 51 CHECK(host_len >= NI_MAXHOST); | |
| 52 sockaddr_storage sock_addr; | |
| 53 socklen_t salen; | |
| 54 SetupSockAddr(&sock_addr, &salen, addr, addr_length); | |
| 55 int status = getnameinfo(reinterpret_cast<sockaddr*>(&sock_addr), | |
| 56 salen, | |
| 57 host, | |
| 58 host_len, | |
| 59 NULL, | |
| 60 0, | |
| 61 NI_NAMEREQD); | |
| 62 *error_code = status; | |
| 63 if (status != 0) { | |
| 64 CHECK(*error_description == NULL); | |
| 65 *error_description = gai_strerror(status); | |
| 66 return false; | |
| 67 } | |
| 68 return true; | |
| 69 } | |
| 70 | |
| 71 } // namespace dart | |
| 72 } // namespace mojo | |
| OLD | NEW |