@@ -87,48 +87,38 @@ Address::Address(const IPv6AddressBytes *ipv6_bytes, u16 port)
87
87
setPort (port);
88
88
}
89
89
90
- // Equality (address family, address and port must be equal)
91
- bool Address::operator ==(const Address &address )
90
+ // Equality (address family, IP and port must be equal)
91
+ bool Address::operator ==(const Address &other )
92
92
{
93
- if (address .m_addr_family != m_addr_family || address .m_port != m_port)
93
+ if (other .m_addr_family != m_addr_family || other .m_port != m_port)
94
94
return false ;
95
95
96
96
if (m_addr_family == AF_INET) {
97
- return m_address.ipv4 .sin_addr .s_addr ==
98
- address.m_address .ipv4 .sin_addr .s_addr ;
97
+ return m_address.ipv4 .s_addr == other.m_address .ipv4 .s_addr ;
99
98
}
100
99
101
100
if (m_addr_family == AF_INET6) {
102
- return memcmp (m_address.ipv6 .sin6_addr . s6_addr ,
103
- address .m_address .ipv6 . sin6_addr .s6_addr , 16 ) == 0 ;
101
+ return memcmp (m_address.ipv6 .s6_addr ,
102
+ other .m_address .ipv6 .s6_addr , 16 ) == 0 ;
104
103
}
105
104
106
105
return false ;
107
106
}
108
107
109
- bool Address::operator !=(const Address &address)
110
- {
111
- return !(*this == address);
112
- }
113
-
114
108
void Address::Resolve (const char *name)
115
109
{
116
110
if (!name || name[0 ] == 0 ) {
117
- if (m_addr_family == AF_INET) {
118
- setAddress ((u32)0 );
119
- } else if (m_addr_family == AF_INET6) {
120
- setAddress ((IPv6AddressBytes *)0 );
121
- }
111
+ if (m_addr_family == AF_INET)
112
+ setAddress (static_cast <u32>(0 ));
113
+ else if (m_addr_family == AF_INET6)
114
+ setAddress (static_cast <IPv6AddressBytes*>(nullptr ));
122
115
return ;
123
116
}
124
117
125
118
struct addrinfo *resolved, hints;
126
119
memset (&hints, 0 , sizeof (hints));
127
120
128
121
// Setup hints
129
- hints.ai_socktype = 0 ;
130
- hints.ai_protocol = 0 ;
131
- hints.ai_flags = 0 ;
132
122
if (g_settings->getBool (" enable_ipv6" )) {
133
123
// AF_UNSPEC allows both IPv6 and IPv4 addresses to be returned
134
124
hints.ai_family = AF_UNSPEC;
@@ -145,14 +135,13 @@ void Address::Resolve(const char *name)
145
135
if (resolved->ai_family == AF_INET) {
146
136
struct sockaddr_in *t = (struct sockaddr_in *)resolved->ai_addr ;
147
137
m_addr_family = AF_INET;
148
- m_address.ipv4 = *t ;
138
+ m_address.ipv4 = t-> sin_addr ;
149
139
} else if (resolved->ai_family == AF_INET6) {
150
140
struct sockaddr_in6 *t = (struct sockaddr_in6 *)resolved->ai_addr ;
151
141
m_addr_family = AF_INET6;
152
- m_address.ipv6 = *t ;
142
+ m_address.ipv6 = t-> sin6_addr ;
153
143
} else {
154
- freeaddrinfo (resolved);
155
- throw ResolveError (" " );
144
+ m_addr_family = 0 ;
156
145
}
157
146
freeaddrinfo (resolved);
158
147
}
@@ -163,100 +152,77 @@ std::string Address::serializeString() const
163
152
// windows XP doesnt have inet_ntop, maybe use better func
164
153
#ifdef _WIN32
165
154
if (m_addr_family == AF_INET) {
166
- u8 a, b, c, d;
167
- u32 addr;
168
- addr = ntohl (m_address.ipv4 .sin_addr .s_addr );
169
- a = (addr & 0xFF000000 ) >> 24 ;
170
- b = (addr & 0x00FF0000 ) >> 16 ;
171
- c = (addr & 0x0000FF00 ) >> 8 ;
172
- d = (addr & 0x000000FF );
173
- return itos (a) + " ." + itos (b) + " ." + itos (c) + " ." + itos (d);
155
+ return inet_ntoa (m_address.ipv4 );
174
156
} else if (m_addr_family == AF_INET6) {
175
157
std::ostringstream os;
158
+ os << std::hex;
176
159
for (int i = 0 ; i < 16 ; i += 2 ) {
177
- u16 section = (m_address.ipv6 .sin6_addr . s6_addr [i] << 8 ) |
178
- (m_address.ipv6 . sin6_addr .s6_addr [i + 1 ]);
179
- os << std::hex << section;
160
+ u16 section = (m_address.ipv6 .s6_addr [i] << 8 ) |
161
+ (m_address.ipv6 .s6_addr [i + 1 ]);
162
+ os << section;
180
163
if (i < 14 )
181
164
os << " :" ;
182
165
}
183
166
return os.str ();
184
- } else
185
- return std::string (" " );
167
+ } else {
168
+ return " " ;
169
+ }
186
170
#else
187
171
char str[INET6_ADDRSTRLEN];
188
- if (inet_ntop (m_addr_family,
189
- (m_addr_family == AF_INET)
190
- ? (void *)&(m_address.ipv4 .sin_addr )
191
- : (void *)&(m_address.ipv6 .sin6_addr ),
192
- str, INET6_ADDRSTRLEN) == NULL ) {
193
- return std::string (" " );
194
- }
195
- return std::string (str);
172
+ if (inet_ntop (m_addr_family, (void *) &m_address, str, sizeof (str)) == nullptr )
173
+ return " " ;
174
+ return str;
196
175
#endif
197
176
}
198
177
199
- struct sockaddr_in Address::getAddress () const
178
+ struct in_addr Address::getAddress () const
200
179
{
201
- return m_address.ipv4 ; // NOTE: NO PORT INCLUDED, use getPort()
180
+ return m_address.ipv4 ;
202
181
}
203
182
204
- struct sockaddr_in6 Address::getAddress6 () const
183
+ struct in6_addr Address::getAddress6 () const
205
184
{
206
- return m_address.ipv6 ; // NOTE: NO PORT INCLUDED, use getPort()
185
+ return m_address.ipv6 ;
207
186
}
208
187
209
188
u16 Address::getPort () const
210
189
{
211
190
return m_port;
212
191
}
213
192
214
- int Address::getFamily () const
215
- {
216
- return m_addr_family;
217
- }
218
-
219
- bool Address::isIPv6 () const
220
- {
221
- return m_addr_family == AF_INET6;
222
- }
223
-
224
193
bool Address::isZero () const
225
194
{
226
195
if (m_addr_family == AF_INET) {
227
- return m_address.ipv4 .sin_addr . s_addr == 0 ;
196
+ return m_address.ipv4 .s_addr == 0 ;
228
197
}
229
198
230
199
if (m_addr_family == AF_INET6) {
231
200
static const char zero[16 ] = {0 };
232
- return memcmp (m_address.ipv6 .sin6_addr . s6_addr , zero, 16 ) == 0 ;
201
+ return memcmp (m_address.ipv6 .s6_addr , zero, 16 ) == 0 ;
233
202
}
203
+
234
204
return false ;
235
205
}
236
206
237
207
void Address::setAddress (u32 address)
238
208
{
239
209
m_addr_family = AF_INET;
240
- m_address.ipv4 .sin_family = AF_INET;
241
- m_address.ipv4 .sin_addr .s_addr = htonl (address);
210
+ m_address.ipv4 .s_addr = htonl (address);
242
211
}
243
212
244
213
void Address::setAddress (u8 a, u8 b, u8 c, u8 d)
245
214
{
246
- m_addr_family = AF_INET;
247
- m_address.ipv4 .sin_family = AF_INET;
248
- u32 addr = htonl ((a << 24 ) | (b << 16 ) | (c << 8 ) | d);
249
- m_address.ipv4 .sin_addr .s_addr = addr;
215
+ u32 addr = (a << 24 ) | (b << 16 ) | (c << 8 ) | d;
216
+ setAddress (addr);
250
217
}
251
218
252
219
void Address::setAddress (const IPv6AddressBytes *ipv6_bytes)
253
220
{
254
221
m_addr_family = AF_INET6;
255
- m_address.ipv6 .sin6_family = AF_INET6;
256
222
if (ipv6_bytes)
257
- memcpy (m_address.ipv6 .sin6_addr . s6_addr , ipv6_bytes->bytes , 16 );
223
+ memcpy (m_address.ipv6 .s6_addr , ipv6_bytes->bytes , 16 );
258
224
else
259
- memset (m_address.ipv6 .sin6_addr . s6_addr , 0 , 16 );
225
+ memset (m_address.ipv6 .s6_addr , 0 , 16 );
260
226
}
261
227
262
228
void Address::setPort (u16 port)
@@ -268,23 +234,26 @@ void Address::print(std::ostream *s) const
268
234
{
269
235
if (m_addr_family == AF_INET6)
270
236
*s << " [" << serializeString () << " ]:" << m_port;
271
- else
237
+ else if (m_addr_family == AF_INET)
272
238
*s << serializeString () << " :" << m_port;
239
+ else
240
+ *s << " (undefined)" ;
273
241
}
274
242
275
243
bool Address::isLocalhost () const
276
244
{
277
245
if (isIPv6 ()) {
278
- static const unsigned char localhost_bytes[] = {
246
+ static const u8 localhost_bytes[] = {
279
247
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 };
280
- static const unsigned char mapped_ipv4_localhost[] = {
248
+ static const u8 mapped_ipv4_localhost[] = {
281
249
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0xff , 0xff , 0x7f , 0 , 0 , 0 };
282
250
283
- auto addr = m_address.ipv6 .sin6_addr . s6_addr ;
251
+ auto addr = m_address.ipv6 .s6_addr ;
284
252
285
253
return memcmp (addr, localhost_bytes, 16 ) == 0 ||
286
254
memcmp (addr, mapped_ipv4_localhost, 13 ) == 0 ;
287
255
}
288
256
289
- return (m_address.ipv4 .sin_addr .s_addr & 0xFF ) == 0x7f ;
257
+ auto addr = ntohl (m_address.ipv4 .s_addr );
258
+ return (addr >> 24 ) == 0x7f ;
290
259
}
0 commit comments