86#define DUMPIT(x,y) XrdSsiUtils::b2x(x,y,hexBuff,sizeof(hexBuff),dotBuff)<<dotBuff
100int Same(
unsigned long long arg1,
unsigned long long arg2) {
return 0;}
103virtual ~nullCallBack() {}
115int XrdSsiFileSess::freeNum = 0;
116int XrdSsiFileSess::freeNew = 0;
117int XrdSsiFileSess::freeMax = 100;
118int XrdSsiFileSess::freeAbs = 200;
120bool XrdSsiFileSess::authDNS =
false;
136 if ((fsP = freeList))
138 freeList = fsP->nextFree;
140 fsP->Init(einfo, user,
true);
143 if (freeMax <= freeAbs && freeNew >= freeMax/2)
144 {freeMax += freeMax/2;
190 attnResp = (AttnResp *)mBuff;
191 memset(attnResp, 0,
sizeof(AttnResp));
197 attnResp->ioV[1].iov_base = mBuff+offsetof(
struct AttnResp, aHdr);
203 {attnResp->ioV[2].iov_base = (
void *)respP->
mdata;
204 attnResp->ioV[2].iov_len = respP->
mdlen; ioN = 3;
205 attnResp->aHdr.mdLen = htonl(respP->
mdlen);
208 {
char hexBuff[16],dotBuff[4];
209 DEBUG(reqID <<
':' <<gigID <<
' ' <<respP->
mdlen <<
" byte metadata (0x"
219 {attnResp->ioV[ioN].iov_base = (
void *)respP->buff;
220 attnResp->ioV[ioN].iov_len = respP->blen; ioN++;
229 if (doFin) rTab.
Del(reqID,
false);
250 const char *epname =
"close";
254 DEBUG((gigID ? gigID :
"???") <<
" del=" <<viaDel);
259 {
int rCnt = rTab.
Num();
270 {
if (oucBuff) {oucBuff->
Recycle(); oucBuff = 0;}
289 static const char *epname =
"fctl";
311 DEBUG(reqID <<
':' <<gigID <<
" query resp status");
315 if (!(rqstP = rTab.
LookUp(reqID)))
321 {
DEBUG(reqID <<
':' <<gigID <<
" resp ready");
328 DEBUG(reqID <<
':' <<gigID <<
" resp not ready");
339void XrdSsiFileSess::Init(
XrdOucErrInfo &einfo,
const char *user,
bool forReuse)
341 tident = (user ? strdup(user) : strdup(
""));
361bool XrdSsiFileSess::NewRequest(
unsigned int reqid,
375 rTab.
Add(reqP, reqid);
401 static const char *epname =
"open";
418 fileResource.
Init(path, theEnv, authDNS);
423 {
const char *usr = fileResource.
rUser.c_str();
424 if (!(*usr)) gigID = strdup(path);
425 else {
char gBuff[2048];
426 snprintf(gBuff,
sizeof(gBuff),
"%s:%s", usr, path);
427 gigID = strdup(gBuff);
429 DEBUG(gigID <<
" prepared.");
436 eText =
errInfo.Get(eNum).c_str();
438 {eNum = ENOMSG; eText =
"Provider returned invalid prepare response.";}
444 if (!eText || !(*eText))
break;
446 DEBUG(path <<
" --> " <<eText <<
':' <<eNum);
453 if (!eText || !(*eText)) eText =
"Provider is busy.";
454 DEBUG(path <<
" dly " <<eNum <<
' ' <<eText);
455 if (eNum <= 0) eNum = 1;
461 if (!eText || !(*eText)) eText =
XrdSysE2T(eNum);
462 DEBUG(path <<
" err " <<eNum <<
' ' <<eText);
471 Log.
Emsg(epname,
"Provider redirect returned no target host name!");
472 eInfo->
setErrInfo(ENOMSG,
"Server logic error");
496 static const char *epname =
"read";
500 unsigned int reqID = rInfo.
Id();
505 if (!(rqstP = rTab.
LookUp(reqID)))
506 {
if (eofVec.
IsSet(reqID))
507 {eofVec.
UnSet(reqID);
515 retval = rqstP->
Read(noMore, buff, blen);
547 if (freeNum < freeMax)
548 {nextFree = freeList;
562void XrdSsiFileSess::Reset()
567 if (isOpen)
close(
true);
572 if (fsUser) free(fsUser);
573 if (gigID) free(gigID);
584 static const char *epname =
"SendData";
587 unsigned int reqID = rInfo.
Id();
592 if (!(rqstP = rTab.
LookUp(reqID)))
597 rc = rqstP->
Send(sfDio, size);
621 static const char *epname =
"trunc";
625 unsigned int reqID = rInfo.
Id();
629 if (!(rqstP = rTab.
LookUp(reqID)))
630 {
if (eofVec.
IsSet(reqID))
631 {eofVec.
UnSet(reqID);
644 DEBUG(reqID <<
':' <<gigID <<
" cancelled");
672 static const char *epname =
"write";
674 unsigned int reqID = rInfo.
Id();
680 if (inProg)
return writeAdd(buff, blen, reqID);
690 reqPass = reqSize = rInfo.
Size();
692 {
if (reqSize || blen != 1)
695 }
else if (reqSize < 0 || reqSize >
maxRSZ)
705 DEBUG(reqID <<
':' <<gigID <<
" rsz=" <<reqSize <<
" wsz=" <<blen);
710 if (reqSize == blen && xioP)
714 else {
if (!NewRequest(reqID, 0, bRef, reqPass))
727 reqLeft = reqSize - blen;
728 memcpy(oucBuff->
Data(), buff, blen);
730 {oucBuff->
SetLen(reqSize);
732 if (!NewRequest(reqID, oucBuff, 0, reqPass))
735 }
else oucBuff->
SetLen(blen, blen);
760 static const char *epname =
"writeAdd";
770 memcpy(oucBuff->
Data(dlen), buff, blen);
775 DEBUG(rid <<
':' <<gigID <<
" rsz=" <<reqLeft <<
" wsz=" <<blen);
781 {oucBuff->
SetLen(reqSize);
782 if (!NewRequest(rid, oucBuff, 0, reqSize))
787 oucBuff->
SetLen(dlen, dlen);
long long XrdSfsFileOffset
class XrdBuffer * XrdSfsXioHandle
const char * XrdSysE2T(int errcode)
XrdOucBuffer * Alloc(int sz)
void Recycle()
Recycle the buffer. The buffer may be reused in the future.
void SetLen(int dataL, int dataO=0)
virtual void Done(int &Result, XrdOucErrInfo *eInfo, const char *Path=0)=0
virtual int Same(unsigned long long arg1, unsigned long long arg2)=0
char * getMsgBuff(int &mblen)
void setErrCB(XrdOucEICB *cb, unsigned long long cbarg=0)
int setErrInfo(int code, const char *emsg)
virtual XrdSfsXioHandle Claim(const char *curBuff, int datasz, int minasz)=0
bool IsSet(uint32_t bval)
void UnSet(uint32_t bval)
bool WantResponse(XrdOucErrInfo &eInfo)
XrdSfsXferSize Read(bool &done, char *buffer, XrdSfsXferSize blen)
int Send(XrdSfsDio *sfDio, XrdSfsXferSize size)
static XrdSsiFileReq * Alloc(XrdOucErrInfo *eP, XrdSsiFileResource *rP, XrdSsiFileSess *fP, const char *sn, const char *id, unsigned int rnum)
void Activate(XrdOucBuffer *oP, XrdSfsXioHandle bR, int rSz)
void Init(const char *path, XrdOucEnv &envP, bool aDNS)
int fctl(const int cmd, int alen, const char *args, const XrdSecEntity *client)
int open(const char *fileName, XrdOucEnv &theEnv, XrdSfsFileOpenMode openMode)
int close(bool viaDel=false)
XrdSfsXferSize write(XrdSfsFileOffset fileOffset, const char *buffer, XrdSfsXferSize buffer_size)
bool AttnInfo(XrdOucErrInfo &eInfo, const XrdSsiRespInfo *respP, unsigned int reqID)
XrdSfsXferSize read(XrdSfsFileOffset fileOffset, char *buffer, XrdSfsXferSize buffer_size)
int truncate(XrdSfsFileOffset fileOffset)
XrdOucErrInfo * errInfo()
int SendData(XrdSfsDio *sfDio, XrdSfsFileOffset offset, XrdSfsXferSize size)
static XrdSsiFileSess * Alloc(XrdOucErrInfo &einfo, const char *user)
void Size(unsigned int sz)
T * LookUp(uint64_t itemID)
void Add(T *item, uint64_t itemID)
void Del(uint64_t itemID, bool finit=false)
std::string rUser
-> Name of the resource user (nil if anonymous)
static const int MaxDirectXfr
virtual bool Prepare(XrdSsiErrInfo &eInfo, const XrdSsiResource &rDesc)
Prepare for processing subsequent resource request.
static int Emsg(const char *pfx, int ecode, const char *op, const char *path, XrdOucErrInfo &eDest)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdSsiProvider * Provider
XrdOucBuffPool * BuffPool
static const int fullResp
static const int pendResp
int mdlen
Metadata length.
const char * mdata
-> Metadata about response.