Index: net/base/address_list.cc |
diff --git a/net/base/address_list.cc b/net/base/address_list.cc |
index 1c9731126ea2041961ee92f4e6abf2d65629670d..75c30b85a851d30ab392fe4156b28ac54c8beeea 100644 |
--- a/net/base/address_list.cc |
+++ b/net/base/address_list.cc |
@@ -85,6 +85,53 @@ void SetPortRecursive(struct addrinfo* info, int port) { |
} // namespace |
+AddressList::AddressList(const IPAddressNumber& address, int port, |
+ bool canonicalize_name) { |
+ struct addrinfo* ai = new addrinfo; |
+ memset(ai, 0, sizeof(addrinfo)); |
+ ai->ai_socktype = SOCK_STREAM; |
+ |
+ switch (address.size()) { |
+ case 4: { |
+ ai->ai_family = AF_INET; |
+ const size_t sockaddr_in_size = sizeof(struct sockaddr_in); |
+ ai->ai_addrlen = sockaddr_in_size; |
+ |
+ struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>( |
+ new char[sockaddr_in_size]); |
+ memset(addr, 0, sockaddr_in_size); |
+ addr->sin_family = AF_INET; |
+ memcpy(&addr->sin_addr, &address[0], 4); |
+ ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr); |
+ break; |
+ } |
+ case 16: { |
+ ai->ai_family = AF_INET6; |
+ const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6); |
+ ai->ai_addrlen = sockaddr_in6_size; |
+ |
+ struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>( |
+ new char[sockaddr_in6_size]); |
+ memset(addr6, 0, sockaddr_in6_size); |
+ addr6->sin6_family = AF_INET6; |
+ memcpy(&addr6->sin6_addr, &address[0], 16); |
+ ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); |
+ break; |
+ } |
+ default: { |
+ NOTREACHED() << "Bad IP address"; |
+ break; |
+ } |
+ } |
+ |
+ if (canonicalize_name) { |
+ std::string name = NetAddressToString(ai); |
+ ai->ai_canonname = do_strdup(name.c_str()); |
+ } |
+ data_ = new Data(ai, false /*is_system_created*/); |
+ SetPort(port); |
+} |
+ |
void AddressList::Adopt(struct addrinfo* head) { |
data_ = new Data(head, true /*is_system_created*/); |
} |
@@ -143,50 +190,6 @@ void AddressList::Reset() { |
data_ = NULL; |
} |
-// static |
-AddressList AddressList::CreateIPv4Address(unsigned char data[4], |
- const std::string& canonical_name) { |
- struct addrinfo* ai = new addrinfo; |
- memset(ai, 0, sizeof(addrinfo)); |
- ai->ai_family = AF_INET; |
- ai->ai_socktype = SOCK_STREAM; |
- const size_t sockaddr_in_size = sizeof(struct sockaddr_in); |
- ai->ai_addrlen = sockaddr_in_size; |
- if (!canonical_name.empty()) |
- ai->ai_canonname = do_strdup(canonical_name.c_str()); |
- |
- struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>( |
- new char[sockaddr_in_size]); |
- memset(addr, 0, sockaddr_in_size); |
- addr->sin_family = AF_INET; |
- memcpy(&addr->sin_addr, data, 4); |
- ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr); |
- |
- return AddressList(new Data(ai, false /*is_system_created*/)); |
-} |
- |
-// static |
-AddressList AddressList::CreateIPv6Address(unsigned char data[16], |
- const std::string& canonical_name) { |
- struct addrinfo* ai = new addrinfo; |
- memset(ai, 0, sizeof(addrinfo)); |
- ai->ai_family = AF_INET6; |
- ai->ai_socktype = SOCK_STREAM; |
- const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6); |
- ai->ai_addrlen = sockaddr_in6_size; |
- if (!canonical_name.empty()) |
- ai->ai_canonname = do_strdup(canonical_name.c_str()); |
- |
- struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>( |
- new char[sockaddr_in6_size]); |
- memset(addr6, 0, sockaddr_in6_size); |
- addr6->sin6_family = AF_INET6; |
- memcpy(&addr6->sin6_addr, data, 16); |
- ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); |
- |
- return AddressList(new Data(ai, false /*is_system_created*/)); |
-} |
- |
AddressList::Data::Data(struct addrinfo* ai, bool is_system_created) |
: head(ai), is_system_created(is_system_created) { |
DCHECK(head); |