35 #include <arpa/inet.h>
36 #include <sys/types.h>
49 #if defined(__solaris__)
50 #define s6_addr32 _S6_un._S6_u32
51 #elif defined(__APPLE__) || defined(__FreeBSD__)
52 #define s6_addr32 __u6_addr.__u6_addr32
63 #define IN6_IS_ADDR_UNIQLOCAL(a) \
64 ( ((const uint8_t *)(a))[0] == 0xfc || ((const uint8_t *)(a))[0] == 0xfd )
74 static const char lbVal[13] ={0,0,0,0,0,0,0,0,0,0,0,0,0x7f};
83 const char *pFmt =
"]:%d";
84 int totLen, n, pNum, addBrak = 0;
91 if (
IP.
Addr.sa_family == AF_UNIX)
92 {n = (omitP ? snprintf(bAddr, bLen,
"localhost")
93 : snprintf(bAddr, bLen,
"localhost:%s", unixPipe->sun_path));
94 return (n < bLen ? n :
QFill(bAddr, bLen));
100 pNum = ntohs(
IP.
v4.sin_port);
108 {n = (omitP ? snprintf(bAddr, bLen,
"%s",
hostName)
109 : snprintf(bAddr, bLen,
"%s:%d",
hostName, pNum));
110 return (n < bLen ? n :
QFill(bAddr, bLen));
121 {n = (omitP ? snprintf(bAddr, bLen,
"%s",
hostName)
122 : snprintf(bAddr, bLen,
"%s:%d",
hostName, pNum));
123 return (n < bLen ? n :
QFill(bAddr, bLen));
128 if (
IP.
Addr.sa_family == AF_INET6)
129 {
if (bLen < (INET6_ADDRSTRLEN+2))
return QFill(bAddr, bLen);
130 if (ipOld && IN6_IS_ADDR_V4MAPPED(&
IP.
v6.sin6_addr))
131 {
if (fmtOpts &
prefipv4) {n = 0; pFmt =
":%d";}
132 else if (ipRaw) {strcpy(bAddr,
"::"); n = 2;}
133 else {strcpy(bAddr,
"[::"); n = 3; addBrak=1;}
134 if (!inet_ntop(AF_INET, &
IP.
v6.sin6_addr.s6_addr32[3],
135 bAddr+n, bLen-n))
return QFill(bAddr, bLen);
137 if (!ipRaw) {*bAddr =
'['; n = 1; addBrak = 1;}
139 if (!inet_ntop(AF_INET6,&(
IP.
v6.sin6_addr),bAddr+n,bLen-n))
140 return QFill(bAddr, bLen);
143 else if (
IP.
Addr.sa_family == AF_INET)
144 {
if (theFmt !=
fmtAdv6) {n = 0; pFmt =
":%d";}
145 else {
if (bLen < (INET_ADDRSTRLEN+9))
return QFill(bAddr, bLen);
146 if (fmtOpts &
old6Map4) {strcpy(bAddr,
"[::"); n = 3;}
147 else {strcpy(bAddr,
"[::ffff:"); n = 8;}
148 if (ipRaw) {strcpy(bAddr, bAddr+1); n--;}
151 if (!inet_ntop(AF_INET, &(
IP.
v4.sin_addr),bAddr+n,bLen-n))
152 return QFill(bAddr, bLen);
154 else return QFill(bAddr, bLen);
158 totLen = strlen(bAddr); bAddr += totLen; bLen -= totLen;
164 {
if (bLen < 2)
return QFill(bAddr, bLen);
165 *bAddr++ =
']'; *bAddr = 0; totLen++;
172 if ((n = snprintf(bAddr, bLen, pFmt, pNum)) >= bLen)
173 return QFill(bAddr, bLen);
186 if (
IP.
Addr.sa_family == AF_INET)
187 return !memcmp(&
IP.
v4.sin_addr.s_addr, &lbVal[12], 1);
189 if (
IP.
Addr.sa_family == AF_INET6)
190 return !memcmp(&
IP.
v6.sin6_addr, &in6addr_loopback,
sizeof(in6_addr))
191 || !memcmp(&
IP.
v6.sin6_addr, lbVal,
sizeof(lbVal));
202 unsigned char *ipV4 = 0;
206 if (
IP.
Addr.sa_family == AF_INET6)
207 {
if ((IN6_IS_ADDR_V4MAPPED(&
IP.
v6.sin6_addr)))
208 ipV4 = (
unsigned char *)&
IP.
v6.sin6_addr.s6_addr32[3];
209 else {
if ((IN6_IS_ADDR_LINKLOCAL(&
IP.
v6.sin6_addr))
210 || (IN6_IS_ADDR_SITELOCAL(&
IP.
v6.sin6_addr))
212 || (IN6_IS_ADDR_LOOPBACK (&
IP.
v6.sin6_addr)))
return true;
220 {
if (IP.Addr.sa_family != AF_INET)
return true;
221 ipV4 = (
unsigned char *)&IP.v4.sin_addr.s_addr;
228 || (ipV4[0] == 172 && ipV4[1] >= 16 && ipV4[1] <= 31)
229 || (ipV4[0] == 192 && ipV4[1] == 168)
230 || (ipV4[0] == 169 && ipV4[1] == 254)
231 || ipV4[0] == 127)
return true;
248 if (!(hName =
Name()))
return false;
267 unsigned char *sp = (
unsigned char*)str;
269 while(*sp) {
if (isupper((
int)*sp)) *sp = (
char)tolower((
int)*sp); sp++;}
285 if (*name ==
'[')
return false;
286 if (!isdigit(*name))
return true;
292 if (!(dot = rindex(name,
'.')) || !isdigit(*(dot+1)))
return true;
298 {
if (*name ==
'.') dnum++;
299 else if (!isdigit(*name))
return true;
302 return (dnum == 3 ?
false :
true);
315 if (eText) *eText = 0;
319 if (
IP.
Addr.sa_family == AF_UNIX)
return "localhost";
332 if (eText) *eText = gai_strerror(rc);
344 if (
IP.
Addr.sa_family != AF_INET &&
IP.
Addr.sa_family != AF_INET6)
349 return ntohs(
IP.
v6.sin6_port);
358 static const char quests[] =
"????????";
363 {strncpy(bAddr, quests, bLen);
375 char hBuff[NI_MAXHOST];
384 if (
IP.
Addr.sa_family == AF_INET ) n =
sizeof(
IP.
v4);
385 else if (
IP.
Addr.sa_family == AF_INET6) n =
sizeof(
IP.
v6);
386 else if (
IP.
Addr.sa_family == AF_UNIX )
390 else return EAI_FAMILY;
395 if ((rc = getnameinfo(&
IP.
Addr, n, hBuff+1,
sizeof(hBuff)-2, 0, 0, 0)))
398 {
hostName = strdup(hBuff);
return 0;}
409 else {
char *perCent = index(hBuff+1,
'%');
410 if (perCent) *perCent = 0;
412 hBuff[0] =
'['; hBuff[n+1] =
']'; hBuff[n+2] = 0;
426 #define IS_INET(x) (x == AF_INET || x == AF_INET6)
428 #define MY_FAMILY IP.Addr.sa_family
430 #define UR_FAMILY ipAddr->IP.Addr.sa_family
434 static const int ipv4ASZ =
sizeof(
IP.
v4.sin_addr);
440 if (plusPort && isINet)
441 {in_port_t port1, port2;
444 : ipAddr->
IP.
v6.sin6_port);
445 if (port1 != port2)
return 0;
453 {
if (!isINet)
return 0;
457 return !memcmp(&
IP.
v4.sin_addr,
458 &(ipAddr->
IP.
v6.sin6_addr.s6_addr32[3]), ipv4ASZ);
460 return !memcmp(&
IP.
v6.sin6_addr.s6_addr32[3],
461 &(ipAddr->
IP.
v4.sin_addr), ipv4ASZ);
468 return !memcmp(&
IP.
v4.sin_addr, &(ipAddr->
IP.
v4.sin_addr), ipv4ASZ);
470 return !memcmp(&
IP.
v6.sin6_addr, &(ipAddr->
IP.
v6.sin6_addr),
471 sizeof(
IP.
v6.sin6_addr));
473 return !strcmp(unixPipe->sun_path, ipAddr->unixPipe->sun_path);
#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)