XRootD
XrdProtLoad Class Reference

#include <XrdProtLoad.hh>

+ Inheritance diagram for XrdProtLoad:
+ Collaboration diagram for XrdProtLoad:

Public Member Functions

 XrdProtLoad (int port=-1)
 
 ~XrdProtLoad ()
 
void DoIt ()
 
XrdProtocolMatch (XrdLink *)
 
int Process (XrdLink *lp)
 
void Recycle (XrdLink *lp, int ctime, const char *txt)
 
int Stats (char *buff, int blen, int do_sync=0)
 
- Public Member Functions inherited from XrdProtocol
 XrdProtocol (const char *jname)
 
virtual ~XrdProtocol ()
 
- Public Member Functions inherited from XrdJob
 XrdJob (const char *desc="")
 
virtual ~XrdJob ()
 

Static Public Member Functions

static int Load (const char *lname, const char *pname, char *parms, XrdProtocol_Config *pi, bool istls)
 
static int Port (const char *lname, const char *pname, char *parms, XrdProtocol_Config *pi)
 
static void Port (int protIdx, int port, bool isTLS)
 
static int Statistics (char *buff, int blen, int do_sync=0)
 

Static Public Attributes

static const int PortoMax = 8
 
static const int ProtoMax = 8
 

Additional Inherited Members

- Public Attributes inherited from XrdJob
const char * Comment
 
XrdJobNextJob
 

Detailed Description

Definition at line 36 of file XrdProtLoad.hh.

Constructor & Destructor Documentation

◆ XrdProtLoad()

XrdProtLoad::XrdProtLoad ( int  port = -1)

Definition at line 80 of file XrdProtLoad.cc.

80  :
81  XrdProtocol("protocol loader"), myPort(port)
82 {
83  int j = 0;
84  bool hastls = false;
85 
86 // Extract out the protocols associated with this port
87 //
88  for (int i = 0; i < (int)portVec.size(); i++)
89  {if (myPort == portVec[i].port)
90  {if (portVec[i].protTLS) hastls = true;
91  else myProt[j++] = portVec[i].protIdx;
92  }
93  }
94 
95 // Setup to handle tls protocols
96 //
97  if (hastls)
98  {myProt[j++] = -1;
99  for (int i = 0; i < (int)portVec.size(); i++)
100  {if (myPort == portVec[i].port && portVec[i].protTLS)
101  myProt[j++] = portVec[i].protIdx;
102  }
103  }
104 
105 // Put in an end marker
106 //
107  myProt[j] = -2;
108 }
XrdProtocol(const char *jname)
Definition: XrdProtocol.hh:156

◆ ~XrdProtLoad()

XrdProtLoad::~XrdProtLoad ( )

Definition at line 110 of file XrdProtLoad.cc.

110 {}

Member Function Documentation

◆ DoIt()

void XrdProtLoad::DoIt ( )
inlinevirtual

Implements XrdJob.

Definition at line 40 of file XrdProtLoad.hh.

40 {}

◆ Load()

int XrdProtLoad::Load ( const char *  lname,
const char *  pname,
char *  parms,
XrdProtocol_Config pi,
bool  istls 
)
static

Definition at line 116 of file XrdProtLoad.cc.

118 {
119  XrdProtocol *xp;
120  int port = pi->Port;
121 
122 // Trace this load if so wanted
123 //
124  TRACE(DEBUG, "getting protocol object " <<pname);
125 
126 // First check to see that we haven't exceeded our protocol count
127 //
128  if (ProtoCnt >= ProtoMax)
129  {Log.Emsg("Protocol", "Too many protocols have been defined.");
130  return 0;
131  }
132 
133 // Obtain an instance of this protocol
134 //
135  xp = getProtocol(lname, pname, parms, pi);
136  if (!xp) {Log.Emsg("Protocol","Protocol", pname, "could not be loaded");
137  return 0;
138  }
139 
140 // Add protocol to our table of protocols.
141 //
142  ProtName[ProtoCnt] = strdup(pname);
143  Protocol[ProtoCnt] = xp;
144  ProtoCnt++;
145 
146 // Map the port to this protocol
147 //
148  Port(ProtoCnt, port, istls);
149  return ProtoCnt;
150 }
#define DEBUG(x)
Definition: XrdBwmTrace.hh:54
#define TRACE(act, x)
Definition: XrdTrace.hh:63
static int Port(const char *lname, const char *pname, char *parms, XrdProtocol_Config *pi)
Definition: XrdProtLoad.cc:156
static const int ProtoMax
Definition: XrdProtLoad.hh:63
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
XrdSysError Log
Definition: XrdConfig.cc:112

References DEBUG, XrdSysError::Emsg(), XrdGlobal::Log, Port(), XrdProtocol_Config::Port, ProtoMax, and TRACE.

+ Here is the call graph for this function:

◆ Match()

XrdProtocol* XrdProtLoad::Match ( XrdLink )
inlinevirtual

Implements XrdProtocol.

Definition at line 50 of file XrdProtLoad.hh.

50 {return 0;}

Referenced by Process().

+ Here is the caller graph for this function:

◆ Port() [1/2]

int XrdProtLoad::Port ( const char *  lname,
const char *  pname,
char *  parms,
XrdProtocol_Config pi 
)
static

Definition at line 156 of file XrdProtLoad.cc.

158 {
159  int port;
160 
161 // Obtain the port number to be used by this protocol
162 //
163  port = getProtocolPort(lname, pname, parms, pi);
164 
165 // Trace this call if so wanted
166 //
167  TRACE(DEBUG, "protocol " <<pname <<" wants to use port " <<port);
168 
169 // Make sure we can use the port
170 //
171  if (port < 0) Log.Emsg("Protocol","Protocol", pname,
172  "port number could not be determined");
173  return port;
174 }

References DEBUG, XrdSysError::Emsg(), XrdGlobal::Log, and TRACE.

Referenced by Load().

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

◆ Port() [2/2]

void XrdProtLoad::Port ( int  protIdx,
int  port,
bool  isTLS 
)
static

Definition at line 178 of file XrdProtLoad.cc.

179 {
180  if (protIdx > 0 && protIdx <= ProtoCnt && port > 0)
181  {portMap pMap(port, protIdx-1, isTLS);
182  portVec.push_back(pMap);
183  TRACE(DEBUG, "enabling " <<(isTLS ? "tls port " : "port ") <<port
184  <<" for protocol " <<ProtName[protIdx-1]);
185  } else {
186  char buff[256];
187  snprintf(buff, sizeof(buff), "prot=%d port=%d;", protIdx, port);
188  Log.Emsg("Protocol", "Invalid Port() parms:", buff, "port not mapped!");
189  }
190 }

References DEBUG, XrdSysError::Emsg(), XrdGlobal::Log, and TRACE.

+ Here is the call graph for this function:

◆ Process()

int XrdProtLoad::Process ( XrdLink lp)
virtual

Implements XrdProtocol.

Definition at line 196 of file XrdProtLoad.cc.

197 {
198  XrdProtocol *pp = 0;
199  signed char *pVec = myProt;
200  int i = 0;
201 
202 // Try to find a protocol match for this connection
203 //
204  while(*pVec != -2)
205  {if (*pVec == -1)
206  {if (!(lp->setTLS(true)))
207  {lp->setEtext("TLS negotiation failed.");
208  return -1;
209  }
210  } else {i = *pVec;
211  if ((pp = Protocol[i]->Match(lp))) break;
212  else if (lp->isFlawed()) return -1;
213  }
214  pVec++;
215  }
216 
217 // Verify that we have an actual protocol
218 //
219  if (!pp) {lp->setEtext("matching protocol not found"); return -1;}
220 
221 // Now attach the new protocol object to the link
222 //
223  lp->setProtocol(pp);
224  lp->setProtName(ProtName[i]);
225 
226 // Trace this load if so wanted
227 //
228  TRACE(DEBUG, "matched port " <<myPort <<" protocol " <<ProtName[i]);
229 
230 // Activate this link
231 //
232  if (!lp->Activate()) {lp->setEtext("activation failed"); return -1;}
233 
234 // Take a short-cut and process the initial request as a sticky request
235 //
236  return pp->Process(lp);
237 }
XrdProtocol * Match(XrdLink *)
Definition: XrdProtLoad.hh:50
virtual int Process(XrdLink *lp)=0

References XrdLink::Activate(), DEBUG, XrdLink::isFlawed(), Match(), XrdProtocol::Process(), XrdLink::setEtext(), XrdLink::setProtName(), XrdLink::setProtocol(), XrdLink::setTLS(), and TRACE.

+ Here is the call graph for this function:

◆ Recycle()

void XrdProtLoad::Recycle ( XrdLink lp,
int  ctime,
const char *  txt 
)
virtual

Implements XrdProtocol.

Definition at line 243 of file XrdProtLoad.cc.

244 {
245 
246 // Document non-protocol errors
247 //
248  if (lp && reason)
249  Log.Emsg("Protocol", lp->ID, "terminated", reason);
250 }

References XrdSysError::Emsg(), XrdLink::ID, and XrdGlobal::Log.

+ Here is the call graph for this function:

◆ Statistics()

int XrdProtLoad::Statistics ( char *  buff,
int  blen,
int  do_sync = 0 
)
static

Definition at line 256 of file XrdProtLoad.cc.

257 {
258  int i, k, totlen = 0;
259 
260  for (i = 0; i < ProtoCnt && (blen > 0 || !buff); i++)
261  {k = Protocol[i]->Stats(buff, blen, do_sync);
262  totlen += k; buff += k; blen -= k;
263  }
264 
265  return totlen;
266 }
virtual int Stats(char *buff, int blen, int do_sync=0)=0

References XrdProtocol::Stats().

+ Here is the call graph for this function:

◆ Stats()

int XrdProtLoad::Stats ( char *  buff,
int  blen,
int  do_sync = 0 
)
inlinevirtual

Implements XrdProtocol.

Definition at line 56 of file XrdProtLoad.hh.

56 {return 0;}

Member Data Documentation

◆ PortoMax

const int XrdProtLoad::PortoMax = 8
static

Definition at line 64 of file XrdProtLoad.hh.

Referenced by XrdConfigProt::AddPort().

◆ ProtoMax

const int XrdProtLoad::ProtoMax = 8
static

Definition at line 63 of file XrdProtLoad.hh.

Referenced by Load().


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