72{
73 static const char lbVal[13] ={0,0,0,0,0,0,0,0,0,0,0,0,0x7f};
74};
75
76
77
78
79
81{
82 const char *pFmt = "]:%d";
83 int totLen, n, pNum, addBrak = 0;
87
88
89
90 if (
IP.
Addr.sa_family == AF_UNIX)
91 {n = (omitP ? snprintf(bAddr, bLen, "localhost")
92 : snprintf(bAddr, bLen, "localhost:%s", unixPipe->sun_path));
93 return (n < bLen ? n :
QFill(bAddr, bLen));
94 }
95
96
97
98
99 pNum = ntohs(
IP.
v4.sin_port);
100
101
102
107 {n = (omitP ? snprintf(bAddr, bLen,
"%s",
hostName)
108 : snprintf(bAddr, bLen,
"%s:%d",
hostName, pNum));
109 return (n < bLen ? n :
QFill(bAddr, bLen));
110 }
112 }
113
114
115
116
117
118
120 {n = (omitP ? snprintf(bAddr, bLen,
"%s",
hostName)
121 : snprintf(bAddr, bLen,
"%s:%d",
hostName, pNum));
122 return (n < bLen ? n :
QFill(bAddr, bLen));
123 }
124
125
126
127 if (
IP.
Addr.sa_family == AF_INET6)
128 {
if (bLen < (INET6_ADDRSTRLEN+2))
return QFill(bAddr, bLen);
129 if (ipOld && IN6_IS_ADDR_V4MAPPED(&
IP.
v6.sin6_addr))
130 {
if (fmtOpts &
prefipv4) {n = 0; pFmt =
":%d";}
131 else if (ipRaw) {strcpy(bAddr, "::"); n = 2;}
132 else {strcpy(bAddr, "[::"); n = 3; addBrak=1;}
133 if (!inet_ntop(AF_INET, &
IP.
v6.sin6_addr.s6_addr32[3],
134 bAddr+n, bLen-n))
return QFill(bAddr, bLen);
135 } else {
136 if (!ipRaw) {*bAddr = '['; n = 1; addBrak = 1;}
137 else n = 0;
138 if (!inet_ntop(AF_INET6,&(
IP.
v6.sin6_addr),bAddr+n,bLen-n))
139 return QFill(bAddr, bLen);
140 }
141 }
142 else if (
IP.
Addr.sa_family == AF_INET)
143 {
if (theFmt !=
fmtAdv6) {n = 0; pFmt =
":%d";}
144 else {
if (bLen < (INET_ADDRSTRLEN+9))
return QFill(bAddr, bLen);
145 if (fmtOpts &
old6Map4) {strcpy(bAddr,
"[::"); n = 3;}
146 else {strcpy(bAddr, "[::ffff:"); n = 8;}
147 if (ipRaw) {strcpy(bAddr, bAddr+1); n--;}
148 addBrak = 1;
149 }
150 if (!inet_ntop(AF_INET, &(
IP.
v4.sin_addr),bAddr+n,bLen-n))
151 return QFill(bAddr, bLen);
152 }
153 else return QFill(bAddr, bLen);
154
155
156
157 totLen = strlen(bAddr); bAddr += totLen; bLen -= totLen;
158
159
160
161 if (omitP)
162 {if (addBrak)
163 {
if (bLen < 2)
return QFill(bAddr, bLen);
164 *bAddr++ = ']'; *bAddr = 0; totLen++;
165 }
166 return totLen;
167 }
168
169
170
171 if ((n = snprintf(bAddr, bLen, pFmt, pNum)) >= bLen)
172 return QFill(bAddr, bLen);
173 return totLen+n;
174}
175
176
177
178
179
181{
182
183
184
185 if (
IP.
Addr.sa_family == AF_INET)
186 return !memcmp(&
IP.
v4.sin_addr.s_addr, &lbVal[12], 1);
187
188 if (
IP.
Addr.sa_family == AF_INET6)
189 return !memcmp(&
IP.
v6.sin6_addr, &in6addr_loopback,
sizeof(in6_addr))
190 || !memcmp(&
IP.
v6.sin6_addr, lbVal,
sizeof(lbVal));
191
192 return false;
193}
194
195
196
197
198
200{
201 unsigned char *ipV4 = 0;
202
203
204
205 if (
IP.
Addr.sa_family == AF_INET6)
206 {
if ((IN6_IS_ADDR_V4MAPPED(&
IP.
v6.sin6_addr)))
207 ipV4 = (
unsigned char *)&
IP.
v6.sin6_addr.s6_addr32[3];
208 else {
if ((IN6_IS_ADDR_LINKLOCAL(&
IP.
v6.sin6_addr))
209 || (IN6_IS_ADDR_SITELOCAL(&
IP.
v6.sin6_addr))
211 || (IN6_IS_ADDR_LOOPBACK (&
IP.
v6.sin6_addr)))
return true;
212 return false;
213 }
214 }
215
216
217
218 if (!ipV4)
219 {
if (
IP.
Addr.sa_family != AF_INET)
return true;
220 ipV4 = (
unsigned char *)&
IP.
v4.sin_addr.s_addr;
221 }
222
223
224
225
226 if (ipV4[0] == 10
227 || (ipV4[0] == 172 && ipV4[1] >= 16 && ipV4[1] <= 31)
228 || (ipV4[0] == 192 && ipV4[1] == 168)
229 || (ipV4[0] == 169 && ipV4[1] == 254)
230 || ipV4[0] == 127) return true;
231
232
233
234 return false;
235}
236
237
238
239
240
242{
243 const char *hName;
244
245
246
247 if (!(hName =
Name()))
return false;
249}
250
251
252
253
254
256{
258}
259
260
261
262
263
265{
266 unsigned char *sp = (unsigned char*)str;
267
268 while(*sp) {if (isupper((int)*sp)) *sp = (char)tolower((int)*sp); sp++;}
269
270 return str;
271}
272
273
274
275
276
278{
279 const char *dot;
280 int dnum;
281
282
283
284 if (*name == '[') return false;
285 if (!isdigit(*name)) return true;
286
287
288
289
290
291 if (!(dot = rindex(name, '.')) || !isdigit(*(dot+1))) return true;
292
293
294
295 name++; dnum = 0;
296 while(*name)
297 {if (*name == '.') dnum++;
298 else if (!isdigit(*name)) return true;
299 name++;
300 }
301 return (dnum == 3 ? false : true);
302}
303
304
305
306
307
309{
310 int rc;
311
312
313
314 if (eText) *eText = 0;
315
316
317
318 if (
IP.
Addr.sa_family == AF_UNIX)
return "localhost";
319
320
321
324
325
326
328
329
330
331 if (eText) *eText = gai_strerror(rc);
332 return eName;
333}
334
335
336
337
338
340{
341
342
343 if (
IP.
Addr.sa_family != AF_INET &&
IP.
Addr.sa_family != AF_INET6)
344 return -1;
345
346
347
348 return ntohs(
IP.
v6.sin6_port);
349}
350
351
352
353
354
356{
357 static const char quests[] = "????????";
358
359
360
361 if (bLen)
362 {strncpy(bAddr, quests, bLen);
363 bAddr[bLen-1] = 0;
364 }
365 return 0;
366}
367
368
369
370
371
373{
374 char hBuff[NI_MAXHOST];
375 int n, rc;
376
377
378
380
381
382
383 if (
IP.
Addr.sa_family == AF_INET ) n =
sizeof(
IP.
v4);
384 else if (
IP.
Addr.sa_family == AF_INET6) n =
sizeof(
IP.
v6);
385 else if (
IP.
Addr.sa_family == AF_UNIX )
387 return 0;
388 }
389 else return EAI_FAMILY;
390
391
392
393
394 if ((rc = getnameinfo(&
IP.
Addr, n, hBuff+1,
sizeof(hBuff)-2, 0, 0, 0)))
397 {
hostName = strdup(hBuff);
return 0;}
399 return rc;
400 }
401
402
403
404
405
406
408 else {char *perCent = index(hBuff+1, '%');
409 if (perCent) *perCent = 0;
410 n = strlen(hBuff+1);
411 hBuff[0] = '['; hBuff[n+1] = ']'; hBuff[n+2] = 0;
413 }
414
415
416
418 return 0;
419}
420
421
422
423
424
425#define IS_INET(x) (x == AF_INET || x == AF_INET6)
426
427#define MY_FAMILY IP.Addr.sa_family
428
429#define UR_FAMILY ipAddr->IP.Addr.sa_family
430
432{
433 static const int ipv4ASZ =
sizeof(
IP.
v4.sin_addr);
434
436
437
438
439 if (plusPort && isINet)
440 {in_port_t port1, port2;
443 : ipAddr->
IP.
v6.sin6_port);
444 if (port1 != port2) return 0;
445 }
446
447
448
449
450
452 {if (!isINet) return 0;
456 return !memcmp(&
IP.
v4.sin_addr,
457 &(ipAddr->
IP.
v6.sin6_addr.s6_addr32[3]), ipv4ASZ);
459 return !memcmp(&
IP.
v6.sin6_addr.s6_addr32[3],
460 &(ipAddr->
IP.
v4.sin_addr), ipv4ASZ);
461 return 0;
462 }
463
464
465
467 return !memcmp(&
IP.
v4.sin_addr, &(ipAddr->
IP.
v4.sin_addr), ipv4ASZ);
469 return !memcmp(&
IP.
v6.sin6_addr, &(ipAddr->
IP.
v6.sin6_addr),
470 sizeof(
IP.
v6.sin6_addr));
472 return !strcmp(unixPipe->sun_path, ipAddr->unixPipe->sun_path);
473
474 return 0;
475}
#define IN6_IS_ADDR_UNIQLOCAL(a)
static XrdNetCache * dnsCache
static const int noPort
Do not add port number.
static const int old6Map4
Use deprecated IPV6 mapped format.
static bool isHostName(const char *name)
static const int noPortRaw
Use raw address format (no port)
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
static const int prefipv4
Use if mapped IPV4 actual format.
int Format(char *bAddr, int bLen, fmtUse fmtType=fmtAuto, int fmtOpts=0)
char * LowCase(char *str)
int QFill(char *bAddr, int bLen)
@ fmtAddr
Address using suitable ipv4 or ipv6 format.
@ fmtName
Hostname if it is resolvable o/w use fmtAddr.
@ fmtAuto
Hostname if already resolved o/w use fmtAddr.
static const char isTLS
Location using TLS.
const char * Name(const char *eName=0, const char **eText=0)
void Add(XrdNetAddrInfo *hAddr, const char *hName)
char * Find(XrdNetAddrInfo *hAddr)