| Index: net/base/address_list.cc
|
| ===================================================================
|
| --- net/base/address_list.cc (revision 76440)
|
| +++ net/base/address_list.cc (working copy)
|
| @@ -219,11 +219,55 @@
|
| }
|
|
|
| const struct addrinfo* AddressList::head() const {
|
| + if (!data_)
|
| + return NULL;
|
| return data_->head;
|
| }
|
|
|
| AddressList::AddressList(Data* data) : data_(data) {}
|
|
|
| +// static
|
| +AddressList* AddressList::CreateAddressListFromSockaddr(
|
| + const struct sockaddr* address,
|
| + socklen_t address_length,
|
| + int socket_type,
|
| + int protocol) {
|
| + // Do sanity checking on socket_type and protocol.
|
| + DCHECK(socket_type == SOCK_DGRAM || socket_type == SOCK_STREAM);
|
| + DCHECK(protocol == IPPROTO_TCP || protocol == IPPROTO_UDP);
|
| +
|
| + struct addrinfo* ai = new addrinfo;
|
| + memset(ai, 0, sizeof(addrinfo));
|
| + switch (address_length) {
|
| + case sizeof(struct sockaddr_in):
|
| + {
|
| + const struct sockaddr_in* sin =
|
| + reinterpret_cast<const struct sockaddr_in*>(address);
|
| + ai->ai_family = sin->sin_family;
|
| + DCHECK_EQ(AF_INET, ai->ai_family);
|
| + }
|
| + break;
|
| + case sizeof(struct sockaddr_in6):
|
| + {
|
| + const struct sockaddr_in6* sin6 =
|
| + reinterpret_cast<const struct sockaddr_in6*>(address);
|
| + ai->ai_family = sin6->sin6_family;
|
| + DCHECK_EQ(AF_INET6, ai->ai_family);
|
| + }
|
| + break;
|
| + default:
|
| + NOTREACHED() << "Bad IP address";
|
| + break;
|
| + }
|
| + ai->ai_socktype = socket_type;
|
| + ai->ai_protocol = protocol;
|
| + ai->ai_addrlen = address_length;
|
| + ai->ai_addr = reinterpret_cast<struct sockaddr*>(new char[address_length]);
|
| + memcpy(ai->ai_addr, address, address_length);
|
| + return new 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);
|
|
|