OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/address_list.h" | 5 #include "net/base/address_list.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "net/base/net_util.h" | 10 #include "net/base/net_util.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 if (port_field) | 78 if (port_field) |
79 *port_field = htons(port); | 79 *port_field = htons(port); |
80 | 80 |
81 // Assign recursively. | 81 // Assign recursively. |
82 if (info->ai_next) | 82 if (info->ai_next) |
83 SetPortRecursive(info->ai_next, port); | 83 SetPortRecursive(info->ai_next, port); |
84 } | 84 } |
85 | 85 |
86 } // namespace | 86 } // namespace |
87 | 87 |
| 88 AddressList::AddressList(const IPAddressNumber& address, int port, |
| 89 bool canonicalize_name) { |
| 90 struct addrinfo* ai = new addrinfo; |
| 91 memset(ai, 0, sizeof(addrinfo)); |
| 92 ai->ai_socktype = SOCK_STREAM; |
| 93 |
| 94 switch (address.size()) { |
| 95 case 4: { |
| 96 ai->ai_family = AF_INET; |
| 97 const size_t sockaddr_in_size = sizeof(struct sockaddr_in); |
| 98 ai->ai_addrlen = sockaddr_in_size; |
| 99 |
| 100 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>( |
| 101 new char[sockaddr_in_size]); |
| 102 memset(addr, 0, sockaddr_in_size); |
| 103 addr->sin_family = AF_INET; |
| 104 memcpy(&addr->sin_addr, &address[0], 4); |
| 105 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr); |
| 106 break; |
| 107 } |
| 108 case 16: { |
| 109 ai->ai_family = AF_INET6; |
| 110 const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6); |
| 111 ai->ai_addrlen = sockaddr_in6_size; |
| 112 |
| 113 struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>( |
| 114 new char[sockaddr_in6_size]); |
| 115 memset(addr6, 0, sockaddr_in6_size); |
| 116 addr6->sin6_family = AF_INET6; |
| 117 memcpy(&addr6->sin6_addr, &address[0], 16); |
| 118 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); |
| 119 break; |
| 120 } |
| 121 default: { |
| 122 NOTREACHED() << "Bad IP address"; |
| 123 break; |
| 124 } |
| 125 } |
| 126 |
| 127 if (canonicalize_name) { |
| 128 std::string name = NetAddressToString(ai); |
| 129 ai->ai_canonname = do_strdup(name.c_str()); |
| 130 } |
| 131 data_ = new Data(ai, false /*is_system_created*/); |
| 132 SetPort(port); |
| 133 } |
| 134 |
88 void AddressList::Adopt(struct addrinfo* head) { | 135 void AddressList::Adopt(struct addrinfo* head) { |
89 data_ = new Data(head, true /*is_system_created*/); | 136 data_ = new Data(head, true /*is_system_created*/); |
90 } | 137 } |
91 | 138 |
92 void AddressList::Copy(const struct addrinfo* head, bool recursive) { | 139 void AddressList::Copy(const struct addrinfo* head, bool recursive) { |
93 data_ = new Data(CreateCopyOfAddrinfo(head, recursive), | 140 data_ = new Data(CreateCopyOfAddrinfo(head, recursive), |
94 false /*is_system_created*/); | 141 false /*is_system_created*/); |
95 } | 142 } |
96 | 143 |
97 void AddressList::Append(const struct addrinfo* head) { | 144 void AddressList::Append(const struct addrinfo* head) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 // Otherwise we need to make a copy in order to change the port number. | 183 // Otherwise we need to make a copy in order to change the port number. |
137 Copy(src.head(), true); | 184 Copy(src.head(), true); |
138 SetPort(port); | 185 SetPort(port); |
139 } | 186 } |
140 } | 187 } |
141 | 188 |
142 void AddressList::Reset() { | 189 void AddressList::Reset() { |
143 data_ = NULL; | 190 data_ = NULL; |
144 } | 191 } |
145 | 192 |
146 // static | |
147 AddressList AddressList::CreateIPv4Address(unsigned char data[4], | |
148 const std::string& canonical_name) { | |
149 struct addrinfo* ai = new addrinfo; | |
150 memset(ai, 0, sizeof(addrinfo)); | |
151 ai->ai_family = AF_INET; | |
152 ai->ai_socktype = SOCK_STREAM; | |
153 const size_t sockaddr_in_size = sizeof(struct sockaddr_in); | |
154 ai->ai_addrlen = sockaddr_in_size; | |
155 if (!canonical_name.empty()) | |
156 ai->ai_canonname = do_strdup(canonical_name.c_str()); | |
157 | |
158 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>( | |
159 new char[sockaddr_in_size]); | |
160 memset(addr, 0, sockaddr_in_size); | |
161 addr->sin_family = AF_INET; | |
162 memcpy(&addr->sin_addr, data, 4); | |
163 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr); | |
164 | |
165 return AddressList(new Data(ai, false /*is_system_created*/)); | |
166 } | |
167 | |
168 // static | |
169 AddressList AddressList::CreateIPv6Address(unsigned char data[16], | |
170 const std::string& canonical_name) { | |
171 struct addrinfo* ai = new addrinfo; | |
172 memset(ai, 0, sizeof(addrinfo)); | |
173 ai->ai_family = AF_INET6; | |
174 ai->ai_socktype = SOCK_STREAM; | |
175 const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6); | |
176 ai->ai_addrlen = sockaddr_in6_size; | |
177 if (!canonical_name.empty()) | |
178 ai->ai_canonname = do_strdup(canonical_name.c_str()); | |
179 | |
180 struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>( | |
181 new char[sockaddr_in6_size]); | |
182 memset(addr6, 0, sockaddr_in6_size); | |
183 addr6->sin6_family = AF_INET6; | |
184 memcpy(&addr6->sin6_addr, data, 16); | |
185 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6); | |
186 | |
187 return AddressList(new Data(ai, false /*is_system_created*/)); | |
188 } | |
189 | |
190 AddressList::Data::Data(struct addrinfo* ai, bool is_system_created) | 193 AddressList::Data::Data(struct addrinfo* ai, bool is_system_created) |
191 : head(ai), is_system_created(is_system_created) { | 194 : head(ai), is_system_created(is_system_created) { |
192 DCHECK(head); | 195 DCHECK(head); |
193 } | 196 } |
194 | 197 |
195 AddressList::Data::~Data() { | 198 AddressList::Data::~Data() { |
196 // Call either freeaddrinfo(head), or FreeMyAddrinfo(head), depending who | 199 // Call either freeaddrinfo(head), or FreeMyAddrinfo(head), depending who |
197 // created the data. | 200 // created the data. |
198 if (is_system_created) | 201 if (is_system_created) |
199 freeaddrinfo(head); | 202 freeaddrinfo(head); |
200 else | 203 else |
201 FreeMyAddrinfo(head); | 204 FreeMyAddrinfo(head); |
202 } | 205 } |
203 | 206 |
204 } // namespace net | 207 } // namespace net |
OLD | NEW |