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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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"
11 #include "net/base/sys_addrinfo.h" 11 #include "net/base/sys_addrinfo.h"
12 12
13 namespace net { 13 namespace net {
14 14
15 namespace { 15 namespace {
16 16
17 char* do_strdup(const char* src) { 17 char* do_strdup(const char* src) {
18 #if defined(OS_WIN) 18 #if defined(OS_WIN)
19 return _strdup(src); 19 return _strdup(src);
20 #else 20 #else
21 return strdup(src); 21 return strdup(src);
22 #endif 22 #endif
23 } 23 }
24 24
25 struct addrinfo* CreateAddrInfo(const IPAddressNumber& address,
26 bool canonicalize_name) {
27 struct addrinfo* ai = new addrinfo;
28 memset(ai, 0, sizeof(addrinfo));
29 ai->ai_socktype = SOCK_STREAM;
30
31 switch (address.size()) {
32 case kIPv4AddressSize: {
33 ai->ai_family = AF_INET;
34 const size_t sockaddr_in_size = sizeof(struct sockaddr_in);
35 ai->ai_addrlen = sockaddr_in_size;
36
37 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(
38 new char[sockaddr_in_size]);
39 memset(addr, 0, sockaddr_in_size);
40 addr->sin_family = AF_INET;
41 memcpy(&addr->sin_addr, &address[0], kIPv4AddressSize);
42 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr);
43 break;
44 }
45 case kIPv6AddressSize: {
46 ai->ai_family = AF_INET6;
47 const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6);
48 ai->ai_addrlen = sockaddr_in6_size;
49
50 struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>(
51 new char[sockaddr_in6_size]);
52 memset(addr6, 0, sockaddr_in6_size);
53 addr6->sin6_family = AF_INET6;
54 memcpy(&addr6->sin6_addr, &address[0], kIPv6AddressSize);
55 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6);
56 break;
57 }
58 default: {
59 NOTREACHED() << "Bad IP address";
60 break;
61 }
62 }
63
64 if (canonicalize_name) {
65 std::string name = NetAddressToString(ai);
66 ai->ai_canonname = do_strdup(name.c_str());
67 }
68 return ai;
69 }
70
25 } // namespace 71 } // namespace
26 72
27 struct AddressList::Data : public base::RefCountedThreadSafe<Data> { 73 struct AddressList::Data : public base::RefCountedThreadSafe<Data> {
28 Data(struct addrinfo* ai, bool is_system_created); 74 Data(struct addrinfo* ai, bool is_system_created);
29 75
30 // This variable is const since it should NOT be mutated. Since 76 // This variable is const since it should NOT be mutated. Since
31 // Data is reference counted, this |head| could be shared by multiple 77 // Data is reference counted, this |head| could be shared by multiple
32 // instances of AddressList, hence we need to be careful not to mutate 78 // instances of AddressList, hence we need to be careful not to mutate
33 // it from any one instance. 79 // it from any one instance.
34 const struct addrinfo * const head; 80 const struct addrinfo * const head;
(...skipping 16 matching lines...) Expand all
51 97
52 AddressList::~AddressList() { 98 AddressList::~AddressList() {
53 } 99 }
54 100
55 AddressList& AddressList::operator=(const AddressList& addresslist) { 101 AddressList& AddressList::operator=(const AddressList& addresslist) {
56 data_ = addresslist.data_; 102 data_ = addresslist.data_;
57 return *this; 103 return *this;
58 } 104 }
59 105
60 // static 106 // static
107 AddressList AddressList::CreateFromIPAddressList(
108 const std::vector<IPAddressNumber>& addresses,
109 uint16 port) {
110 DCHECK(!addresses.empty());
111 struct addrinfo* head = NULL;
112 struct addrinfo* next = NULL;
113
114 for (std::vector<IPAddressNumber>::const_iterator it = addresses.begin();
115 it != addresses.end(); ++it) {
116 if (head == NULL) {
117 head = next = CreateAddrInfo(*it, false);
118 } else {
119 next->ai_next = CreateAddrInfo(*it, false);
120 next = next->ai_next;
121 }
122 }
123
124 SetPortForAllAddrinfos(head, port);
125 return AddressList(new Data(head, false));
126 }
127
128 // static
61 AddressList AddressList::CreateFromIPAddress( 129 AddressList AddressList::CreateFromIPAddress(
62 const IPAddressNumber& address, 130 const IPAddressNumber& address,
63 uint16 port) { 131 uint16 port) {
64 return CreateFromIPAddressWithCname(address, port, false); 132 return CreateFromIPAddressWithCname(address, port, false);
65 } 133 }
66 134
67 // static 135 // static
68 AddressList AddressList::CreateFromIPAddressWithCname( 136 AddressList AddressList::CreateFromIPAddressWithCname(
69 const IPAddressNumber& address, 137 const IPAddressNumber& address,
70 uint16 port, 138 uint16 port,
71 bool canonicalize_name) { 139 bool canonicalize_name) {
72 struct addrinfo* ai = new addrinfo; 140 struct addrinfo* ai = CreateAddrInfo(address, canonicalize_name);
73 memset(ai, 0, sizeof(addrinfo));
74 ai->ai_socktype = SOCK_STREAM;
75 141
76 switch (address.size()) {
77 case 4: {
78 ai->ai_family = AF_INET;
79 const size_t sockaddr_in_size = sizeof(struct sockaddr_in);
80 ai->ai_addrlen = sockaddr_in_size;
81
82 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(
83 new char[sockaddr_in_size]);
84 memset(addr, 0, sockaddr_in_size);
85 addr->sin_family = AF_INET;
86 memcpy(&addr->sin_addr, &address[0], 4);
87 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr);
88 break;
89 }
90 case 16: {
91 ai->ai_family = AF_INET6;
92 const size_t sockaddr_in6_size = sizeof(struct sockaddr_in6);
93 ai->ai_addrlen = sockaddr_in6_size;
94
95 struct sockaddr_in6* addr6 = reinterpret_cast<struct sockaddr_in6*>(
96 new char[sockaddr_in6_size]);
97 memset(addr6, 0, sockaddr_in6_size);
98 addr6->sin6_family = AF_INET6;
99 memcpy(&addr6->sin6_addr, &address[0], 16);
100 ai->ai_addr = reinterpret_cast<struct sockaddr*>(addr6);
101 break;
102 }
103 default: {
104 NOTREACHED() << "Bad IP address";
105 break;
106 }
107 }
108
109 if (canonicalize_name) {
110 std::string name = NetAddressToString(ai);
111 ai->ai_canonname = do_strdup(name.c_str());
112 }
113 SetPortForAllAddrinfos(ai, port); 142 SetPortForAllAddrinfos(ai, port);
114 return AddressList(new Data(ai, false /*is_system_created*/)); 143 return AddressList(new Data(ai, false /*is_system_created*/));
115 } 144 }
116 145
117 146
118 // static 147 // static
119 AddressList AddressList::CreateByAdoptingFromSystem(struct addrinfo* head) { 148 AddressList AddressList::CreateByAdoptingFromSystem(struct addrinfo* head) {
120 return AddressList(new Data(head, true /*is_system_created*/)); 149 return AddressList(new Data(head, true /*is_system_created*/));
121 } 150 }
122 151
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 267
239 // Call either freeaddrinfo(head), or FreeMyAddrinfo(head), depending who 268 // Call either freeaddrinfo(head), or FreeMyAddrinfo(head), depending who
240 // created the data. 269 // created the data.
241 if (is_system_created) 270 if (is_system_created)
242 freeaddrinfo(mutable_head); 271 freeaddrinfo(mutable_head);
243 else 272 else
244 FreeCopyOfAddrinfo(mutable_head); 273 FreeCopyOfAddrinfo(mutable_head);
245 } 274 }
246 275
247 } // namespace net 276 } // namespace net
OLDNEW
« 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