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++;
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");
330 eInfo->setErrInfo(
respWT,
"");
339 void XrdSsiFileSess::Init(
XrdOucErrInfo &einfo,
const char *user,
bool forReuse)
341 tident = (user ? strdup(user) : strdup(
""));
361 bool 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);
447 eInfo->setErrInfo(eNum, eText);
453 if (!eText || !(*eText)) eText =
"Provider is busy.";
454 DEBUG(path <<
" dly " <<eNum <<
' ' <<eText);
455 if (eNum <= 0) eNum = 1;
456 eInfo->setErrInfo(eNum, eText);
461 if (!eText || !(*eText)) eText =
XrdSysE2T(eNum);
462 DEBUG(path <<
" err " <<eNum <<
' ' <<eText);
463 eInfo->setErrInfo(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;
562 void 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);
684 if (rTab.LookUp(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)
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.