XRootD
XrdCmsParser Class Reference

#include <XrdCmsParser.hh>

+ Collaboration diagram for XrdCmsParser:

Public Member Functions

 XrdCmsParser ()
 
 ~XrdCmsParser ()
 
int Parse (int rnum, const char *Aps, const char *Apt, XrdCmsRRData *Data)
 
int Parse (XrdCms::CmsLoginData *Data, const char *Aps, const char *Apt)
 

Static Public Member Functions

static int Decode (const char *Man, XrdCms::CmsRRHdr &hdr, XrdOucBuffer *dBuff, XrdOucErrInfo *eInfo)
 
static int mapError (const char *ecode)
 
static int mapError (int ecode)
 
static int Pack (int rnum, struct iovec *iovP, struct iovec *iovE, char *Base, char *Work)
 
static XrdOucPupArgsPupArgs (int rnum)
 

Static Public Attributes

static XrdOucPup Pup
 

Detailed Description

Definition at line 45 of file XrdCmsParser.hh.

Constructor & Destructor Documentation

◆ XrdCmsParser()

XrdCmsParser::XrdCmsParser ( )

Definition at line 254 of file XrdCmsParser.cc.

255 {
256  static int Done = 0;
257 
258 // Setup the Parse vector
259 //
260  if (!Done)
261  {vecArgs[kYR_login] = logArgs;
262  vecArgs[kYR_chmod] = fwdArgA;
263  vecArgs[kYR_locate] = locArgs;
264  vecArgs[kYR_mkdir] = fwdArgA;
265  vecArgs[kYR_mkpath] = fwdArgA;
266  vecArgs[kYR_mv] = fwdArgB;
267  vecArgs[kYR_prepadd] = padArgs;
268  vecArgs[kYR_prepdel] = pdlArgs;
269  vecArgs[kYR_rm] = fwdArgC;
270  vecArgs[kYR_rmdir] = fwdArgC;
271  vecArgs[kYR_select] = locArgs;
272  vecArgs[kYR_rm] = fwdArgC;
273  vecArgs[kYR_statfs] = pthArgs;
274  vecArgs[kYR_avail] = avlArgs;
275  vecArgs[kYR_gone] = pthArgs;
276  vecArgs[kYR_trunc] = fwdArgA;
277  vecArgs[kYR_try] = pthArgs;
278  vecArgs[kYR_have] = pthArgs;
279  vecArgs[kYR_load] = lodArgs;
280  vecArgs[kYR_state] = pthArgs;
281  Done = 1;
282  }
283 }
@ kYR_select
Definition: YProtocol.hh:100
@ kYR_mkpath
Definition: YProtocol.hh:94
@ kYR_prepdel
Definition: YProtocol.hh:97
@ kYR_statfs
Definition: YProtocol.hh:111
@ kYR_login
Definition: YProtocol.hh:90
@ kYR_prepadd
Definition: YProtocol.hh:96
@ kYR_chmod
Definition: YProtocol.hh:91
@ kYR_try
Definition: YProtocol.hh:114
@ kYR_rmdir
Definition: YProtocol.hh:99
@ kYR_mkdir
Definition: YProtocol.hh:93
@ kYR_state
Definition: YProtocol.hh:110
@ kYR_locate
Definition: YProtocol.hh:92
@ kYR_have
Definition: YProtocol.hh:105
@ kYR_rm
Definition: YProtocol.hh:98
@ kYR_gone
Definition: YProtocol.hh:104
@ kYR_trunc
Definition: YProtocol.hh:113
@ kYR_mv
Definition: YProtocol.hh:95
@ kYR_load
Definition: YProtocol.hh:106
@ kYR_avail
Definition: YProtocol.hh:102

References XrdCms::kYR_avail, XrdCms::kYR_chmod, XrdCms::kYR_gone, XrdCms::kYR_have, XrdCms::kYR_load, XrdCms::kYR_locate, XrdCms::kYR_login, XrdCms::kYR_mkdir, XrdCms::kYR_mkpath, XrdCms::kYR_mv, XrdCms::kYR_prepadd, XrdCms::kYR_prepdel, XrdCms::kYR_rm, XrdCms::kYR_rmdir, XrdCms::kYR_select, XrdCms::kYR_state, XrdCms::kYR_statfs, XrdCms::kYR_trunc, and XrdCms::kYR_try.

◆ ~XrdCmsParser()

XrdCmsParser::~XrdCmsParser ( )
inline

Definition at line 81 of file XrdCmsParser.hh.

81 {}

Member Function Documentation

◆ Decode()

int XrdCmsParser::Decode ( const char *  Man,
XrdCms::CmsRRHdr hdr,
XrdOucBuffer dBuff,
XrdOucErrInfo eInfo 
)
static

Definition at line 291 of file XrdCmsParser.cc.

293 {
294  EPNAME("Decode");
295  static const int mvsz = static_cast<int>(sizeof(kXR_unt32));
296  kXR_unt32 uval;
297  int Result, msgval, msglen, dlen = dBuff->DataLen();
298  const char *Path = eInfo->getErrData(), *User = eInfo->getErrUser();
299  const char *Mgr = (Man ? Man : "?");
300  char *msg, *data = dBuff->Buffer();
301 
302 // Path may be null here, fix it
303 //
304  if (!Path) Path = "";
305 
306 // Responses are always in the form of <int><string>
307 //
308  if (dlen < mvsz) {msgval = 0; msg = (char *)""; msglen = 0;}
309  else {memcpy(&uval, data, mvsz);
310  msgval = static_cast<int>(ntohl(uval));
311  if (dlen == mvsz) {msg = (char *)""; msglen = 0;}
312  else {msg = data+mvsz; msglen = dlen - mvsz;}
313  }
314 
315 // Now decode the response code
316 //
317  switch(hdr.rrCode)
318 
319  {case kYR_redirect: Result = SFS_REDIRECT;
320  TRACE(Redirect, Mgr <<" redirects " <<User <<" to "
321  <<msg <<':' <<msgval <<' ' <<Path);
322  break;
323  case kYR_wait: Result = SFS_STALL;
324  TRACE(Redirect, Mgr <<" delays " <<User <<' ' <<msgval <<' ' <<Path);
325  break;
326  case kYR_waitresp: Result = SFS_STARTED;
327  TRACE(Redirect, Mgr <<" idles " <<User <<' ' <<msgval <<' ' <<Path);
328  break;
329  case kYR_data: Result = SFS_DATA; msgval = msglen;
330  TRACE(Redirect, Mgr <<" sent " <<User <<" '" <<msg <<"' " <<Path);
331  if (msglen > (int)XrdOucEI::Max_Error_Len)
333  if (myBuff)
334  {myBuff->SetLen(msglen, (msglen ? mvsz : 0));
335  eInfo->setErrInfo(msglen, myBuff);
336  return Result;
337  }
338  }
339  break;
340  case kYR_error: Result = SFS_ERROR;
341  if (msgval) msgval = -mapError(msgval);
342  TRACE(Redirect, Mgr <<" gave " <<User <<" err " <<msgval
343  <<" '" <<msg <<"' " <<Path);
344  break;
345  default: msgval=0; Result = SFS_ERROR;
346  msg = (char *)"Redirector protocol error";
347  TRACE(Redirect, User <<" given error msg '"
348  <<msg <<"' due to " << Mgr <<' ' <<Path);
349  }
350 
351 // Insert the information into the error object
352 //
353  eInfo->setErrInfo(msgval, msg);
354  return Result;
355 }
unsigned int kXR_unt32
Definition: XPtypes.hh:90
#define EPNAME(x)
Definition: XrdBwmTrace.hh:56
XrdOucString Path
#define SFS_DATA
#define SFS_ERROR
#define SFS_REDIRECT
#define SFS_STALL
#define SFS_STARTED
#define TRACE(act, x)
Definition: XrdTrace.hh:63
static int mapError(const char *ecode)
char * Buffer() const
XrdOucBuffer * Highjack(int bPsz=0)
void SetLen(int dataL, int dataO=0)
const char * getErrData()
int setErrInfo(int code, const char *emsg)
const char * getErrUser()
@ kYR_data
Definition: YProtocol.hh:141
@ kYR_redirect
Definition: YProtocol.hh:143
@ kYR_wait
Definition: YProtocol.hh:144
@ kYR_waitresp
Definition: YProtocol.hh:145
@ kYR_error
Definition: YProtocol.hh:142
kXR_char rrCode
Definition: YProtocol.hh:84
static const size_t Max_Error_Len

References XrdOucBuffer::Buffer(), XrdOucBuffer::DataLen(), EPNAME, XrdOucErrInfo::getErrData(), XrdOucErrInfo::getErrUser(), XrdOucBuffer::Highjack(), XrdCms::kYR_data, XrdCms::kYR_error, XrdCms::kYR_redirect, XrdCms::kYR_wait, XrdCms::kYR_waitresp, XrdOucEI::Max_Error_Len, Path, XrdCms::CmsRRHdr::rrCode, XrdOucErrInfo::setErrInfo(), XrdOucBuffer::SetLen(), SFS_DATA, SFS_ERROR, SFS_REDIRECT, SFS_STALL, SFS_STARTED, and TRACE.

Referenced by XrdCmsClientMsg::Reply().

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

◆ mapError() [1/2]

int XrdCmsParser::mapError ( const char *  ecode)
static

Definition at line 361 of file XrdCmsParser.cc.

362 {
363  if (!strcmp("ENOENT", ecode)) return ENOENT;
364  if (!strcmp("EEXIST", ecode)) return EEXIST;
365  if (!strcmp("EPERM", ecode)) return EPERM;
366  if (!strcmp("EACCES", ecode)) return EACCES;
367  if (!strcmp("EIO", ecode)) return EIO;
368  if (!strcmp("ENOMEM", ecode)) return ENOMEM;
369  if (!strcmp("ENOSPC", ecode)) return ENOSPC;
370  if (!strcmp("ENAMETOOLONG", ecode)) return ENAMETOOLONG;
371  if (!strcmp("ENETUNREACH", ecode)) return ENETUNREACH;
372  if (!strcmp("ENOTBLK", ecode)) return ENOTBLK;
373  if (!strcmp("EISDIR", ecode)) return EISDIR;
374  return EINVAL;
375 }

◆ mapError() [2/2]

int XrdCmsParser::mapError ( int  ecode)
static

Definition at line 377 of file XrdCmsParser.cc.

378 {
379  switch(ecode)
380  {case kYR_ENOENT: return ENOENT;
381  case kYR_EPERM: return EPERM;
382  case kYR_EACCES: return EACCES;
383  case kYR_EIO: return EIO;
384  case kYR_ENOMEM: return ENOMEM;
385  case kYR_ENOSPC: return ENOSPC;
386  case kYR_ENAMETOOLONG: return ENAMETOOLONG;
387  case kYR_ENETUNREACH: return ENETUNREACH;
388  case kYR_ENOTBLK: return ENOTBLK;
389  case kYR_EISDIR: return EISDIR;
390  case kYR_FSError: return ENODEV;
391  case kYR_SrvError: return EFAULT;
392  case kYR_RWConflict: return EEXIST;
393  case kYR_noReplicas: return EADDRNOTAVAIL;
394  default: return EINVAL;
395  }
396 }
@ kYR_ENAMETOOLONG
Definition: YProtocol.hh:157
@ kYR_FSError
Definition: YProtocol.hh:161
@ kYR_ENOSPC
Definition: YProtocol.hh:156
@ kYR_ENETUNREACH
Definition: YProtocol.hh:158
@ kYR_EACCES
Definition: YProtocol.hh:152
@ kYR_noReplicas
Definition: YProtocol.hh:164
@ kYR_EIO
Definition: YProtocol.hh:154
@ kYR_ENOMEM
Definition: YProtocol.hh:155
@ kYR_ENOENT
Definition: YProtocol.hh:150
@ kYR_SrvError
Definition: YProtocol.hh:162
@ kYR_EISDIR
Definition: YProtocol.hh:160
@ kYR_EPERM
Definition: YProtocol.hh:151
@ kYR_ENOTBLK
Definition: YProtocol.hh:159
@ kYR_RWConflict
Definition: YProtocol.hh:163

References XrdCms::kYR_EACCES, XrdCms::kYR_EIO, XrdCms::kYR_EISDIR, XrdCms::kYR_ENAMETOOLONG, XrdCms::kYR_ENETUNREACH, XrdCms::kYR_ENOENT, XrdCms::kYR_ENOMEM, XrdCms::kYR_ENOSPC, XrdCms::kYR_ENOTBLK, XrdCms::kYR_EPERM, XrdCms::kYR_FSError, XrdCms::kYR_noReplicas, XrdCms::kYR_RWConflict, and XrdCms::kYR_SrvError.

◆ Pack()

int XrdCmsParser::Pack ( int  rnum,
struct iovec *  iovP,
struct iovec *  iovE,
char *  Base,
char *  Work 
)
static

Definition at line 402 of file XrdCmsParser.cc.

404 {
405  XrdOucPupArgs *PArgs;
406  const char *reason;
407  char buff[16];
408  int iovcnt;
409 
410 // Pack the request
411 //
412  if ((PArgs = PupArgs(rnum)))
413  if ((iovcnt = Pup.Pack(iovP, iovE, PArgs, Base, Work))) return iovcnt;
414  else reason = "too much data for code";
415  else reason = "invalid request code -";
416 
417 // Indicate failure (we don't translate the request code as it drags in too
418 // many dependent object files, sigh.
419 //
420  sprintf(buff, "%d", rnum);
421  Say.Emsg("Pack", "Unable to pack request;", reason, buff);
422  return 0;
423 }
XrdOucPup XrdCmsParser::Pup & Say
static XrdOucPupArgs * PupArgs(int rnum)
Definition: XrdCmsParser.hh:77
static XrdOucPup Pup
Definition: XrdCmsParser.hh:75
static int Pack(struct iovec **, const char *, unsigned short &buff)
Definition: XrdOucPup.cc:52

References XrdSysError::Emsg(), and XrdCms::Say.

Referenced by XrdCmsFinderRMT::Forward(), XrdCmsFinderRMT::Locate(), XrdCmsFinderRMT::Prepare(), and XrdCmsFinderRMT::Space().

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

◆ Parse() [1/2]

int XrdCmsParser::Parse ( int  rnum,
const char *  Aps,
const char *  Apt,
XrdCmsRRData Data 
)
inline

Definition at line 66 of file XrdCmsParser.hh.

68  {Data->Opaque = Data->Opaque2 = Data->Path = 0;
69  return rnum < XrdCms::kYR_MaxReq
70  && vecArgs[rnum] != 0
71  && Pup.Unpack(Aps, Apt,
72  vecArgs[rnum], (char *)Data);
73  }
char * Opaque2
Definition: XrdCmsRRData.hh:58
static int Unpack(char **buff, const char *bend, char **data, int &dlen)
Definition: XrdOucPup.cc:250
@ kYR_MaxReq
Definition: YProtocol.hh:118

References XrdCms::kYR_MaxReq, XrdCmsRRData::Opaque, XrdCmsRRData::Opaque2, XrdCmsRRData::Path, Pup, and XrdOucPup::Unpack().

+ Here is the call graph for this function:

◆ Parse() [2/2]

int XrdCmsParser::Parse ( XrdCms::CmsLoginData Data,
const char *  Aps,
const char *  Apt 
)
inline

Definition at line 59 of file XrdCmsParser.hh.

61  {Data->SID = Data->Paths = 0;
62  return Pup.Unpack(Aps,Apt,vecArgs[XrdCms::kYR_login],
63  (char *)Data);
64  }

References XrdCms::kYR_login, XrdCms::CmsLoginData::Paths, Pup, XrdCms::CmsLoginData::SID, and XrdOucPup::Unpack().

Referenced by XrdCmsLogin::Admit(), and XrdCmsLogin::Login().

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

◆ PupArgs()

static XrdOucPupArgs* XrdCmsParser::PupArgs ( int  rnum)
inlinestatic

Definition at line 77 of file XrdCmsParser.hh.

78  {return rnum < XrdCms::kYR_MaxReq ? vecArgs[rnum] : 0;}

References XrdCms::kYR_MaxReq.

Member Data Documentation

◆ Pup

XrdOucPup XrdCmsParser::Pup
static

Definition at line 75 of file XrdCmsParser.hh.

Referenced by Parse().


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