XRootD
Loading...
Searching...
No Matches
XrdNetAddr Class Reference

#include <XrdNetAddr.hh>

+ Inheritance diagram for XrdNetAddr:
+ Collaboration diagram for XrdNetAddr:

Public Member Functions

 XrdNetAddr ()
 Assignment operator and copy constructor are inherited, no need to define.
 
 XrdNetAddr (const sockaddr *addr)
 
 XrdNetAddr (const sockaddr_in *addr)
 
 XrdNetAddr (const sockaddr_in6 *addr)
 
 XrdNetAddr (const XrdNetAddr *addr)
 
 XrdNetAddr (int port)
 
 ~XrdNetAddr ()
 Destructor.
 
int Port (int pNum=-1)
 
bool Register (const char *hName)
 
const char * Set (const char *hSpec, int &numIP, int maxIP, int pNum=PortInSpec, bool forUDP=false)
 
const char * Set (const char *hSpec, int pNum=PortInSpec)
 
const char * Set (const struct sockaddr *sockP, int sockFD=-1)
 
const char * Set (int sockFD, bool peer=true)
 
const char * Set (struct addrinfo *rP, int port, bool mapit=false)
 
void SetDialect (const char *dP)
 
void SetLocation (XrdNetAddrInfo::LocInfo &loc)
 
void SetTLS (bool val)
 
- Public Member Functions inherited from XrdNetAddrInfo
 XrdNetAddrInfo ()
 Constructor.
 
 XrdNetAddrInfo (const XrdNetAddrInfo *addr)
 
 XrdNetAddrInfo (XrdNetAddrInfo const &oP)
 Copy constructor.
 
 ~XrdNetAddrInfo ()
 Destructor.
 
const char * Dialect ()
 
int Family () const
 
int Format (char *bAddr, int bLen, fmtUse fmtType=fmtAuto, int fmtOpts=0)
 
bool isIPType (IPType ipType) const
 
bool isLoopback ()
 
bool isMapped () const
 
bool isPrivate ()
 
bool isRegistered ()
 
bool isUsingTLS ()
 
const struct LocInfoLocation ()
 
const char * Name (const char *eName=0, const char **eText=0)
 
const XrdNetSockAddrNetAddr ()
 
XrdNetAddrInfooperator= (XrdNetAddrInfo const &rhs)
 Assignment operator.
 
int Port ()
 
int Protocol ()
 
int Same (const XrdNetAddrInfo *ipAddr, bool plusPort=false)
 
const sockaddr * SockAddr ()
 
int SockFD ()
 
SOCKLEN_t SockSize ()
 

Static Public Member Functions

static bool DynDNS ()
 
static bool IPV4Set ()
 
static void SetCache (int keeptime)
 
static void SetDynDNS (bool onoff)
 
static void SetIPV4 ()
 
static void SetIPV6 ()
 
- Static Public Member Functions inherited from XrdNetAddrInfo
static bool isHostName (const char *name)
 

Static Public Attributes

static const int PortInSpec = (int)0x80000000
 
- Static Public Attributes inherited from XrdNetAddrInfo
static const int noPort = 0x0000001
 Do not add port number.
 
static const int noPortRaw = 0x0000002
 Use raw address format (no port)
 
static const int old6Map4 = 0x0000004
 Use deprecated IPV6 mapped format.
 
static const int prefipv4 = 0x0000008
 Use if mapped IPV4 actual format.
 

Additional Inherited Members

- Public Types inherited from XrdNetAddrInfo
enum  fmtUse {
  fmtAuto =0 ,
  fmtName ,
  fmtAddr ,
  fmtAdv6
}
 
enum  IPType {
  IPv4 = AF_INET ,
  IPv6 = AF_INET6 ,
  IPuX = AF_UNIX
}
 
- Protected Member Functions inherited from XrdNetAddrInfo
char * LowCase (char *str)
 
int QFill (char *bAddr, int bLen)
 
int Resolve ()
 
- Protected Attributes inherited from XrdNetAddrInfo
union { 
 
struct sockaddr * sockAddr
 
struct sockaddr_un * unixPipe
 
};  
 
LocInfo addrLoc
 
unsigned short addrSize
 
char * hostName
 
XrdNetSockAddr IP
 
unsigned char protFlgs
 
const char * protName
 
unsigned char protType
 
int sockNum
 
- Static Protected Attributes inherited from XrdNetAddrInfo
static XrdNetCachednsCache = 0
 
static const char isTLS = 0x01
 Location using TLS.
 

Detailed Description

Definition at line 41 of file XrdNetAddr.hh.

Constructor & Destructor Documentation

◆ XrdNetAddr() [1/6]

XrdNetAddr::XrdNetAddr ( )
inline

Assignment operator and copy constructor are inherited, no need to define.

Constructor

Parameters
addrA pointer to an initialized and valid sockaddr or sockaddr compatible structure used to initialize the address.
portUses the address of the current host and the speoified port number to initilize the address.

Definition at line 265 of file XrdNetAddr.hh.

265: XrdNetAddrInfo() {}
XrdNetAddrInfo()
Constructor.

◆ XrdNetAddr() [2/6]

XrdNetAddr::XrdNetAddr ( const XrdNetAddr * addr)
inline

Definition at line 267 of file XrdNetAddr.hh.

267: XrdNetAddrInfo(addr) {}

◆ XrdNetAddr() [3/6]

XrdNetAddr::XrdNetAddr ( const sockaddr * addr)
inline

Definition at line 269 of file XrdNetAddr.hh.

270 {Set(addr);}
const char * Set(const char *hSpec, int pNum=PortInSpec)

References Set().

+ Here is the call graph for this function:

◆ XrdNetAddr() [4/6]

XrdNetAddr::XrdNetAddr ( const sockaddr_in * addr)
inline

Definition at line 272 of file XrdNetAddr.hh.

273 {Set((sockaddr *)addr);}

References Set().

+ Here is the call graph for this function:

◆ XrdNetAddr() [5/6]

XrdNetAddr::XrdNetAddr ( const sockaddr_in6 * addr)
inline

Definition at line 275 of file XrdNetAddr.hh.

276 {Set((sockaddr *)addr);}

References Set().

+ Here is the call graph for this function:

◆ XrdNetAddr() [6/6]

XrdNetAddr::XrdNetAddr ( int port)

Definition at line 95 of file XrdNetAddr.cc.

96{
97 const char *fqn = XrdNetIdentity::FQN();
98
99// Otherwise, we cannot initialize this object so force an error!
100//
101 if (!fqn) fqn = "No_DNS_Name!";
102 Set(fqn, port);
103}
static const char * FQN(const char **etext=0)

References XrdNetIdentity::FQN(), and Set().

+ Here is the call graph for this function:

◆ ~XrdNetAddr()

XrdNetAddr::~XrdNetAddr ( )
inline

Destructor.

Definition at line 284 of file XrdNetAddr.hh.

284{}

Member Function Documentation

◆ DynDNS()

static bool XrdNetAddr::DynDNS ( )
inlinestatic

Determine if dynamic DNS has been set.

Returns
True Dynamic DNS has been set. False Dynamic DNS has not been set.

Definition at line 52 of file XrdNetAddr.hh.

52{return dynDNS;}

Referenced by XrdCmsUtils::ParseMan().

+ Here is the caller graph for this function:

◆ IPV4Set()

static bool XrdNetAddr::IPV4Set ( )
inlinestatic

Determine if IPV4 mode has been set.

Returns
True IPV4 mode has been set. False IPV4 mode has not been set.

Definition at line 61 of file XrdNetAddr.hh.

61{return useIPV4;}

Referenced by XrdInet::BindSD(), and XrdConfig::Configure().

+ Here is the caller graph for this function:

◆ Port()

int XrdNetAddr::Port ( int pNum = -1)

Optionally set and also returns the port number for our address.

Parameters
pNumwhen negative it only returns the current port. Otherwise, it is taken as the value to be set.
Returns
Success: The port number, which may be 0 if not set. Failure: -1 address is not an internet address or port is invalid.

Definition at line 148 of file XrdNetAddr.cc.

149{
150// Make sure we have a proper address family here
151//
152 if (IP.Addr.sa_family != AF_INET && IP.Addr.sa_family != AF_INET6)
153 return -1;
154
155// Return port number if so wanted. The port location is the same regardless of
156// the address family.
157//
158 if (pNum < 0) return ntohs(IP.v6.sin6_port);
159
160// Set port number if we have a valid address. The location of the port
161// is the same regardless of address family.
162//
163 if (pNum > 0xffff) return -1;
164 IP.v6.sin6_port = htons(static_cast<short>(pNum));
165 return pNum;
166}
struct sockaddr_in6 v6
struct sockaddr Addr
XrdNetSockAddr IP

References XrdNetSockAddr::Addr, XrdNetAddrInfo::IP, and XrdNetSockAddr::v6.

Referenced by XrdBwm::XrdBwm(), XrdPosixAdmin::FanOut(), XrdNetUtils::Hosts(), and XrdCmsManager::Rerun().

+ Here is the caller graph for this function:

◆ Register()

bool XrdNetAddr::Register ( const char * hName)

Register a host name with this IP address. This is not MT-safe!

Parameters
hName-> to a true host name which should be fully qualified. One of the IP addresses registered to this name must match the IP address associated with this object.
Returns
True: Specified name is now associated with this address. False: Nothing changed, registration could not be verified.

Definition at line 172 of file XrdNetAddr.cc.

173{
174 XrdNetAddr *aListVec = 0;
175 int i, aListNum;
176
177// Step one is to make sure the incoming name is not an address
178//
179 if (!isHostName(hName)) return false;
180
181// The next step is to get all of the IP addresses registered for this name
182//
183 if (XrdNetUtils::GetAddrs(hName, &aListVec, aListNum,
185 return false;
186
187// In order to use the given name, one of the IP addresses in the list must
188// match our address. This is about as secure we can get.
189//
190 for (i = 0; i < aListNum; i++) {if (Same(&aListVec[i])) break;}
191 delete [] aListVec;
192
193// If we didn't find a match, report it
194//
195 if (i >= aListNum) return false;
196
197// Replace current hostname with the wanted one
198//
199 if (hostName) free(hostName);
200 hostName = strdup(hName);
201 return true;
202}
static bool isHostName(const char *name)
int Same(const XrdNetAddrInfo *ipAddr, bool plusPort=false)
static const int NoPortRaw
static const char * GetAddrs(const char *hSpec, XrdNetAddr *aListP[], int &aListN, AddrOpts opts=allIPMap, int pNum=PortInSpec)

References XrdNetUtils::allIPMap, XrdNetUtils::GetAddrs(), XrdNetAddrInfo::hostName, XrdNetAddrInfo::isHostName(), XrdNetUtils::NoPortRaw, and XrdNetAddrInfo::Same().

Referenced by XrdLinkXeq::Register().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Set() [1/5]

const char * XrdNetAddr::Set ( const char * hSpec,
int & numIP,
int maxIP,
int pNum = PortInSpec,
bool forUDP = false )

Return multiple addresses. This form can only be used on the first element of this object that has been allocated as an array. This method is useful for getting all of the aliases assigned to a dns entry. The file descriptor association is set to a negative value.

Parameters
hSpec0 -> address is set to in6addr_any for binding via bind() !0 -> convert specification to an address. Valid formats: IP.v4: nnn.nnn.nnn.nnn[:<port>] IP.v6: [ipv6_addr][:<port>] IP.xx: name[:port] xx is determined by getaddrinfo()
maxIPnumber of elements in the array.
numIPthe number of IP addresses actually set (returned value).
pNum>= 0 uses the value as the port number regardless of what is in hSpec, should it be supplied. However, if is present, it must be a valid port number or name. < 0 uses the positive value as the port number if the port number has not been specified in hSpec. **** When set to PortInSpec(the default, see below) the port number/name must be specified in hSpec. If it is not, an error is returned.
forUDPwhen true addresses are usable for UDP connections. Otherwise, they are for TCP connections.
Returns
Success: 0 with numIP set to the number of elements set. Failure: the error message text describing the error and numIP is set to zero. The message is in persistent storage and cannot be modified.

Definition at line 335 of file XrdNetAddr.cc.

337{
338 struct addrinfo *hP, *rP = 0, *pP, *nP;
339 XrdNetAddr *aVec = this;
340 const char *hnBeg, *hnEnd, *pnBeg, *pnEnd;
341 char hBuff[MAXHOSTNAMELEN+8];
342 int hLen, n;
343
344// If only one address can be returned, just revert to standard processing
345//
346 if (!hSpec || !isalpha(*hSpec) || maxIP < 2)
347 {const char *eMsg = Set(hSpec, pNum);
348 numIP = (eMsg ? 0 : 1);
349 return eMsg;
350 }
351
352// Extract out host name
353//
354 if (!XrdNetUtils::Parse(hSpec, &hnBeg, &hnEnd, &pnBeg, &pnEnd))
355 return "invalid host specification";
356 hLen = hnEnd - hnBeg;
357 if (hLen > MAXHOSTNAMELEN) return "host name too long";
358 strncpy(hBuff, hSpec, hLen); hBuff[hLen] = 0;
359
360// Get the port number we will be setting
361//
362 if (pnBeg == hnEnd)
363 {if (pNum == PortInSpec) return "port not specified";
364 if (pNum < 0) pNum = -pNum;
365 } else {
366 if (*pnEnd || !(n = XrdNetUtils::ServPort(pnBeg, optUDP)))
367 return "invalid port";
368 if (pNum < 0) pNum = n;
369 }
370
371// Get all of the addresses
372//
373 hP = (optUDP ? huntHintsUDP : huntHintsTCP);
374 n = getaddrinfo(hBuff, 0, hP, &rP);
375 if (n || !rP)
376 {if (rP) freeaddrinfo(rP);
377 return (n ? gai_strerror(n) : "host not found");
378 }
379
380// Now self-referentially fill out ourselves with no duplicates
381//
382 n = 0; pP = 0; nP = rP;
383 do {if (!pP || pP->ai_addrlen != nP->ai_addrlen
384 || memcmp((const void *)pP->ai_addr, (const void *)nP->ai_addr,
385 nP->ai_addrlen)) {aVec[n].Set(nP, pNum); n++;}
386 pP = nP; nP = nP->ai_next;
387 } while(n < maxIP && nP);
388
389// All done
390//
391 numIP = n;
392 if (rP) freeaddrinfo(rP);
393 return 0;
394}
#define eMsg(x)
static const int PortInSpec
static int ServPort(const char *sName, bool isUDP=false, const char **eText=0)
static bool Parse(const char *hSpec, const char **hName, const char **hNend, const char **hPort, const char **hPend)

References eMsg, XrdNetUtils::Parse(), PortInSpec, XrdNetUtils::ServPort(), and Set().

+ Here is the call graph for this function:

◆ Set() [2/5]

const char * XrdNetAddr::Set ( const char * hSpec,
int pNum = PortInSpec )

Definition at line 208 of file XrdNetAddr.cc.

209{
210 static const char *badIPv4 = "invalid IPv4 address";
211 static const char *badIPv6 = "invalid IPv6 address";
212 static const char *badIP64 = "IPv6 address not IPv4 representable";
213 static const char *badName = "invalid host name";
214 static const int map46ID = htonl(0x0000ffff);
215
216 const char *Colon, *iP;
217 char aBuff[NI_MAXHOST+INET6_ADDRSTRLEN];
218 int aLen, n;
219 bool mapIt;
220
221// Clear translation if set (note unixPipe & sockAddr are the same).
222//
223 if (hostName) {free(hostName); hostName = 0;}
224 if (sockAddr != &IP.Addr) {delete unixPipe; sockAddr = &IP.Addr;}
225 memset(&IP, 0, sizeof(IP));
226 addrSize = sizeof(sockaddr_in6);
227
228// Check for any address setting
229//
230 if (!hSpec)
231 {if (useIPV4)
232 {IP.v4.sin_family = AF_INET;
233 IP.v4.sin_addr.s_addr = INADDR_ANY;
234 protType = PF_INET;
235 addrSize = sizeof(sockaddr_in);
236 } else {
237 IP.v6.sin6_family = AF_INET6;
238 IP.v6.sin6_addr = in6addr_any;
239 protType = PF_INET6;
240 }
241 if (pNum < 0) pNum= -pNum;
242 IP.v6.sin6_port = htons(static_cast<short>(pNum));
243 return 0;
244 }
245
246// Check for Unix type address here
247//
248 if (*hSpec == '/')
249 {if (strlen(hSpec) >= sizeof(unixPipe->sun_path)) return "path too long";
250 unixPipe = new sockaddr_un;
251 strcpy(unixPipe->sun_path, hSpec);
252 unixPipe->sun_family = IP.Addr.sa_family = AF_UNIX;
253 addrSize = sizeof(sockaddr_un);
254 protType = PF_UNIX;
255 return 0;
256 }
257
258// Do length check to see if we can fit the host name in our buffer.
259//
260 aLen = strlen(hSpec);
261 if (aLen >= (int)sizeof(aBuff)) return "host id too long";
262
263// Convert the address as appropriate. Note that we do accept RFC5156 deprecated
264// IPV4 mapped IPV6 addresses(i.e. [::a.b.c.d]. This is historical.
265//
266 if (*hSpec == '[')
267 {const char *Brak = index(hSpec+1, ']');
268 if (!Brak) return badIPv6;
269 Colon = Brak+1;
270 if (!(*Colon)) Colon = 0;
271 else if (*Colon != ':') return badIPv6;
272 aLen = Brak - (hSpec+1);
273 if (aLen >= INET6_ADDRSTRLEN) return badIPv6;
274 mapIt = (*(hSpec+1) == ':' && *(hSpec+2) == ':'
275 && *(hSpec+3) >= '0' && *(hSpec+3) <= '9'
276 && (iP = index(hSpec+4, '.')) && iP < Brak);
277 strncpy(aBuff, hSpec+1, aLen); aBuff[aLen] = 0;
278 if (inet_pton(AF_INET6,aBuff,&IP.v6.sin6_addr) != 1) return badIPv6;
279 if (mapIt) IP.v6.sin6_addr.s6_addr32[2] = map46ID;
280 IP.v6.sin6_family = AF_INET6;
281 protType = PF_INET6;
282 if (useIPV4 && !Map64()) return badIP64;
283 }
284 else if (!isHostName(hSpec))
285 {if ((Colon = index(hSpec, ':')))
286 {aLen = Colon - hSpec;
287 if (aLen >= INET_ADDRSTRLEN) return badIPv4;
288 strncpy(aBuff, hSpec, aLen); aBuff[aLen] = 0; iP = aBuff;
289 } else iP = hSpec;
290 if (inet_pton(AF_INET ,iP, &IP.v6.sin6_addr.s6_addr32[3]) != 1)
291 return badIPv4;
292 IP.v6.sin6_addr.s6_addr32[2] = map46ID;
293 IP.v6.sin6_family = AF_INET6;
294 protType = PF_INET6;
295 if (useIPV4 && !Map64()) return badIPv4;
296 }
297 else if (*hSpec == 0) return badName;
298
299 else {struct addrinfo *rP = 0;
300 if ((Colon = index(hSpec, ':')))
301 {aLen = Colon - hSpec;
302 if (aLen > MAXHOSTNAMELEN) return badName;
303 strncpy(aBuff, hSpec, aLen); aBuff[aLen] = 0; iP = aBuff;
304 } else iP = hSpec;
305 n = getaddrinfo(iP, 0, hostHints, &rP);
306 if (n || !rP)
307 {if (rP) freeaddrinfo(rP);
308 if (n == EAI_NONAME && dynDNS)
309 return "Dynamic name or service not yet registered";
310 return (n ? gai_strerror(n) : "host not found");
311 }
312 memcpy(&IP.Addr, rP->ai_addr, rP->ai_addrlen);
313 protType = (IP.v6.sin6_family == AF_INET6 ? PF_INET6 : PF_INET);
314 if (rP->ai_canonname) hostName = strdup(rP->ai_canonname);
315 freeaddrinfo(rP);
316 }
317
318// Now set the port number as needed (v4 & v6 port locations are the same)
319//
320 if (pNum == PortInSpec && !Colon) return "port not specified";
321 if (pNum <= 0 && Colon)
322 {char *eP;
323 pNum = strtol(Colon+1, &eP, 10);
324 if (pNum < 0 || pNum > 0xffff || *eP) return "invalid port number";
325 } else if (pNum < 0) pNum = -pNum;
326 IP.v6.sin6_port = htons(static_cast<short>(pNum));
327
328// All done
329//
330 return 0;
331}
struct sockaddr_in v4
unsigned char protType
unsigned short addrSize

References XrdNetSockAddr::Addr, XrdNetAddrInfo::addrSize, XrdNetAddrInfo::hostName, XrdNetAddrInfo::IP, XrdNetAddrInfo::isHostName(), PortInSpec, XrdNetAddrInfo::protType, XrdNetSockAddr::v4, and XrdNetSockAddr::v6.

Referenced by XrdTpc::PMarkManager::SocketInfo::SocketInfo(), XrdNetAddr(), XrdNetAddr(), XrdNetAddr(), XrdNetAddr(), XrdNetMsg::XrdNetMsg(), XrdSecProtocolgsi::XrdSecProtocolgsi(), XrdNetSecurity::Authorize(), XrdNetPMarkCfg::Config(), XrdNet::Connect(), XrdCmsNode::do_SelAvoid(), XrdPosixAdmin::FanOut(), XrdNetIF::GetIF(), XrdSsiClientProvider::GetService(), XrdNetUtils::GetSokInfo(), XrdNetUtils::IPFormat(), XrdOucReqID::isMine(), XrdCmsRedirLocal::Locate(), main(), main(), XrdNetSocket::Open(), XrdCmsUtils::ParseMan(), XrdCmsManager::Rerun(), XrdMpxOut::Run(), XrdNetMsg::Send(), Set(), XrdOfsTPCInfo::Set(), XrdOfsTPC::Verify(), XrdFfsMisc_get_list_of_data_servers(), and XrdFfsMisc_getNameByAddr().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Set() [3/5]

const char * XrdNetAddr::Set ( const struct sockaddr * sockP,
int sockFD = -1 )

Set our address via a sockaddr structure.

Parameters
sockPa pointer to an initialized and valid sockaddr structure.
sockFDthe associated file descriptor and can be used to record the file descriptor returned by accept().
Returns
Success: Returns 0. Failure: Returns the error message text describing the error. The message is in persistent storage and cannot be modified.

Definition at line 398 of file XrdNetAddr.cc.

399{
400// Clear translation if set
401//
402 if (hostName) {free(hostName); hostName = 0;}
403 if (sockAddr != &IP.Addr) {delete unixPipe; sockAddr = &IP.Addr;}
404 sockNum = sockFD;
405
406// Copy the address based on address family
407//
408 if (sockP->sa_family == AF_INET6) {addrSize = sizeof(IP.v6);
409 protType = PF_INET6;
410 }
411 else if (sockP->sa_family == AF_INET) {addrSize = sizeof(IP.v4);
412 protType = PF_INET;
413 }
414 else if (sockP->sa_family == AF_UNIX)
415 {unixPipe = new sockaddr_un;
416 memcpy(unixPipe, sockP, sizeof(struct sockaddr_un));
417 unixPipe->sun_path[sizeof(unixPipe->sun_path)-1] = 0;
418 addrSize = sizeof(sockaddr_un);
419 memset(&IP, 0, sizeof(IP));
420 IP.Addr.sa_family = AF_UNIX;
421 protType = PF_UNIX;
422 return 0;
423 }
424 else return "invalid address family";
425
426// Copy the address and return
427//
428 memcpy(&IP, sockP, addrSize);
429 return 0;
430}

References XrdNetSockAddr::Addr, XrdNetAddrInfo::addrSize, XrdNetAddrInfo::hostName, XrdNetAddrInfo::IP, XrdNetAddrInfo::protType, XrdNetAddrInfo::sockNum, XrdNetSockAddr::v4, and XrdNetSockAddr::v6.

◆ Set() [4/5]

const char * XrdNetAddr::Set ( int sockFD,
bool peer = true )

Set our address from the supplied socket file descriptor.

Parameters
sockFDa connected socket file descriptor. The value is also recorded as the associated file descriptor.
peerWhen true the address is set from getpeername() When false the address is set from getsockname()
Returns
Success: Returns 0. Failure: Returns the error message text describing the error. The message is in persistent storage and cannot be modified.

Definition at line 434 of file XrdNetAddr.cc.

435{
436 SOCKLEN_t aSize = static_cast<SOCKLEN_t>(sizeof(IP));
437 int rc;
438
439// Clear translation if set
440//
441 if (hostName) {free(hostName); hostName = 0;}
442 if (sockAddr != &IP.Addr) {delete unixPipe; sockAddr = &IP.Addr;}
443 sockNum = sockFD;
444
445// Get the address on the appropriate side of this socket
446//
447 if (peer) rc = getpeername(sockFD, &IP.Addr, &aSize);
448 else rc = getsockname(sockFD, &IP.Addr, &aSize);
449 if (rc < 0)
450 {addrSize = 0;
451 return XrdSysE2T(errno);
452 }
453
454// Set the correct address size and protocol family
455//
456 addrSize = aSize;
457 protType = (IP.Addr.sa_family == AF_INET ? PF_INET : PF_INET6);
458
459// All done
460//
461 return 0;
462}
const char * XrdSysE2T(int errcode)
Definition XrdSysE2T.cc:99
#define SOCKLEN_t

References XrdNetSockAddr::Addr, XrdNetAddrInfo::addrSize, XrdNetAddrInfo::hostName, XrdNetAddrInfo::IP, XrdNetAddrInfo::protType, SOCKLEN_t, XrdNetAddrInfo::sockNum, and XrdSysE2T().

+ Here is the call graph for this function:

◆ Set() [5/5]

const char * XrdNetAddr::Set ( struct addrinfo * rP,
int port,
bool mapit = false )

Set our address via and addrinfo structure and initialize the port.

Parameters
rPpointer to an addrinfo structure.
portthe port number to set.
mapitwhen true maps IPv4 addresses to IPv6. Otherwise, does not.
Returns
Success: Returns 0. Failure: Returns the error message text describing the error. The message is in persistent storage and cannot be modified.

Definition at line 466 of file XrdNetAddr.cc.

467{
468 static const int map46ID = htonl(0x0000ffff);
469
470// See if we need to convert this address otherwise just copy it
471//
472 if (mapit && rP->ai_family == AF_INET)
473 {memset(&IP.Addr, 0, sizeof(IP.Addr));
474 IP.v6.sin6_family = AF_INET6;
475 memcpy(&IP.v6.sin6_addr.s6_addr32[3], (rP->ai_addr->sa_data)+2, 4);
476 IP.v6.sin6_addr.s6_addr32[2] = map46ID;
477 addrSize = sizeof(IP.v6);
478 protType = PF_INET6;
479 } else {
480 memcpy(&IP.Addr, rP->ai_addr, rP->ai_addrlen);
481 addrSize = rP->ai_addrlen;
482 protType = rP->ai_protocol;
483 }
484
485// Cleanup pre-existing information
486//
487 if (hostName) free(hostName);
488 hostName = (rP->ai_canonname ? strdup(rP->ai_canonname) : 0);
489 if (sockAddr != &IP.Addr) {delete unixPipe; sockAddr = &IP.Addr;}
490 IP.v6.sin6_port = htons(static_cast<short>(Port));
491 sockNum = 0;
492 return 0;
493}

References XrdNetSockAddr::Addr, XrdNetAddrInfo::addrSize, XrdNetAddrInfo::hostName, XrdNetAddrInfo::IP, XrdNetAddrInfo::Port(), XrdNetAddrInfo::protType, XrdNetAddrInfo::sockNum, and XrdNetSockAddr::v6.

+ Here is the call graph for this function:

◆ SetCache()

void XrdNetAddr::SetCache ( int keeptime)
static

Set the cache time for address to name resolutions. This method should only be called during initialization time. The default is to not use the cache.

Definition at line 499 of file XrdNetAddr.cc.

500{
501 static XrdNetCache theCache;
502
503// Set the cache keep time
504//
505 theCache.SetKT(keeptime);
506 dnsCache = (keeptime > 0 ? &theCache : 0);
507}
static XrdNetCache * dnsCache
XrdOucCache * theCache

References XrdNetAddrInfo::dnsCache.

Referenced by XrdConfig::XrdConfig().

+ Here is the caller graph for this function:

◆ SetDialect()

void XrdNetAddr::SetDialect ( const char * dP)
inline

Set the dialect being spoken on this network link.

Parameters
dPPointer to the dialect name. It must be permanently stable.

Definition at line 205 of file XrdNetAddr.hh.

205{protName = dP;}
const char * protName

References XrdNetAddrInfo::protName.

Referenced by XrdHttpProtocol::Match(), and XrdLinkXeq::setProtName().

+ Here is the caller graph for this function:

◆ SetDynDNS()

void XrdNetAddr::SetDynDNS ( bool onoff)
static

Indicate whether or not dynamic DNS is being used. This method should only be called during initialization time. The default is fixed DNS.

Parameters
onoffTrue if dynamic DNS is being used, false otherwise.

Definition at line 513 of file XrdNetAddr.cc.

513{dynDNS = onoff;}

◆ SetIPV4()

void XrdNetAddr::SetIPV4 ( )
static

Force this object to work in IPV4 mode only. This method permanently sets IPV4 mode which cannot be undone without a restart. It is meant to bypass broken IPV6 stacks on those unfortunate hosts that have one. It should be called before any other calls to this object (e.g. initialization time).

Definition at line 519 of file XrdNetAddr.cc.

520{
521
522// To force IPV4 mode we merely change the hints structure and set the IPV4
523// mode flag to reject IPV6 address unless they are mapped.
524//
525 hostHints->ai_flags = AI_CANONNAME;
526 hostHints->ai_family = AF_INET;
527
528 huntHintsTCP->ai_flags = AI_ADDRCONFIG;
529 huntHintsTCP->ai_family = AF_INET;
530
531 huntHintsUDP->ai_flags = AI_ADDRCONFIG;
532 huntHintsUDP->ai_family = AF_INET;
533
534 useIPV4 = true;
535
536// Inform NetUtils that we changed mode
537//
539}
static int SetAuto(AddrOpts aOpts=allIPMap)

References XrdNetUtils::onlyIPv4, and XrdNetUtils::SetAuto().

Referenced by XrdConfig::Configure().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ SetIPV6()

void XrdNetAddr::SetIPV6 ( )
static

Force this object to work in IPV6 mode using IPV6 or mapped IPV4 addresses. This method permanently sets IPV6 mode which cannot be undone without a restart. It is meant to disable the default mode which determines which address to use based on which address types are configured on the host (i.e. getaddrinfo() with hints AI_ADDRCONFIG|AI_V4MAPPED).

Definition at line 545 of file XrdNetAddr.cc.

546{
547
548// To force IPV6 mode we merely change the hints structure and set the IPV4
549// mode flag to accept IPV6 address.
550//
551 hostHints->ai_flags = AI_V4MAPPED | AI_CANONNAME;
552 hostHints->ai_family = AF_INET6;
553
554 huntHintsTCP->ai_flags = AI_V4MAPPED | AI_ALL;
555 huntHintsTCP->ai_family = AF_INET6;
556
557 huntHintsUDP->ai_flags = AI_V4MAPPED | AI_ALL;
558 huntHintsUDP->ai_family = AF_INET6;
559
560 useIPV4 = false;
561
562// Inform NetUtils that we changed mode
563//
565}

References XrdNetUtils::allIPMap, and XrdNetUtils::SetAuto().

Referenced by XrdConfig::Configure().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ SetLocation()

void XrdNetAddr::SetLocation ( XrdNetAddrInfo::LocInfo & loc)

Set the location for this address

Parameters
locpointer to the structure that describes the location. See XrdnetAddrInfo for the definition of the stucture.

Definition at line 571 of file XrdNetAddr.cc.

572{
573// Copy in the new location information but preserve the flags
574//
575 addrLoc = loc;
576}

References XrdNetAddrInfo::addrLoc.

Referenced by XrdLinkXeq::setLocation().

+ Here is the caller graph for this function:

◆ SetTLS()

void XrdNetAddr::SetTLS ( bool val)

Set the location's TLS state.

Parameters
valTrue if TLS is being used, false otherwise.

Definition at line 582 of file XrdNetAddr.cc.

583{
584 if (val) protFlgs |= isTLS;
585 else protFlgs &= ~isTLS;
586}
unsigned char protFlgs
static const char isTLS
Location using TLS.

References XrdNetAddrInfo::isTLS, and XrdNetAddrInfo::protFlgs.

Referenced by XrdHttpProtocol::Match(), and XrdLinkXeq::setTLS().

+ Here is the caller graph for this function:

Member Data Documentation

◆ PortInSpec

const int XrdNetAddr::PortInSpec = (int)0x80000000
static

Set the IP address and possibly the port number.

Parameters
hSpec0 -> address is set to in6addr_any for binding via bind() (INADDR_ANY in IPV4 mode). !0 -> convert specification to an address. Valid formats: IPv4: nnn.nnn.nnn.nnn[:<port>] IPv6: [ipv6_addr][:<port>] addr brackets required IPvx: name[:port] x is determined by getaddrinfo() Unix: /<path>
pNum>= 0 uses the value as the port number regardless of what is in hSpec, should it be supplied. However, if is present, it must be a valid port number or name. < 0 uses the positive value as the port number if the port number has not been specified in hSpec. **** When set to PortInSpec(the default, see below) the port number/name must be specified in hSpec. If it is not, an error is returned.
Returns
Success: 0. Failure: Error message text describing the error. The message is in persistent storage and cannot be modified.

Definition at line 112 of file XrdNetAddr.hh.

Referenced by XrdNetUtils::Hosts(), XrdNetSocket::Open(), Set(), and Set().


The documentation for this class was generated from the following files: