Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: net/base/address_list.cc

Issue 7008021: Added DnsQuery class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/base/address_list.cc
diff --git a/net/base/address_list.cc b/net/base/address_list.cc
index 8cda64f5ac4cf8b4a9adb9ca25496c2eeb0b5dce..5763a9a8813a4660bb1250321a3aebf5b6bdc148 100644
--- a/net/base/address_list.cc
+++ b/net/base/address_list.cc
@@ -22,6 +22,52 @@ char* do_strdup(const char* src) {
#endif
}
+struct addrinfo* CreateAddrInfo(const IPAddressNumber& address,
+ bool canonicalize_name) {
+ struct addrinfo* ai = new addrinfo;
+ memset(ai, 0, sizeof(addrinfo));
+ ai->ai_socktype = SOCK_STREAM;
+
+ switch (address.size()) {
+ case kIPv4AddressSize: {
+ 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], kIPv4AddressSize);
+ ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr);
+ break;
+ }
+ case kIPv6AddressSize: {
+ 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], kIPv6AddressSize);
+ 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());
+ }
+ return ai;
+}
+
} // namespace
struct AddressList::Data : public base::RefCountedThreadSafe<Data> {
@@ -58,6 +104,28 @@ AddressList& AddressList::operator=(const AddressList& addresslist) {
}
// static
+AddressList AddressList::CreateFromIPAddressList(
+ const std::vector<IPAddressNumber>& addresses,
+ uint16 port) {
+ DCHECK(!addresses.empty());
+ struct addrinfo* head = NULL;
+ struct addrinfo* next = NULL;
+
+ for (std::vector<IPAddressNumber>::const_iterator it = addresses.begin();
+ it != addresses.end(); ++it) {
+ if (head == NULL) {
+ head = next = CreateAddrInfo(*it, false);
+ } else {
+ next->ai_next = CreateAddrInfo(*it, false);
+ next = next->ai_next;
+ }
+ }
+
+ SetPortForAllAddrinfos(head, port);
+ return AddressList(new Data(head, false));
+}
+
+// static
AddressList AddressList::CreateFromIPAddress(
const IPAddressNumber& address,
uint16 port) {
@@ -69,47 +137,8 @@ AddressList AddressList::CreateFromIPAddressWithCname(
const IPAddressNumber& address,
uint16 port,
bool canonicalize_name) {
- struct addrinfo* ai = new addrinfo;
- memset(ai, 0, sizeof(addrinfo));
- ai->ai_socktype = SOCK_STREAM;
+ struct addrinfo* ai = CreateAddrInfo(address, canonicalize_name);
- 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());
- }
SetPortForAllAddrinfos(ai, port);
return AddressList(new Data(ai, false /*is_system_created*/));
}
« no previous file with comments | « net/base/address_list.h ('k') | net/base/address_list_unittest.cc » ('j') | net/base/dns_query.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698