34 #include <arpa/inet.h>
35 #include <sys/types.h>
86 #define DUMPIT(x,y) XrdSsiUtils::b2x(x,y,hexBuff,sizeof(hexBuff),dotBuff)<<dotBuff
100 int Same(
unsigned long long arg1,
unsigned long long arg2) {
return 0;}
103 virtual ~nullCallBack() {}
115 int XrdSsiFileSess::freeNum = 0;
116 int XrdSsiFileSess::freeNew = 0;
117 int XrdSsiFileSess::freeMax = 100;
118 int XrdSsiFileSess::freeAbs = 200;
120 bool 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++;
231 if (!(rqstP = rTab.LookUp(reqID)))
235 attnFinCallBack.setReq(std::move(rqstP));
259 const char *epname =
"close";
263 DEBUG((gigID ? gigID :
"???") <<
" del=" <<viaDel);
268 {
int rCnt = rTab.Num();
279 {
if (oucBuff) {oucBuff->Recycle(); oucBuff = 0;}
298 static const char *epname =
"fctl";
320 DEBUG(reqID <<
':' <<gigID <<
" query resp status");
324 if (!(rqstP = rTab.LookUp(reqID)))
330 {
DEBUG(reqID <<
':' <<gigID <<
" resp ready");
337 DEBUG(reqID <<
':' <<gigID <<
" resp not ready");
338 fctlCallBack.setReq(std::move(rqstP));
340 eInfo->setErrCB(&fctlCallBack);
341 eInfo->setErrInfo(
respWT,
"");
350 void XrdSsiFileSess::Init(
XrdOucErrInfo &einfo,
const char *user,
bool forReuse)
352 tident = (user ? strdup(user) : strdup(
""));
372 bool XrdSsiFileSess::NewRequest(
unsigned int reqid,
416 static const char *epname =
"open";
433 fileResource.Init(path,
theEnv, authDNS);
438 {
const char *usr = fileResource.rUser.c_str();
439 if (!(*usr)) gigID = strdup(path);
440 else {
char gBuff[2048];
441 snprintf(gBuff,
sizeof(gBuff),
"%s:%s", usr, path);
442 gigID = strdup(gBuff);
444 DEBUG(gigID <<
" prepared.");
451 eText = errInfo.
Get(eNum).c_str();
453 {eNum = ENOMSG; eText =
"Provider returned invalid prepare response.";}
459 if (!eText || !(*eText))
break;
461 DEBUG(path <<
" --> " <<eText <<
':' <<eNum);
462 eInfo->setErrInfo(eNum, eText);
468 if (!eText || !(*eText)) eText =
"Provider is busy.";
469 DEBUG(path <<
" dly " <<eNum <<
' ' <<eText);
470 if (eNum <= 0) eNum = 1;
471 eInfo->setErrInfo(eNum, eText);
476 if (!eText || !(*eText)) eText =
XrdSysE2T(eNum);
477 DEBUG(path <<
" err " <<eNum <<
' ' <<eText);
478 eInfo->setErrInfo(eNum, eText);
486 Log.
Emsg(epname,
"Provider redirect returned no target host name!");
487 eInfo->setErrInfo(ENOMSG,
"Server logic error");
511 static const char *epname =
"read";
515 unsigned int reqID = rInfo.
Id();
520 if (!(rqstP = rTab.LookUp(reqID)))
521 {
if (eofVec.IsSet(reqID))
522 {eofVec.UnSet(reqID);
530 retval = rqstP->
Read(noMore, buff, blen);
535 {rTab.DelFinalize(std::move(rqstP));
561 if (freeNum < freeMax)
562 {nextFree = freeList;
576 void XrdSsiFileSess::Reset()
581 if (isOpen)
close(
true);
586 if (fsUser) free(fsUser);
587 if (gigID) free(gigID);
598 static const char *epname =
"SendData";
601 unsigned int reqID = rInfo.
Id();
606 if (!(rqstP = rTab.LookUp(reqID)))
611 rc = rqstP->
Send(sfDio, size);
616 else rTab.DelFinalize(std::move(rqstP));
634 static const char *epname =
"trunc";
638 unsigned int reqID = rInfo.
Id();
642 if (!(rqstP = rTab.LookUp(reqID)))
643 {
if (eofVec.IsSet(reqID))
644 {eofVec.UnSet(reqID);
657 DEBUG(reqID <<
':' <<gigID <<
" cancelled");
658 rTab.DelFinalize(std::move(rqstP));
684 static const char *epname =
"write";
686 unsigned int reqID = rInfo.
Id();
692 if (inProg)
return writeAdd(buff, blen, reqID);
696 if (rTab.LookUp(reqID))
702 reqPass = reqSize = rInfo.
Size();
704 {
if (reqSize || blen != 1)
707 }
else if (reqSize < 0 || reqSize >
maxRSZ)
717 DEBUG(reqID <<
':' <<gigID <<
" rsz=" <<reqSize <<
" wsz=" <<blen);
722 if (reqSize == blen && xioP)
726 else {
if (!NewRequest(reqID, 0, bRef, reqPass))
739 reqLeft = reqSize - blen;
740 memcpy(oucBuff->Data(), buff, blen);
742 {oucBuff->SetLen(reqSize);
744 if (!NewRequest(reqID, oucBuff, 0, reqPass))
747 }
else oucBuff->SetLen(blen, blen);
772 static const char *epname =
"writeAdd";
782 memcpy(oucBuff->Data(dlen), buff, blen);
787 DEBUG(rid <<
':' <<gigID <<
" rsz=" <<reqLeft <<
" wsz=" <<blen);
793 {oucBuff->SetLen(reqSize);
794 if (!NewRequest(rid, oucBuff, 0, reqSize))
799 oucBuff->SetLen(dlen, dlen);
long long XrdSfsFileOffset
class XrdBuffer * XrdSfsXioHandle
const char * XrdSysE2T(int errcode)
XrdOucBuffer * Alloc(int sz)
void setErrCB(XrdOucEICB *cb, unsigned long long cbarg=0)
int setErrInfo(int code, const char *emsg)
char * getMsgBuff(int &mblen)
void Reset()
Reset object to no message state. Call this method to release appendages.
const std::string & Get(int &eNum) const
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)
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)
int SendData(XrdSfsDio *sfDio, XrdSfsFileOffset offset, XrdSfsXferSize size)
static XrdSsiFileSess * Alloc(XrdOucErrInfo &einfo, const char *user)
void Size(unsigned int sz)
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.