/src/poco/Net/src/HostEntry.cpp
Line | Count | Source |
1 | | // |
2 | | // HostEntry.cpp |
3 | | // |
4 | | // Library: Net |
5 | | // Package: NetCore |
6 | | // Module: HostEntry |
7 | | // |
8 | | // Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH. |
9 | | // and Contributors. |
10 | | // |
11 | | // SPDX-License-Identifier: BSL-1.0 |
12 | | // |
13 | | |
14 | | |
15 | | #include "Poco/Net/HostEntry.h" |
16 | | #include "Poco/Exception.h" |
17 | | #include <algorithm> |
18 | | #include <set> |
19 | | |
20 | | |
21 | | namespace Poco { |
22 | | namespace Net { |
23 | | |
24 | | |
25 | | template <typename T> |
26 | | void removeDuplicates(std::vector<T>& list) |
27 | 0 | { |
28 | 0 | std::set<T> uniqueValues; |
29 | | // Remove duplicates and preserve order |
30 | 0 | list.erase( |
31 | 0 | std::remove_if(list.begin(), list.end(), [&uniqueValues](const T& value) { return !uniqueValues.insert(value).second; }), Unexecuted instantiation: Poco::Net::removeDuplicates<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const Unexecuted instantiation: Poco::Net::removeDuplicates<Poco::Net::IPAddress>(std::__1::vector<Poco::Net::IPAddress, std::__1::allocator<Poco::Net::IPAddress> >&)::{lambda(Poco::Net::IPAddress const&)#1}::operator()(Poco::Net::IPAddress const&) const |
32 | 0 | list.end() |
33 | 0 | ); |
34 | 0 | } Unexecuted instantiation: void Poco::Net::removeDuplicates<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&) Unexecuted instantiation: void Poco::Net::removeDuplicates<Poco::Net::IPAddress>(std::__1::vector<Poco::Net::IPAddress, std::__1::allocator<Poco::Net::IPAddress> >&) |
35 | | |
36 | | |
37 | | HostEntry::HostEntry() |
38 | 0 | { |
39 | 0 | } |
40 | | |
41 | | |
42 | | HostEntry::HostEntry(struct hostent* entry) |
43 | 0 | { |
44 | 0 | poco_check_ptr (entry); |
45 | |
|
46 | 0 | _name = entry->h_name; |
47 | 0 | char** alias = entry->h_aliases; |
48 | 0 | if (alias) |
49 | 0 | { |
50 | 0 | while (*alias) |
51 | 0 | { |
52 | 0 | _aliases.push_back(std::string(*alias)); |
53 | 0 | ++alias; |
54 | 0 | } |
55 | 0 | } |
56 | 0 | removeDuplicates(_aliases); |
57 | |
|
58 | 0 | char** address = entry->h_addr_list; |
59 | 0 | if (address) |
60 | 0 | { |
61 | 0 | while (*address) |
62 | 0 | { |
63 | 0 | _addresses.push_back(IPAddress(*address, entry->h_length)); |
64 | 0 | ++address; |
65 | 0 | } |
66 | 0 | } |
67 | 0 | removeDuplicates(_addresses); |
68 | 0 | } |
69 | | |
70 | | |
71 | | #if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO) |
72 | | |
73 | | |
74 | | HostEntry::HostEntry(struct addrinfo* ainfo) |
75 | 0 | { |
76 | 0 | poco_check_ptr (ainfo); |
77 | |
|
78 | 0 | for (struct addrinfo* ai = ainfo; ai; ai = ai->ai_next) |
79 | 0 | { |
80 | 0 | if (ai->ai_canonname) |
81 | 0 | { |
82 | 0 | _name.assign(ai->ai_canonname); |
83 | 0 | } |
84 | 0 | if (ai->ai_addrlen && ai->ai_addr) |
85 | 0 | { |
86 | 0 | switch (ai->ai_addr->sa_family) |
87 | 0 | { |
88 | 0 | case AF_INET: |
89 | 0 | _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in*>(ai->ai_addr)->sin_addr, sizeof(in_addr))); |
90 | 0 | break; |
91 | 0 | #if defined(POCO_HAVE_IPv6) |
92 | 0 | case AF_INET6: |
93 | 0 | _addresses.push_back(IPAddress(&reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_addr, sizeof(in6_addr), reinterpret_cast<struct sockaddr_in6*>(ai->ai_addr)->sin6_scope_id)); |
94 | 0 | break; |
95 | 0 | #endif |
96 | 0 | } |
97 | 0 | } |
98 | 0 | } |
99 | 0 | removeDuplicates(_addresses); |
100 | 0 | } |
101 | | |
102 | | |
103 | | #endif // POCO_HAVE_IPv6 |
104 | | |
105 | | |
106 | | #if defined(POCO_VXWORKS) |
107 | | |
108 | | |
109 | | HostEntry::HostEntry(const std::string& name, const IPAddress& addr): |
110 | | _name(name) |
111 | | { |
112 | | _addresses.push_back(addr); |
113 | | } |
114 | | |
115 | | |
116 | | #endif // POCO_VXWORKS |
117 | | |
118 | | |
119 | | HostEntry::HostEntry(const HostEntry& entry): |
120 | 0 | _name(entry._name), |
121 | 0 | _aliases(entry._aliases), |
122 | 0 | _addresses(entry._addresses) |
123 | 0 | { |
124 | 0 | } |
125 | | |
126 | | |
127 | | HostEntry& HostEntry::operator = (const HostEntry& entry) |
128 | 0 | { |
129 | 0 | if (&entry != this) |
130 | 0 | { |
131 | 0 | _name = entry._name; |
132 | 0 | _aliases = entry._aliases; |
133 | 0 | _addresses = entry._addresses; |
134 | 0 | } |
135 | 0 | return *this; |
136 | 0 | } |
137 | | |
138 | | |
139 | | void HostEntry::swap(HostEntry& hostEntry) noexcept |
140 | 0 | { |
141 | 0 | std::swap(_name, hostEntry._name); |
142 | 0 | std::swap(_aliases, hostEntry._aliases); |
143 | 0 | std::swap(_addresses, hostEntry._addresses); |
144 | 0 | } |
145 | | |
146 | | |
147 | | HostEntry::~HostEntry() |
148 | 0 | { |
149 | 0 | } |
150 | | |
151 | | |
152 | | } } // namespace Poco::Net |